@nyaruka/temba-components 0.129.11 → 0.130.1

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 (120) hide show
  1. package/CHANGELOG.md +13 -4
  2. package/demo/components/flow/example.html +5 -1
  3. package/demo/data/flows/sample-flow.json +144 -80
  4. package/dist/temba-components.js +290 -346
  5. package/dist/temba-components.js.map +1 -1
  6. package/out-tsc/src/flow/CanvasNode.js +3 -35
  7. package/out-tsc/src/flow/CanvasNode.js.map +1 -1
  8. package/out-tsc/src/flow/NodeEditor.js +44 -11
  9. package/out-tsc/src/flow/NodeEditor.js.map +1 -1
  10. package/out-tsc/src/flow/actions/add_contact_groups.js +14 -2
  11. package/out-tsc/src/flow/actions/add_contact_groups.js.map +1 -1
  12. package/out-tsc/src/flow/actions/add_contact_urn.js +1 -1
  13. package/out-tsc/src/flow/actions/add_contact_urn.js.map +1 -1
  14. package/out-tsc/src/flow/actions/add_input_labels.js +2 -1
  15. package/out-tsc/src/flow/actions/add_input_labels.js.map +1 -1
  16. package/out-tsc/src/flow/actions/remove_contact_groups.js +1 -1
  17. package/out-tsc/src/flow/actions/remove_contact_groups.js.map +1 -1
  18. package/out-tsc/src/flow/actions/send_email.js +9 -0
  19. package/out-tsc/src/flow/actions/send_email.js.map +1 -1
  20. package/out-tsc/src/flow/actions/send_msg.js +7 -8
  21. package/out-tsc/src/flow/actions/send_msg.js.map +1 -1
  22. package/out-tsc/src/flow/actions/set_contact_channel.js +25 -4
  23. package/out-tsc/src/flow/actions/set_contact_channel.js.map +1 -1
  24. package/out-tsc/src/flow/actions/set_contact_field.js +51 -1
  25. package/out-tsc/src/flow/actions/set_contact_field.js.map +1 -1
  26. package/out-tsc/src/flow/actions/set_contact_language.js +70 -2
  27. package/out-tsc/src/flow/actions/set_contact_language.js.map +1 -1
  28. package/out-tsc/src/flow/actions/set_contact_name.js +27 -2
  29. package/out-tsc/src/flow/actions/set_contact_name.js.map +1 -1
  30. package/out-tsc/src/flow/actions/set_contact_status.js +32 -2
  31. package/out-tsc/src/flow/actions/set_contact_status.js.map +1 -1
  32. package/out-tsc/src/flow/actions/set_run_result.js +13 -11
  33. package/out-tsc/src/flow/actions/set_run_result.js.map +1 -1
  34. package/out-tsc/src/flow/actions/split_by_expression_example.js +4 -4
  35. package/out-tsc/src/flow/actions/split_by_expression_example.js.map +1 -1
  36. package/out-tsc/src/flow/forms/index.js +2 -0
  37. package/out-tsc/src/flow/forms/index.js.map +1 -0
  38. package/out-tsc/src/flow/nodes/split_by_random.js +117 -0
  39. package/out-tsc/src/flow/nodes/split_by_random.js.map +1 -1
  40. package/out-tsc/src/flow/nodes/split_by_ticket.js +0 -1
  41. package/out-tsc/src/flow/nodes/split_by_ticket.js.map +1 -1
  42. package/out-tsc/src/flow/nodes/split_by_webhook.js +1 -3
  43. package/out-tsc/src/flow/nodes/split_by_webhook.js.map +1 -1
  44. package/out-tsc/src/flow/types.js.map +1 -1
  45. package/out-tsc/src/form/ArrayEditor.js +9 -25
  46. package/out-tsc/src/form/ArrayEditor.js.map +1 -1
  47. package/out-tsc/src/form/FieldRenderer.js +6 -64
  48. package/out-tsc/src/form/FieldRenderer.js.map +1 -1
  49. package/out-tsc/src/form/select/Select.js +35 -58
  50. package/out-tsc/src/form/select/Select.js.map +1 -1
  51. package/out-tsc/src/utils.js +3 -0
  52. package/out-tsc/src/utils.js.map +1 -1
  53. package/out-tsc/test/nodes/split_by_random.test.js +0 -6
  54. package/out-tsc/test/nodes/split_by_random.test.js.map +1 -1
  55. package/out-tsc/test/temba-field-renderer.test.js +6 -3
  56. package/out-tsc/test/temba-field-renderer.test.js.map +1 -1
  57. package/out-tsc/test/utils.test.js +18 -0
  58. package/out-tsc/test/utils.test.js.map +1 -1
  59. package/package.json +1 -1
  60. package/screenshots/truth/actions/add_contact_groups/editor/descriptive-group-names.png +0 -0
  61. package/screenshots/truth/actions/add_contact_groups/editor/long-group-names.png +0 -0
  62. package/screenshots/truth/actions/add_contact_groups/editor/many-groups.png +0 -0
  63. package/screenshots/truth/actions/add_contact_groups/editor/multiple-groups.png +0 -0
  64. package/screenshots/truth/actions/add_contact_groups/editor/single-group.png +0 -0
  65. package/screenshots/truth/actions/add_contact_groups/render/descriptive-group-names.png +0 -0
  66. package/screenshots/truth/actions/add_contact_groups/render/long-group-names.png +0 -0
  67. package/screenshots/truth/actions/add_contact_groups/render/many-groups.png +0 -0
  68. package/screenshots/truth/actions/add_contact_groups/render/multiple-groups.png +0 -0
  69. package/screenshots/truth/actions/add_contact_groups/render/single-group.png +0 -0
  70. package/screenshots/truth/actions/remove_contact_groups/editor/cleanup-groups.png +0 -0
  71. package/screenshots/truth/actions/remove_contact_groups/editor/long-descriptive-group-names.png +0 -0
  72. package/screenshots/truth/actions/remove_contact_groups/editor/many-groups.png +0 -0
  73. package/screenshots/truth/actions/remove_contact_groups/editor/multiple-groups.png +0 -0
  74. package/screenshots/truth/actions/remove_contact_groups/editor/remove-from-all-groups.png +0 -0
  75. package/screenshots/truth/actions/remove_contact_groups/editor/single-group.png +0 -0
  76. package/screenshots/truth/actions/remove_contact_groups/render/cleanup-groups.png +0 -0
  77. package/screenshots/truth/actions/remove_contact_groups/render/long-descriptive-group-names.png +0 -0
  78. package/screenshots/truth/actions/remove_contact_groups/render/many-groups.png +0 -0
  79. package/screenshots/truth/actions/remove_contact_groups/render/multiple-groups.png +0 -0
  80. package/screenshots/truth/actions/remove_contact_groups/render/remove-from-all-groups.png +0 -0
  81. package/screenshots/truth/actions/remove_contact_groups/render/single-group.png +0 -0
  82. package/screenshots/truth/editor/set_contact_language.png +0 -0
  83. package/screenshots/truth/editor/set_contact_name.png +0 -0
  84. package/screenshots/truth/editor/set_run_result.png +0 -0
  85. package/screenshots/truth/nodes/split_by_random/editor/ab-test-multiple-variants.png +0 -0
  86. package/screenshots/truth/nodes/split_by_random/editor/sampling-split.png +0 -0
  87. package/screenshots/truth/nodes/split_by_random/editor/three-way-split.png +0 -0
  88. package/screenshots/truth/nodes/split_by_random/editor/two-bucket-split.png +0 -0
  89. package/src/flow/CanvasNode.ts +2 -39
  90. package/src/flow/NodeEditor.ts +54 -13
  91. package/src/flow/actions/add_contact_groups.ts +17 -2
  92. package/src/flow/actions/add_contact_urn.ts +1 -1
  93. package/src/flow/actions/add_input_labels.ts +2 -1
  94. package/src/flow/actions/remove_contact_groups.ts +1 -1
  95. package/src/flow/actions/send_email.ts +11 -1
  96. package/src/flow/actions/send_msg.ts +20 -11
  97. package/src/flow/actions/set_contact_channel.ts +28 -5
  98. package/src/flow/actions/set_contact_field.ts +56 -2
  99. package/src/flow/actions/set_contact_language.ts +74 -3
  100. package/src/flow/actions/set_contact_name.ts +31 -3
  101. package/src/flow/actions/set_contact_status.ts +36 -3
  102. package/src/flow/actions/set_run_result.ts +13 -15
  103. package/src/flow/actions/split_by_expression_example.ts +4 -4
  104. package/src/flow/forms/index.ts +1 -0
  105. package/src/flow/nodes/split_by_random.ts +148 -0
  106. package/src/flow/nodes/split_by_ticket.ts +0 -1
  107. package/src/flow/nodes/split_by_webhook.ts +1 -3
  108. package/src/flow/types.ts +2 -1
  109. package/src/form/ArrayEditor.ts +6 -20
  110. package/src/form/FieldRenderer.ts +6 -65
  111. package/src/form/select/Select.ts +38 -66
  112. package/src/store/flow-definition.d.ts +6 -1
  113. package/src/utils.ts +4 -0
  114. package/static/api/fields.json +93 -1208
  115. package/static/api/workspace.json +23 -0
  116. package/test/nodes/split_by_random.test.ts +0 -7
  117. package/test/temba-field-renderer.test.ts +26 -13
  118. package/test/utils.test.ts +20 -0
  119. package/web-dev-server.config.mjs +2 -0
  120. package/web-test-runner.config.mjs +37 -0
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,OAAO,EAAE,IAAI,EAAkB,MAAM,UAAU,CAAC;AAIhD,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,EAAE,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;AAE1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAE3D,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAIzC,MAAM,CAAC,MAAM,WAAW,GACtB,gNAAgN,CAAC;AAgBnN,MAAM,CAAN,IAAY,KAKX;AALD,WAAY,KAAK;IACf,gCAAuB,CAAA;IACvB,iCAAwB,CAAA;IACxB,+BAAsB,CAAA;IACtB,kCAAyB,CAAA;AAC3B,CAAC,EALW,KAAK,KAAL,KAAK,QAKhB;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,OAAwB,EAAE,OAAO,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;IAC1E,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IACD,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,uCAAuC;AACvC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE;IACpD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAEnC,oBAAoB;QACpB,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAErB,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,UAAe,EAAE,EAAE,EAAE;IAC9C,IAAI,IAAI,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CACrC,4BAA4B,CACT,CAAC;QACtB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9D,6BAA6B;IAC7B,MAAM,MAAM,GAAI,MAAc,CAAC,MAAM,CAAC;IACtC,IAAI,MAAM,EAAE,CAAC;QACX,YAAY,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC;IACvC,CAAC;IAED,kBAAkB;IAClB,YAAY,CAAC,kBAAkB,CAAC,GAAG,gBAAgB,CAAC;IAEpD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACnC,oDAAoD;QACpD,IAAI,GAAG,KAAK,qBAAqB,EAAE,CAAC;YAClC,OAAO,YAAY,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QAED,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,GAAW,EACX,aAA8B,IAAI,EAClC,UAAqC,EAAE,EACjB,EAAE;IACxB,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,MAAM,OAAO,GAAG;YACd,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;SAC7B,CAAC;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;QACxC,CAAC;QAED,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC;aAChB,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjB,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBACpD,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE;gBACpC,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACxB,oCAAoC;gBACtC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC,CAAA,CAAC;gBAChB,OAAO,CAAC;oBACN,UAAU;oBACV,IAAI;oBACJ,IAAI;oBACJ,GAAG,EAAE,QAAQ,CAAC,GAAG;oBACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;iBACxB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAa,EAAU,EAAE;IAClD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,SAAiB,EAAE,EAAE;QAC7C,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;IACxB,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAAW,EACX,aAA8B,IAAI,EAClC,UAAqC,EAAE,EACjB,EAAE;IACxB,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC;aAC7B,IAAI,CAAC,CAAC,QAAqB,EAAE,EAAE;YAC9B,OAAO,CAAC;gBACN,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO;gBAC9B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI;aACzB,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,GAAW,EACX,UAAqC,EAAE,EACvB,EAAE;IAClB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,OAAO,GAAU,EAAE,CAAC;IACxB,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,OAAO,OAAO,EAAE,CAAC;QACf,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;IAC7B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAsB,EAAE;IAC9D,OAAO,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAChD,MAAM,CAAC,GAAG,CAAC;aACR,IAAI,CAAC,CAAC,QAAqB,EAAE,EAAE;YAC9B,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACpD,OAAO,CAAC;oBACN,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO;oBAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI;iBACzB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,QAAQ,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,GAAW,EAAoB,EAAE;IAC/D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,MAAM,GAAY,EAAE,CAAC;IACzB,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,OAAO,OAAO,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAYF,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,GAAW,EACX,OAAY,EACZ,UAAe,EAAE,EACjB,WAAW,GAAG,IAAI,EACI,EAAE;IACxB,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAEzC,IAAI,WAAW,EAAE,CAAC;QAChB,YAAY,CAAC,cAAc,CAAC,GAAG,WAAW,CAAC;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG;QACd,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,YAAY;QACrB,IAAI,EAAE,OAAO;KACd,CAAC;IAEF,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC;aAChB,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACvB,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBAC3B,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACtD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAU,CAAC;gBAChE,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YAED,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE;gBACpC,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACxB,oCAAoC;gBACtC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC,CAAA,CAAC;gBAChB,OAAO,CAAC;oBACN,IAAI;oBACJ,IAAI;oBACJ,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,GAAG,EAAE,QAAQ,CAAC,GAAG;iBAClB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,OAAY,EAAwB,EAAE;IAC1E,OAAO,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,GAAW,EACX,QAAkB,EAClB,UAAe,EAAE,EACK,EAAE;IACxB,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC;aAC5B,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjB,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACpD,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,KAAK,sBAAsB,EAAE,CAAC;oBACnC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,GAAW,EACX,OAAuB,EACvB,UAAe,EAAE,EACK,EAAE;IACxB,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,EAAE;QAC3C,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,OAAO,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF;GACG;AACH,MAAM,CAAC,MAAM,QAAQ,GACnB,CAAC,SAAwB,EAAE,EAAE,CAC7B,CAAC,IAA0B,EAAE,SAAgC,EAAE,EAAE;IAC/D,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA,EAAE,CAAC;AAC/D,CAAC,CAAC;AAEJ,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAuC,EAAE;IAC3E,MAAM,MAAM,GAAG,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrE,OAAO,MAAM;QACX,CAAC,CAAC;YACE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC1B,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC1B,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;SAC3B;QACH,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAAgB,EAQhB,EAAE;IACF,MAAM,IAAI,GAAG,GAAG,CAAC,qBAAqB,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC;IAC7E,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC;IAC3E,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,SAAS;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,UAAU;QAC5B,MAAM,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM;QAC9B,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,QAAgB,EAAE,MAAc,EAAE,EAAE;IACxE,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,EAAE,CAClD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,KAAK,EAAE,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,QAAgB,EAChB,YAAgD,EAChC,EAAE;IAClB,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,GAAG,GAAG,WAAW,CAAC;QACpC,YAAY,CACV,GAAG,CACJ,GAAG,gBAAgB,SAAS,KAAK,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;IAC/D,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAClD,mEAAmE;IACnE,OAAO,IAAI,CAAA,IAAI,WAAW,GAAG,CAAC;AAChC,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,IAAS;IAC1C,4BAA4B;IAC5B,MAAM,UAAU,GAAG,EAAE,CAAC;IAEtB,sCAAsC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE/B,sGAAsG;QACtG,IACE,CAAC,KAAK,CAAC,IAAI;YACX,KAAK,CAAC,QAAQ;YACd,KAAK,CAAC,IAAI,KAAK,MAAM;YACrB,KAAK,CAAC,IAAI,KAAK,OAAO;YACtB,KAAK,CAAC,IAAI,KAAK,QAAQ;YACvB,KAAK,CAAC,IAAI,KAAK,QAAQ;YAEvB,SAAS;QAEX,wCAAwC;QACxC,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ;oBAAE,SAAS;gBACzC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CACb,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC;wBAC5B,GAAG;wBACH,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAC7C,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,uCAAuC;aAClC,IACH,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;YACrD,KAAK,CAAC,OAAO,EACb,CAAC;YACD,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC5B,KAAK,GAAG,GAAG,CAAC;YACd,CAAC;YAED,IAAI,KAAK,EAAE,CAAC;gBACV,UAAU,CAAC,IAAI,CACb,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,CACjE,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAS,EAAO,EAAE;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,MAAM,YAAY,WAAW,CAAC;QAChD,MAAM,SAAS,GAAG,SAAS,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC;QACzE,MAAM,YAAY,GAChB,SAAS;YACT,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAEnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,YAAY,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACtE,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAO,EAAE,MAAY,EAAE,EAAE;IACxD,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC;IACjC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAElD,OAAO,GAAG,IAAI,UAAU,CAAC,GAAG;QAC1B,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG;QACzB,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,IAAI,CAAC;AAClB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;AACtB,MAAM,KAAK,GAAG,GAAG,GAAG,EAAE,CAAC;AAEvB,MAAM,OAAO,SAAS;IACb,cAAc;QACnB,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAEzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAoB,EAAE;IACxD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC9C,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAA,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;QACzC,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAA,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAA,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,IAAU,EACV,UAA6E;IAC3E,MAAM,EAAE,EAAE;CACX,EACD,EAAE;IACF,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACxD,MAAM,GAAG,GAAG,WAAW,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;IACtD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAExE,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;QACrB,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,WAAW,GAAG,GAAG,GAAG,MAAM,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,cAAc,IAAI,MAAM,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,WAAW,GAAG,IAAI,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC;IACrD,CAAC;IAED,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC;IACvD,CAAC;IAED,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC;IACtD,CAAC;IAED,IAAI,WAAW,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI;aACf,YAAY,EAAE;aACd,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;aACtB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACpB,MAAM,IAAI,GACR,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1E,OAAO,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC;IAClC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAU,EAAW,EAAE;IAC5C,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,eAAe,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,sBAAsB;IACtB,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACxC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,+BAA+B;IAC/B,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAO,EAAE,MAAc,EAAE,SAAS,GAAG,KAAK,EAAE,EAAE;IACrE,IAAI,OAAY,CAAC;IACjB,OAAO,UAAU,GAAG,IAAS;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,MAAM,KAAK,GAAG;YACZ,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,OAAO,CAAC;QACtC,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAO,EAAE,MAAc,EAAE,EAAE;IAClD,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,OAAO,UAAU,GAAG,IAAS;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,KAAK,GAAG,KAAK,CAAC;QACd,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACxB,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,GAAG,IAAI,CAAC;QACf,CAAC,EAAE,MAAM,CAAC,CAAC;IACb,CAAC,CAAC;AACJ,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,GAAW,EAAU,EAAE;IAC7D,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;IACzC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAY,EAAE,MAAM,GAAG,KAAK,EAAO,EAAE;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,4CAA4C;QAC5C,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,IAAI,CAAA,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,4CAA4C;IAC5C,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAkB,EAAE,GAAW,EAAE,EAAE;YACnD,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO,IAAI,CAAA,GAAG,EAAE,IAAI,CAAC;YACvB,CAAC;YACD,OAAO,IAAI,CAAA,GAAG,MAAM,IAAI,EAAE,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,KAAY,EACZ,EAAsB,EACtB,MAAM,GAAG,KAAK,EACT,EAAE;IACP,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAoB,EAAE,MAAM,GAAG,KAAK,EAAO,EAAE;IACvE,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAc,EAAU,EAAE;IAClD,OAAQ,MAAM,CAAC,WAAW,EAAiB,CAAC,IAAc,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,KAAU,EAAE,IAAI,GAAG,SAAS,EAAE,EAAE;IACtE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,4CAA4C;QAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvC,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACtD,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,KAAK,YAAY,GAAG,CAAC,WAAW,EAAE,SAAS,IAAI,EAAE,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE;IACxC,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,uDAAuD;YACvD,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;gBACvD,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBACpE,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE;IAC/C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,oCAAqB,CAAA;IACrB,gDAAiC,CAAA;IACjC,2DAA4C,CAAA;AAC9C,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,CAAC,KAAK,EAAE,GAAG,IAAI,CAAoB,EACnC,MAAM,GAAG,SAAS,CAAC,QAAQ,EAC3B,EAAE,CACF,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAE7E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAAa,EACb,YAAqB,EACb,EAAE;IACV,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,EACZ,EAAE,GAAG,YAAY,IAAI,CAAC,EACtB,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,kCAAkC;IACnE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,UAAU,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,UAAsB,EAAE,EAAE;IAC1D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC;IAC3D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAY,EAAE,EAAE;IACxC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,KAAK,CAAC,cAAc,EAAE,CAAC;IACzB,CAAC;AACH,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,EAAE;IAC9C,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEnB,wDAAwD;IACxD,2DAA2D;IAC3D,IAAI,KAAK,GACP,IAAI,CAAC,KAAK,CAAC,mDAAmD,CAAC,IAAI,EAAE,CAAC;IACxE,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACxC,CAAC;IAED,+EAA+E;IAC/E,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC;IACb,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC;IAED,iFAAiF;IACjF,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,KAAK,IAAI,CAAC,CACjD,CAAC;IACF,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3D,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAClC,CAAC,IAAI,GAAG,CAAC;IACT,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE;QACd,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;aAC3B,QAAQ,CAAC,EAAE,CAAC;aACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,0CAA0C;IACjE,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,MAAc,EAAU,EAAE;IACnE,iBAAiB;IACjB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAC3B,oDAAoD,CACrD,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACd,wCAAwC;QACxC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS;aACzB,KAAK,CAAC,CAAC,CAAC;aACR,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACrC,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/B,CAAC;IACD,SAAS;IACT,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,GAAG,GAAG,GAAG;iBACN,KAAK,CAAC,EAAE,CAAC;iBACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;iBACjB,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACzB,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;QAClB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/B,CAAC;IACD,WAAW;IACX,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAM5B,EAAE,EAAE;IACH,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACtB,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAChE,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IAC5D,CAAC;IAED,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,KAAK,GAAG,EAAE,CAAC;IAEf,aAAa;IACb,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACpC,KAAK,GAAG,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,+BAA+B,CAAC;IACnE,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAA;;wFAEmE,KAAK,CAAC,KAAK;QAC7F,CAAC;;;;;;;;;;;;;;;;yBAgBkB,KAAK;;UAEpB,QAAQ;QACR,CAAC,CAAC,IAAI,CAAA;;;oDAGoC,QAAQ;mBACzC;QACT,CAAC,CAAC,IAAI;;;GAGb,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,EAAE;IAC5B,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,CAAC;IACf,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,QAAgB,EAAE,EAAE;IAC1D,MAAc,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,IAAY,EAAU,EAAE;IAChE,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI;aACR,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,sBAAsB;aACtD,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,sBAAsB;aACtD,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,aAAa;aAC7C,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,sBAAsB;aAChD,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE;IAClD,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AAC5C,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE;IAClD,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,iDAAiD;AACjD,OAAO,EAAE,YAAY,EAAE,CAAC;AAgCxB,0EAA0E;AAC1E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,MAA4B,EAK5B,EAAE;IACF,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,GAC1E,MAAM,CAAC;IAET,yBAAyB;IACzB,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,gBAAgB;QACnC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,SAAS,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,YAAY,GAChB,gBAAgB,IAAI,aAAa;QAC/B,CAAC,CAAC,aAAa,CAAC,IAAI,CAChB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,KAAK,gBAAgB,CAAC,IAAI,CACzD;QACH,CAAC,CAAC,IAAI,CAAC;IAEX,0CAA0C;IAC1C,MAAM,YAAY,GAAG,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,KAAI,YAAY,EAAE,CAAC;IAC9D,MAAM,QAAQ,GAAG,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,KAAI,YAAY,EAAE,CAAC;IACtD,MAAM,QAAQ,GAAG,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,KAAI,YAAY,EAAE,CAAC;IAEtD,MAAM,QAAQ,GAAmB;QAC/B,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,QAAQ;KACpB,CAAC;IAEF,MAAM,IAAI,GAAe;QACvB,IAAI,EAAE,QAAQ;QACd,gBAAgB,EAAE,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,gBAAgB,KAAI,IAAI;KACzD,CAAC;IAEF,MAAM,MAAM,GAIR,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAEvB,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,GAAG;YACZ,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,aAAa,EAAE,YAAY;SAC5B,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,uFAAuF;AACvF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,OAAe,EACf,iBAAwD,EACxD,qBAA4B,EAAE,EAC9B,gBAAuB,EAAE,EACzB,gBAAuB,EAAE,EACzB,EAAE;IACF,MAAM,OAAO,GAAG,wBAAwB,CAAC;QACvC,IAAI,EAAE,SAAS;QACf,kBAAkB;QAClB,aAAa;QACb,aAAa;QACb,UAAU,EAAE,iBAAiB;KAC9B,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,wBAAwB,CAAC;QACvC,IAAI,EAAE,SAAS;QACf,kBAAkB;QAClB,aAAa;KACd,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE;YACN,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC;YAChD,qBAAqB,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;YAC5C,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;SAC1C;QACD,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;KACpC,CAAC;AACJ,CAAC,CAAC;AAEF,gFAAgF;AAChF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,OAAe,EACf,cAAwB,EACxB,iBAGC,EACD,qBAA4B,EAAE,EAC9B,gBAAuB,EAAE,EACzB,gBAAuB,EAAE,EACzB,EAAE;IACF,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,sBAAsB;IACtB,cAAc,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,wBAAwB,CAAC;YACtC,IAAI,EAAE,YAAY;YAClB,kBAAkB;YAClB,aAAa;YACb,aAAa;YACb,UAAU,EAAE,iBAAiB,CAAC,YAAY,CAAC;SAC5C,CAAC,CAAC;QAEH,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,iCAAiC;IACjC,MAAM,KAAK,GAAG,wBAAwB,CAAC;QACrC,IAAI,EAAE,OAAO;QACb,kBAAkB;QAClB,aAAa;KACd,CAAC,CAAC;IACH,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEvB,yBAAyB;IACzB,MAAM,OAAO,GAAG,wBAAwB,CAAC;QACvC,IAAI,EAAE,SAAS;QACf,kBAAkB;QAClB,aAAa;QACb,aAAa;QACb,UAAU,EAAE;YACV,IAAI,EAAE,eAAe;YACrB,SAAS,EAAE,CAAC,SAAS,CAAC;SACvB;KACF,CAAC,CAAC;IACH,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,MAAM,EAAE;YACN,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE,UAAU;YACtB,qBAAqB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;YAC1C,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,KAAK;SACb;QACD,KAAK,EAAE,KAAK;KACb,CAAC;AACJ,CAAC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-this-alias */\nimport { html, TemplateResult } from 'lit-html';\nimport { Button } from './display/Button';\nimport { Dialog } from './layout/Dialog';\nimport { Attachment, ContactField, Shortcut, Ticket, User } from './interfaces';\nimport ColorHash from 'color-hash';\nimport { Toast } from './display/Toast';\nimport { v4 as generateUUID } from 'uuid';\n\nexport const DEFAULT_MEDIA_ENDPOINT = '/api/v2/media.json';\n\nexport const colorHash = new ColorHash();\n\nexport type Asset = KeyedAsset & Ticket & ContactField & Shortcut;\n\nexport const DATE_FORMAT =\n /(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))/;\n\ninterface KeyedAsset {\n key?: string;\n}\n\ninterface AssetPage {\n assets: Asset[];\n next: string;\n}\n\nexport interface ResultsPage {\n results: any[];\n next: string;\n}\n\nexport enum Color {\n BLUE = 'color:#5078b5;',\n GREEN = 'color:#62bd6a;',\n RED = 'color:#e36049;',\n PURPLE = 'color:#a626a4;'\n}\n\nexport const log = (message: string | object, styling = '', details = []) => {\n if (styling === '') {\n // eslint-disable-next-line no-console\n console.log(message);\n return;\n }\n\n if (typeof message === 'object') {\n // eslint-disable-next-line no-console\n console.log('%c' + JSON.stringify(message, null, 2), styling);\n return;\n }\n // eslint-disable-next-line no-console\n console.log('%c' + message, styling, ...details);\n};\n\n/** Get the value for a named cookie */\nexport const getHTTPCookie = (name: string): string => {\n for (const cookie of document.cookie.split(';')) {\n const idx = cookie.indexOf('=');\n let key = cookie.substr(0, idx);\n let value = cookie.substr(idx + 1);\n\n // no spaces allowed\n key = key.trim();\n value = value.trim();\n\n if (key === name) {\n return value;\n }\n }\n return null;\n};\n\nexport const getHeaders = (headers: any = {}) => {\n let csrf = getHTTPCookie('csrftoken');\n if (!csrf) {\n const tokenEle = document.querySelector(\n '[name=csrfmiddlewaretoken]'\n ) as HTMLInputElement;\n if (tokenEle) {\n csrf = tokenEle.value;\n }\n }\n\n const fetchHeaders: any = csrf ? { 'X-CSRFToken': csrf } : {};\n\n // include the current org id\n const org_id = (window as any).org_id;\n if (org_id) {\n fetchHeaders['X-Temba-Org'] = org_id;\n }\n\n // mark us as ajax\n fetchHeaders['X-Requested-With'] = 'XMLHttpRequest';\n\n Object.keys(headers).forEach((key) => {\n // if we are adding a service org, we omit temba-org\n if (key === 'X-Temba-Service-Org') {\n delete fetchHeaders['X-Temba-Org'];\n }\n\n fetchHeaders[key] = headers[key];\n });\n return fetchHeaders;\n};\n\nexport const getUrl = (\n url: string,\n controller: AbortController = null,\n headers: { [key: string]: string } = {}\n): Promise<WebResponse> => {\n return new Promise<WebResponse>((resolve, reject) => {\n const options = {\n method: 'GET',\n headers: getHeaders(headers)\n };\n\n if (controller) {\n options['signal'] = controller.signal;\n }\n\n fetch(url, options)\n .then((response) => {\n if (response.status < 200 || response.status >= 300) {\n reject(response);\n return;\n }\n\n response.text().then((body: string) => {\n let json = {};\n try {\n json = JSON.parse(body);\n // eslint-disable-next-line no-empty\n } catch (err) {}\n resolve({\n controller,\n body,\n json,\n url: response.url,\n headers: response.headers,\n status: response.status\n });\n });\n })\n .catch((error) => {\n reject(error);\n });\n });\n};\n\nexport type ClassMap = {\n [className: string]: boolean;\n};\n\nexport const getClasses = (map: ClassMap): string => {\n const classNames: string[] = [];\n Object.keys(map).forEach((className: string) => {\n if (map[className]) {\n classNames.push(className);\n }\n });\n\n let result = classNames.join(' ');\n if (result.trim().length > 0) {\n result = ' ' + result;\n }\n return result.trim();\n};\n\nexport const fetchResultsPage = (\n url: string,\n controller: AbortController = null,\n headers: { [key: string]: string } = {}\n): Promise<ResultsPage> => {\n return new Promise<ResultsPage>((resolve, reject) => {\n getUrl(url, controller, headers)\n .then((response: WebResponse) => {\n resolve({\n results: response.json.results,\n next: response.json.next\n });\n })\n .catch((error) => {\n return reject(error);\n });\n });\n};\n\nexport const fetchResults = async (\n url: string,\n headers: { [key: string]: string } = {}\n): Promise<any[]> => {\n if (!url) {\n return new Promise<any[]>((resolve) => resolve([]));\n }\n\n let results: any[] = [];\n let pageUrl = url;\n while (pageUrl) {\n const resultsPage = await fetchResultsPage(pageUrl, null, headers);\n if (resultsPage.results) {\n results = results.concat(resultsPage.results);\n }\n pageUrl = resultsPage.next;\n }\n return results;\n};\n\nexport const getAssetPage = (url: string): Promise<AssetPage> => {\n return new Promise<AssetPage>((resolve, reject) => {\n getUrl(url)\n .then((response: WebResponse) => {\n if (response.status >= 200 && response.status < 300) {\n resolve({\n assets: response.json.results,\n next: response.json.next\n });\n } else {\n reject(response);\n }\n })\n .catch((error) => reject(error));\n });\n};\n\nexport const getAssets = async (url: string): Promise<Asset[]> => {\n if (!url) {\n return new Promise<Asset[]>((resolve) => resolve([]));\n }\n\n let assets: Asset[] = [];\n let pageUrl = url;\n while (pageUrl) {\n const assetPage = await getAssetPage(pageUrl);\n if (assetPage.assets) {\n assets = assets.concat(assetPage.assets);\n pageUrl = assetPage.next;\n } else {\n pageUrl = null;\n }\n }\n return assets;\n};\n\nexport interface WebResponse {\n json: any;\n body?: string;\n status: number;\n url?: string;\n headers: Headers;\n controller?: AbortController;\n redirected?: boolean;\n}\n\nexport const postUrl = (\n url: string,\n payload: any,\n headers: any = {},\n contentType = null\n): Promise<WebResponse> => {\n const fetchHeaders = getHeaders(headers);\n\n if (contentType) {\n fetchHeaders['Content-Type'] = contentType;\n }\n\n const options = {\n method: 'POST',\n headers: fetchHeaders,\n body: payload\n };\n\n return new Promise<WebResponse>((resolve, reject) => {\n fetch(url, options)\n .then(async (response) => {\n if (response.status >= 500) {\n reject(response);\n return;\n }\n\n const toasts = response.headers.get('X-Temba-Toasts');\n if (toasts) {\n const toastEle = document.querySelector('temba-toast') as Toast;\n if (toastEle) {\n toastEle.addMessages(JSON.parse(toasts));\n }\n }\n\n response.text().then((body: string) => {\n let json = {};\n try {\n json = JSON.parse(body);\n // eslint-disable-next-line no-empty\n } catch (err) {}\n resolve({\n body,\n json,\n headers: response.headers,\n status: response.status,\n redirected: response.redirected,\n url: response.url\n });\n });\n })\n .catch((error) => {\n reject(error);\n });\n });\n};\n\nexport const postJSON = (url: string, payload: any): Promise<WebResponse> => {\n return postUrl(url, JSON.stringify(payload), false, 'application/json');\n};\n\nexport const postFormData = (\n url: string,\n formData: FormData,\n headers: any = {}\n): Promise<WebResponse> => {\n return new Promise<WebResponse>((resolve, reject) => {\n postUrl(url, formData, headers)\n .then((response) => {\n if (response.status >= 200 && response.status < 400) {\n resolve(response);\n } else {\n if (url === DEFAULT_MEDIA_ENDPOINT) {\n reject(response);\n } else {\n reject('Server failure');\n }\n }\n })\n .catch((err) => {\n reject(err);\n });\n });\n};\n\nexport const postForm = (\n url: string,\n payload: any | FormData,\n headers: any = {}\n): Promise<WebResponse> => {\n const formData = new FormData();\n Object.keys(payload).forEach((key: string) => {\n formData.append(key, payload[key]);\n });\n return postFormData(url, formData, headers);\n};\n\n/**\n */\nexport const renderIf =\n (predicate: boolean | any) =>\n (then: () => TemplateResult, otherwise?: () => TemplateResult) => {\n return predicate ? then() : otherwise ? otherwise() : html``;\n };\n\nexport const hexToRgb = (hex: string): { r: number; g: number; b: number } => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n }\n : null;\n};\n\nexport const getElementOffset = (\n ele: HTMLElement\n): {\n top: number;\n left: number;\n bottom: number;\n right: number;\n width: number;\n height: number;\n} => {\n const rect = ele.getBoundingClientRect();\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return {\n top: rect.top + scrollTop,\n left: rect.left + scrollLeft,\n bottom: rect.top + rect.height,\n right: rect.left + rect.width,\n width: rect.width,\n height: rect.height\n };\n};\n\nexport const plural = (count: number, singular: string, plural: string) => {\n return count === 1 ? singular : plural;\n};\n\nexport const range = (start: number, end: number) =>\n Array.from({ length: end - start }, (v: number, k: number) => k + start);\n\nexport const fillTemplate = (\n template: string,\n replacements: { [key: string]: string | number }\n): TemplateResult => {\n for (const key in replacements) {\n const className = key + '-replaced';\n replacements[\n key\n ] = `<span class=\"${className}\">${replacements[key]}</span>`;\n }\n\n const templateDiv = document.createElement('div');\n // templateDiv.innerHTML = dynamicTemplate(template, replacements);\n return html` ${templateDiv} `;\n};\n\n/*!\n * Serialize all form data into a query string\n * (c) 2018 Chris Ferdinandi, MIT License, https://gomakethings.com\n * @param {Node} form The form to serialize\n * @return {String} The serialized form data\n */\nexport const serialize = function (form: any) {\n // Setup our serialized data\n const serialized = [];\n\n // Loop through each field in the form\n for (let i = 0; i < form.elements.length; i++) {\n const field = form.elements[i];\n\n // Don't serialize fields without a name, submits, buttons, file and reset inputs, and disabled fields\n if (\n !field.name ||\n field.disabled ||\n field.type === 'file' ||\n field.type === 'reset' ||\n field.type === 'submit' ||\n field.type === 'button'\n )\n continue;\n\n // If a multi-select, get all selections\n if (field.type === 'select-multiple') {\n for (let n = 0; n < field.options.length; n++) {\n if (!field.options[n].selected) continue;\n if (field.options[n].value) {\n serialized.push(\n encodeURIComponent(field.name) +\n '=' +\n encodeURIComponent(field.options[n].value)\n );\n }\n }\n }\n\n // Convert field data to a query string\n else if (\n (field.type !== 'checkbox' && field.type !== 'radio') ||\n field.checked\n ) {\n let value = field.value;\n if (!value && field.checked) {\n value = '1';\n }\n\n if (value) {\n serialized.push(\n encodeURIComponent(field.name) + '=' + encodeURIComponent(value)\n );\n }\n }\n }\n return serialized.join('&');\n};\n\nexport const getScrollParent = (node: any): any => {\n const parent = node.parentNode || node.host;\n if (parent) {\n const isElement = parent instanceof HTMLElement;\n const overflowY = isElement && window.getComputedStyle(parent).overflowY;\n const isScrollable =\n overflowY &&\n !(overflowY.includes('hidden') || overflowY.includes('visible'));\n\n if (!parent) {\n return null;\n } else if (isScrollable && parent.scrollHeight >= parent.clientHeight) {\n return parent;\n }\n\n return getScrollParent(parent);\n }\n return null;\n};\n\nexport const isElementVisible = (el: any, holder?: any) => {\n holder = holder || document.body;\n const { top, bottom } = el.getBoundingClientRect();\n const holderRect = holder.getBoundingClientRect();\n\n return top <= holderRect.top\n ? bottom > holderRect.top\n : bottom < holderRect.bottom;\n};\n\nconst HOUR = 3600;\nconst DAY = HOUR * 24;\nconst MONTH = DAY * 30;\n\nexport class Stubbable {\n public getCurrentDate() {\n return new Date();\n }\n}\n\nexport const stubbable = new Stubbable();\n\nexport const spreadAttributes = (obj): TemplateResult[] => {\n return Object.entries(obj).map(([key, value]) => {\n if (key.startsWith('@')) {\n return html`@${key.slice(1)}=${value}`;\n } else if (key.startsWith('.')) {\n return html`.${key.slice(1)}=${value}`;\n } else {\n return html`${key}=${value}`;\n }\n });\n};\n\nexport const timeSince = (\n date: Date,\n options: { compareDate?: Date; hideRecentText?: boolean; suffix?: string } = {\n suffix: ''\n }\n) => {\n const { compareDate, hideRecentText, suffix } = options;\n const now = compareDate || stubbable.getCurrentDate();\n const secondsPast = Math.floor((now.getTime() - date.getTime()) / 1000);\n\n if (secondsPast < 60) {\n if (compareDate) {\n return secondsPast + 's' + suffix;\n }\n\n if (!hideRecentText && suffix) {\n return suffix;\n }\n return 'just now';\n }\n\n if (secondsPast < HOUR) {\n return Math.round(secondsPast / 60) + 'm' + suffix;\n }\n\n if (secondsPast <= DAY) {\n return Math.round(secondsPast / HOUR) + 'h' + suffix;\n }\n\n if (secondsPast <= MONTH) {\n return Math.round(secondsPast / DAY) + 'd' + suffix;\n }\n\n if (secondsPast < MONTH * 6) {\n return Math.round(secondsPast / MONTH) + 'mth' + suffix;\n } else {\n const day = date.getDate();\n const month = date\n .toDateString()\n .match(/ [a-zA-Z]*/)[0]\n .replace(' ', '');\n const year =\n date.getFullYear() == now.getFullYear() ? '' : ' ' + date.getFullYear();\n return day + ' ' + month + year;\n }\n};\n\nexport const isDate = (value: any): boolean => {\n if (toString.call(value) === '[object Date]') {\n return true;\n }\n /* c8 ignore next 3 */\n if (typeof value.replace === 'function') {\n value.replace(/^\\s+|\\s+$/gm, '');\n }\n\n // value = value.split(\"+\")[0];\n return DATE_FORMAT.test(value);\n};\n\nexport const debounce = (fn: any, millis: number, immediate = false) => {\n let timeout: any;\n return function (...args: any) {\n const context = this;\n const later = function () {\n timeout = null;\n if (!immediate) {\n fn.apply(context, args);\n }\n };\n const callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, millis);\n if (callNow) {\n fn.apply(context, args);\n }\n };\n};\n\nexport const throttle = (fn: any, millis: number) => {\n let ready = true;\n return function (...args: any) {\n const context = this;\n if (!ready) {\n return;\n }\n\n ready = false;\n fn.apply(context, args);\n setTimeout(() => {\n ready = true;\n }, millis);\n };\n};\n\nexport interface NamedObject {\n name: string;\n}\n\nexport const truncate = (input: string, max: number): string => {\n if (input.length > max) {\n return input.substring(0, max) + '...';\n }\n\n return input;\n};\n\nexport const oxford = (items: any[], joiner = 'and'): any => {\n if (items.length === 0) {\n return '';\n }\n\n if (items.length === 1) {\n return items[0];\n }\n\n if (items.length === 2) {\n // TemplateResults get a different treatment\n if (typeof items[0] === 'object') {\n return html`${items[0]} ${joiner} ${items[1]}`;\n }\n return items.join(' ' + joiner + ' ');\n }\n\n // TemplateResults get a different treatment\n if (typeof items[0] === 'object') {\n return items.map((tr: TemplateResult, idx: number) => {\n if (idx < items.length - 1) {\n return html`${tr}, `;\n }\n return html`${joiner} ${tr}`;\n });\n }\n\n const allButLast = items.slice(0, -1);\n const last = items[items.length - 1];\n return allButLast.join(', ') + ', ' + joiner + ' ' + last;\n};\n\nexport const oxfordFn = (\n items: any[],\n fn: (item: any) => any,\n joiner = 'and'\n): any => {\n return oxford(items.map(fn), joiner);\n};\n\nexport const oxfordNamed = (items: NamedObject[], joiner = 'and'): any => {\n return oxfordFn(items, (value: any) => value.name, joiner);\n};\n\nexport const getDialog = (button: Button): Dialog => {\n return (button.getRootNode() as ShadowRoot).host as Dialog;\n};\n\nexport const setCookie = (name: string, value: any, path = undefined) => {\n if (!path) {\n // default path is the first word in the url\n const url = document.location.pathname;\n path = url.substring(0, url.indexOf('/', 1));\n }\n const now = new Date();\n now.setTime(now.getTime() + 60 * 1000 * 60 * 24 * 30);\n document.cookie = `${name}=${value};expires=${now.toUTCString()};path=${path}`;\n};\n\nexport const getCookie = (name: string) => {\n let cookieValue = null;\n if (document.cookie && document.cookie != '') {\n const cookies = document.cookie.split(';');\n for (let i = 0; i < cookies.length; i++) {\n const cookie = cookies[i].trim();\n // Does this cookie string begin with the name we want?\n if (cookie.substring(0, name.length + 1) == name + '=') {\n cookieValue = decodeURIComponent(cookie.substring(name.length + 1));\n break;\n }\n }\n }\n return cookieValue;\n};\n\nexport const getCookieBoolean = (name: string) => {\n return (getCookie(name) || '') === 'true';\n};\n\nexport enum COOKIE_KEYS {\n SETTINGS = 'settings',\n MENU_COLLAPSED = 'menu-collapsed',\n TICKET_SHOW_DETAILS = 'tickets.show-details'\n}\n\nexport const capitalize = (\n [first, ...rest]: string[] | string,\n locale = navigator.language\n) =>\n first === undefined ? '' : first.toLocaleUpperCase(locale) + rest.join('');\n\nexport const formatFileType = (type: string): string => {\n return type.split('/')[1];\n};\nexport const formatFileSize = (\n bytes: number,\n decimalPoint?: number\n): string => {\n if (bytes == 0) return '0 KB';\n const k = 1024,\n dm = decimalPoint || 2,\n sizes = ['B', 'KB', 'MB', 'GB'], //, 'TB', 'PB', 'EB', 'ZB', 'YB'],\n i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n};\n\nexport const isImageAttachment = (attachment: Attachment) => {\n if (attachment) {\n return attachment.content_type.split('/')[0] === 'image';\n }\n return false;\n};\n\nexport const stopEvent = (event: Event) => {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n }\n};\n\n/**\n * Extracts 2-letter initials from text like a workspace or user name\n * @param text the input text\n * @returns the initials\n */\nexport const extractInitials = (text: string) => {\n text = text.trim();\n\n // split into words, first allowing hypens inside words,\n // then splitting by hypen to try to get more than one word\n let words =\n text.match(/(([\\p{L}\\p{N}]+-[\\p{L}\\p{N}]+)|([\\p{L}\\p{N}]+))/gu) || [];\n if (words.length == 1) {\n words = text.match(/[\\p{L}\\p{N}]+/gu);\n }\n\n // for the case of no words use ? and for only one word take first 2 characters\n if (words.length == 0) {\n return '?';\n } else if (words.length == 1) {\n return words[0].substring(0, 2).toUpperCase();\n }\n\n // use initial letters of words with preference to first word and capital letters\n const firstLetters = words.map((w) => w.substring(0, 1));\n const firstCapitals = firstLetters.filter(\n (l, index) => l == l.toUpperCase() || index == 0\n );\n if (firstCapitals.length >= 2) {\n return (firstCapitals[0] + firstCapitals[1]).toUpperCase();\n } else {\n return (firstLetters[0] + firstLetters[1]).toUpperCase();\n }\n};\n\nexport const hslToHex = (h, s, l) => {\n l /= 100;\n const a = (s * Math.min(l, 1 - l)) / 100;\n const f = (n) => {\n const k = (n + h / 30) % 12;\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, '0'); // convert to Hex and prefix \"0\" if needed\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n};\n\nexport const darkenColor = (color: string, factor: number): string => {\n // If rgba or rgb\n const rgbaMatch = color.match(\n /rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([0-9.]+))?\\)/\n );\n if (rgbaMatch) {\n // eslint-disable-next-line prefer-const\n let [r, g, b, a] = rgbaMatch\n .slice(1)\n .map((v, i) => (i < 3 ? parseInt(v) : parseFloat(v)));\n r = Math.max(0, Math.floor(r * (1 - factor)));\n g = Math.max(0, Math.floor(g * (1 - factor)));\n b = Math.max(0, Math.floor(b * (1 - factor)));\n if (rgbaMatch[4] !== undefined) {\n return `rgba(${r},${g},${b},${a})`;\n }\n return `rgb(${r},${g},${b})`;\n }\n // If hex\n if (color.startsWith('#')) {\n let hex = color.replace('#', '');\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((c) => c + c)\n .join('');\n }\n const num = parseInt(hex, 16);\n let r = (num >> 16) & 255;\n let g = (num >> 8) & 255;\n let b = num & 255;\n r = Math.max(0, Math.floor(r * (1 - factor)));\n g = Math.max(0, Math.floor(g * (1 - factor)));\n b = Math.max(0, Math.floor(b * (1 - factor)));\n return `rgb(${r},${g},${b})`;\n }\n // fallback\n return color;\n};\n\nexport const renderAvatar = (input: {\n name?: string;\n user?: User;\n icon?: string;\n position?: string;\n scale?: number;\n}) => {\n if (!input.position) {\n input.position = 'right';\n }\n\n let text = input.name;\n if (input.user && input.user.first_name && input.user.last_name) {\n text = `${input.user.first_name} ${input.user.last_name}`;\n }\n\n let initials = '';\n let color = '';\n\n // just a url\n if (input.user && input.user.avatar) {\n color = `url('${input.user.avatar}') center / contain no-repeat`;\n } else if (text) {\n color = colorHash.hex(text);\n initials = extractInitials(text);\n }\n\n const avatar = html`\n <div\n style=\"display:flex; flex-direction: column; align-items:center;transform:scale(${input.scale ||\n 1});\"\n >\n <div\n class=\"avatar-circle\"\n style=\"\n display: flex;\n height: 30px;\n width: 30px;\n flex-direction: row;\n align-items: center;\n color: #fff;\n border-radius: 100%;\n font-weight: 400;\n overflow: hidden;\n font-size: 12px;\n box-shadow: inset 0 0 0 3px rgba(0, 0, 0, 0.1);\n background:${color}\"\n >\n ${initials\n ? html` <div\n style=\"border: 0px solid red; display:flex; flex-direction: column; align-items:center;flex-grow:1\"\n >\n <div style=\"border:0px solid blue;\">${initials}</div>\n </div>`\n : null}\n </div>\n </div>\n `;\n return avatar;\n};\n\nexport const hashCode = (s) => {\n return s.split('').reduce((a, b) => {\n a = (a << 5) - a + b.charCodeAt(0);\n return a & a;\n }, 0);\n};\n\nexport const showModax = (title: string, endpoint: string) => {\n (window as any).showModax(title, endpoint);\n};\nexport const sanitizeUnintendedUnicode = (text: string): string => {\n if (text) {\n return text\n .replace(/[\\u2018\\u2019]/g, \"'\") // Smart single quotes\n .replace(/[\\u201C\\u201D]/g, '\"') // Smart double quotes\n .replace(/[\\u2013\\u2014]/g, '-') // En/em dash\n .replace(/\\u2026/g, '...') // Horizontal ellipsis\n .replace(/\\u2002/g, ' '); // En space\n }\n return text;\n};\nexport const getCenter = (a: DOMRect, b: DOMRect) => {\n return a.left + a.width / 2 - b.width / 2;\n};\nexport const getMiddle = (a: DOMRect, b: DOMRect) => {\n return a.top + a.height / 2 - b.height / 2;\n};\n\n// Export the UUID function from the uuid package\nexport { generateUUID };\n\n// Helper types for router creation\nexport interface RouterCategory {\n uuid: string;\n name: string;\n exit_uuid: string;\n}\n\nexport interface RouterExit {\n uuid: string;\n destination_uuid: string | null;\n}\n\nexport interface RouterCase {\n uuid: string;\n type: string;\n arguments: string[];\n category_uuid: string;\n}\n\nexport interface CreateCategoryParams {\n name: string;\n existingCategories: any[];\n existingExits: any[];\n existingCases?: any[];\n caseConfig?: {\n type: string;\n arguments: string[];\n };\n}\n\n// Helper function to create or preserve a category with its exit and case\nexport const createOrPreserveCategory = (\n params: CreateCategoryParams\n): {\n category: RouterCategory;\n exit: RouterExit;\n case?: RouterCase;\n} => {\n const { name, existingCategories, existingExits, existingCases, caseConfig } =\n params;\n\n // Find existing category\n const existingCategory = existingCategories.find((cat) => cat.name === name);\n const existingExit = existingCategory\n ? existingExits.find((exit) => exit.uuid === existingCategory.exit_uuid)\n : null;\n const existingCase =\n existingCategory && existingCases\n ? existingCases.find(\n (case_) => case_.category_uuid === existingCategory.uuid\n )\n : null;\n\n // Use existing UUIDs or generate new ones\n const categoryUuid = existingCategory?.uuid || generateUUID();\n const exitUuid = existingExit?.uuid || generateUUID();\n const caseUuid = existingCase?.uuid || generateUUID();\n\n const category: RouterCategory = {\n uuid: categoryUuid,\n name: name,\n exit_uuid: exitUuid\n };\n\n const exit: RouterExit = {\n uuid: exitUuid,\n destination_uuid: existingExit?.destination_uuid || null\n };\n\n const result: {\n category: RouterCategory;\n exit: RouterExit;\n case?: RouterCase;\n } = { category, exit };\n\n if (caseConfig) {\n result.case = {\n uuid: caseUuid,\n type: caseConfig.type,\n arguments: caseConfig.arguments,\n category_uuid: categoryUuid\n };\n }\n\n return result;\n};\n\n// Helper function to create a complete router with standard Success/Failure categories\nexport const createSuccessFailureRouter = (\n operand: string,\n successCaseConfig: { type: string; arguments: string[] },\n existingCategories: any[] = [],\n existingExits: any[] = [],\n existingCases: any[] = []\n) => {\n const success = createOrPreserveCategory({\n name: 'Success',\n existingCategories,\n existingExits,\n existingCases,\n caseConfig: successCaseConfig\n });\n\n const failure = createOrPreserveCategory({\n name: 'Failure',\n existingCategories,\n existingExits\n });\n\n return {\n router: {\n type: 'switch' as const,\n categories: [success.category, failure.category],\n default_category_uuid: failure.category.uuid,\n operand: operand,\n cases: success.case ? [success.case] : []\n },\n exits: [success.exit, failure.exit]\n };\n};\n\n// Helper function to create a multi-category router with Other/Failure defaults\nexport const createMultiCategoryRouter = (\n operand: string,\n userCategories: string[],\n categoryToCaseMap: (categoryName: string) => {\n type: string;\n arguments: string[];\n },\n existingCategories: any[] = [],\n existingExits: any[] = [],\n existingCases: any[] = []\n) => {\n const categories: RouterCategory[] = [];\n const exits: RouterExit[] = [];\n const cases: RouterCase[] = [];\n\n // Add user categories\n userCategories.forEach((categoryName) => {\n const result = createOrPreserveCategory({\n name: categoryName,\n existingCategories,\n existingExits,\n existingCases,\n caseConfig: categoryToCaseMap(categoryName)\n });\n\n categories.push(result.category);\n exits.push(result.exit);\n if (result.case) {\n cases.push(result.case);\n }\n });\n\n // Add \"Other\" category (default)\n const other = createOrPreserveCategory({\n name: 'Other',\n existingCategories,\n existingExits\n });\n categories.push(other.category);\n exits.push(other.exit);\n\n // Add \"Failure\" category\n const failure = createOrPreserveCategory({\n name: 'Failure',\n existingCategories,\n existingExits,\n existingCases,\n caseConfig: {\n type: 'has_only_text',\n arguments: ['<ERROR>']\n }\n });\n categories.push(failure.category);\n exits.push(failure.exit);\n if (failure.case) {\n cases.push(failure.case);\n }\n\n return {\n router: {\n type: 'switch' as const,\n categories: categories,\n default_category_uuid: other.category.uuid,\n operand: operand,\n cases: cases\n },\n exits: exits\n };\n};\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,OAAO,EAAE,IAAI,EAAkB,MAAM,UAAU,CAAC;AAIhD,OAAO,SAAS,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,EAAE,IAAI,YAAY,EAAE,MAAM,MAAM,CAAC;AAE1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAE3D,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAIzC,MAAM,CAAC,MAAM,WAAW,GACtB,gNAAgN,CAAC;AAgBnN,MAAM,CAAN,IAAY,KAKX;AALD,WAAY,KAAK;IACf,gCAAuB,CAAA;IACvB,iCAAwB,CAAA;IACxB,+BAAsB,CAAA;IACtB,kCAAyB,CAAA;AAC3B,CAAC,EALW,KAAK,KAAL,KAAK,QAKhB;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,OAAwB,EAAE,OAAO,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,EAAE,EAAE;IAC1E,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACnB,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,sCAAsC;QACtC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IACD,sCAAsC;IACtC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,uCAAuC;AACvC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE;IACpD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAChC,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAEnC,oBAAoB;QACpB,GAAG,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAErB,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,UAAe,EAAE,EAAE,EAAE;IAC9C,IAAI,IAAI,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CACrC,4BAA4B,CACT,CAAC;QACtB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC;QACxB,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9D,6BAA6B;IAC7B,MAAM,MAAM,GAAI,MAAc,CAAC,MAAM,CAAC;IACtC,IAAI,MAAM,EAAE,CAAC;QACX,YAAY,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC;IACvC,CAAC;IAED,kBAAkB;IAClB,YAAY,CAAC,kBAAkB,CAAC,GAAG,gBAAgB,CAAC;IAEpD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;QACnC,oDAAoD;QACpD,IAAI,GAAG,KAAK,qBAAqB,EAAE,CAAC;YAClC,OAAO,YAAY,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QAED,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,OAAO,YAAY,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,GAAW,EACX,aAA8B,IAAI,EAClC,UAAqC,EAAE,EACjB,EAAE;IACxB,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,MAAM,OAAO,GAAG;YACd,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;SAC7B,CAAC;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC;QACxC,CAAC;QAED,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC;aAChB,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjB,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBACpD,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE;gBACpC,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACxB,oCAAoC;gBACtC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC,CAAA,CAAC;gBAChB,OAAO,CAAC;oBACN,UAAU;oBACV,IAAI;oBACJ,IAAI;oBACJ,GAAG,EAAE,QAAQ,CAAC,GAAG;oBACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;iBACxB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAa,EAAU,EAAE;IAClD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,SAAiB,EAAE,EAAE;QAC7C,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACnB,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC;IACxB,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;AACvB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAAW,EACX,aAA8B,IAAI,EAClC,UAAqC,EAAE,EACjB,EAAE;IACxB,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC;aAC7B,IAAI,CAAC,CAAC,QAAqB,EAAE,EAAE;YAC9B,OAAO,CAAC;gBACN,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO;gBAC9B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI;aACzB,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,GAAW,EACX,UAAqC,EAAE,EACvB,EAAE;IAClB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,OAAO,GAAU,EAAE,CAAC;IACxB,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,OAAO,OAAO,EAAE,CAAC;QACf,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;IAC7B,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAsB,EAAE;IAC9D,OAAO,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAChD,MAAM,CAAC,GAAG,CAAC;aACR,IAAI,CAAC,CAAC,QAAqB,EAAE,EAAE;YAC9B,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACpD,OAAO,CAAC;oBACN,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO;oBAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI;iBACzB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,QAAQ,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAAE,GAAW,EAAoB,EAAE;IAC/D,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,MAAM,GAAY,EAAE,CAAC;IACzB,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,OAAO,OAAO,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACzC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAYF,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,GAAW,EACX,OAAY,EACZ,UAAe,EAAE,EACjB,WAAW,GAAG,IAAI,EACI,EAAE;IACxB,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAEzC,IAAI,WAAW,EAAE,CAAC;QAChB,YAAY,CAAC,cAAc,CAAC,GAAG,WAAW,CAAC;IAC7C,CAAC;IAED,MAAM,OAAO,GAAG;QACd,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,YAAY;QACrB,IAAI,EAAE,OAAO;KACd,CAAC;IAEF,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC;aAChB,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACvB,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBAC3B,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACjB,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACtD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAU,CAAC;gBAChE,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;YAED,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE;gBACpC,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACxB,oCAAoC;gBACtC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC,CAAA,CAAC;gBAChB,OAAO,CAAC;oBACN,IAAI;oBACJ,IAAI;oBACJ,OAAO,EAAE,QAAQ,CAAC,OAAO;oBACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,GAAG,EAAE,QAAQ,CAAC,GAAG;iBAClB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,OAAY,EAAwB,EAAE;IAC1E,OAAO,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;AAC1E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,GAAW,EACX,QAAkB,EAClB,UAAe,EAAE,EACK,EAAE;IACxB,OAAO,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAClD,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC;aAC5B,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;YACjB,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACpD,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,KAAK,sBAAsB,EAAE,CAAC;oBACnC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,gBAAgB,CAAC,CAAC;gBAC3B,CAAC;YACH,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACb,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,GAAW,EACX,OAAuB,EACvB,UAAe,EAAE,EACK,EAAE;IACxB,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,GAAW,EAAE,EAAE;QAC3C,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,OAAO,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF;GACG;AACH,MAAM,CAAC,MAAM,QAAQ,GACnB,CAAC,SAAwB,EAAE,EAAE,CAC7B,CAAC,IAA0B,EAAE,SAAgC,EAAE,EAAE;IAC/D,OAAO,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA,EAAE,CAAC;AAC/D,CAAC,CAAC;AAEJ,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAuC,EAAE;IAC3E,MAAM,MAAM,GAAG,2CAA2C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrE,OAAO,MAAM;QACX,CAAC,CAAC;YACE,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC1B,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC1B,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;SAC3B;QACH,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,GAAgB,EAQhB,EAAE;IACF,MAAM,IAAI,GAAG,GAAG,CAAC,qBAAqB,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC;IAC7E,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,IAAI,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC;IAC3E,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,SAAS;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI,GAAG,UAAU;QAC5B,MAAM,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM;QAC9B,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK;QAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,QAAgB,EAAE,MAAc,EAAE,EAAE;IACxE,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,EAAE,CAClD,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,KAAK,EAAE,EAAE,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,QAAgB,EAChB,YAAgD,EAChC,EAAE;IAClB,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,GAAG,GAAG,WAAW,CAAC;QACpC,YAAY,CACV,GAAG,CACJ,GAAG,gBAAgB,SAAS,KAAK,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;IAC/D,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAClD,mEAAmE;IACnE,OAAO,IAAI,CAAA,IAAI,WAAW,GAAG,CAAC;AAChC,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,IAAS;IAC1C,4BAA4B;IAC5B,MAAM,UAAU,GAAG,EAAE,CAAC;IAEtB,sCAAsC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAE/B,sGAAsG;QACtG,IACE,CAAC,KAAK,CAAC,IAAI;YACX,KAAK,CAAC,QAAQ;YACd,KAAK,CAAC,IAAI,KAAK,MAAM;YACrB,KAAK,CAAC,IAAI,KAAK,OAAO;YACtB,KAAK,CAAC,IAAI,KAAK,QAAQ;YACvB,KAAK,CAAC,IAAI,KAAK,QAAQ;YAEvB,SAAS;QAEX,wCAAwC;QACxC,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ;oBAAE,SAAS;gBACzC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CACb,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC;wBAC5B,GAAG;wBACH,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAC7C,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,uCAAuC;aAClC,IACH,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC;YACrD,KAAK,CAAC,OAAO,EACb,CAAC;YACD,IAAI,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YACxB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAC5B,KAAK,GAAG,GAAG,CAAC;YACd,CAAC;YAED,IAAI,KAAK,EAAE,CAAC;gBACV,UAAU,CAAC,IAAI,CACb,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,kBAAkB,CAAC,KAAK,CAAC,CACjE,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAS,EAAO,EAAE;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC;IAC5C,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,SAAS,GAAG,MAAM,YAAY,WAAW,CAAC;QAChD,MAAM,SAAS,GAAG,SAAS,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC;QACzE,MAAM,YAAY,GAChB,SAAS;YACT,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;QAEnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,YAAY,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;YACtE,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,EAAO,EAAE,MAAY,EAAE,EAAE;IACxD,MAAM,GAAG,MAAM,IAAI,QAAQ,CAAC,IAAI,CAAC;IACjC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;IACnD,MAAM,UAAU,GAAG,MAAM,CAAC,qBAAqB,EAAE,CAAC;IAElD,OAAO,GAAG,IAAI,UAAU,CAAC,GAAG;QAC1B,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG;QACzB,CAAC,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,IAAI,CAAC;AAClB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;AACtB,MAAM,KAAK,GAAG,GAAG,GAAG,EAAE,CAAC;AAEvB,MAAM,OAAO,SAAS;IACb,cAAc;QACnB,OAAO,IAAI,IAAI,EAAE,CAAC;IACpB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAEzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAoB,EAAE;IACxD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC9C,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAA,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;QACzC,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAA,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,CAAA,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,IAAU,EACV,UAA6E;IAC3E,MAAM,EAAE,EAAE;CACX,EACD,EAAE;IACF,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACxD,MAAM,GAAG,GAAG,WAAW,IAAI,SAAS,CAAC,cAAc,EAAE,CAAC;IACtD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;IAExE,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;QACrB,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,WAAW,GAAG,GAAG,GAAG,MAAM,CAAC;QACpC,CAAC;QAED,IAAI,CAAC,cAAc,IAAI,MAAM,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,IAAI,WAAW,GAAG,IAAI,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC;IACrD,CAAC;IAED,IAAI,WAAW,IAAI,GAAG,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC;IACvD,CAAC;IAED,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC;IACtD,CAAC;IAED,IAAI,WAAW,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI;aACf,YAAY,EAAE;aACd,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;aACtB,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACpB,MAAM,IAAI,GACR,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1E,OAAO,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC;IAClC,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAU,EAAW,EAAE;IAC5C,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,eAAe,EAAE,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,sBAAsB;IACtB,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACxC,KAAK,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,+BAA+B;IAC/B,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAO,EAAE,MAAc,EAAE,SAAS,GAAG,KAAK,EAAE,EAAE;IACrE,IAAI,OAAY,CAAC;IACjB,OAAO,UAAU,GAAG,IAAS;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,MAAM,KAAK,GAAG;YACZ,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,OAAO,CAAC;QACtC,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,OAAO,EAAE,CAAC;YACZ,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,EAAO,EAAE,MAAc,EAAE,EAAE;IAClD,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,OAAO,UAAU,GAAG,IAAS;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,KAAK,GAAG,KAAK,CAAC;QACd,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACxB,UAAU,CAAC,GAAG,EAAE;YACd,KAAK,GAAG,IAAI,CAAC;QACf,CAAC,EAAE,MAAM,CAAC,CAAC;IACb,CAAC,CAAC;AACJ,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,GAAW,EAAU,EAAE;IAC7D,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;IACzC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAY,EAAE,MAAM,GAAG,KAAK,EAAO,EAAE;IAC1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,4CAA4C;QAC5C,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YACjC,OAAO,IAAI,CAAA,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,4CAA4C;IAC5C,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,EAAkB,EAAE,GAAW,EAAE,EAAE;YACnD,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO,IAAI,CAAA,GAAG,EAAE,IAAI,CAAC;YACvB,CAAC;YACD,OAAO,IAAI,CAAA,GAAG,MAAM,IAAI,EAAE,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrC,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,KAAY,EACZ,EAAsB,EACtB,MAAM,GAAG,KAAK,EACT,EAAE;IACP,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAoB,EAAE,MAAM,GAAG,KAAK,EAAO,EAAE;IACvE,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAAc,EAAU,EAAE;IAClD,OAAQ,MAAM,CAAC,WAAW,EAAiB,CAAC,IAAc,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,KAAU,EAAE,IAAI,GAAG,SAAS,EAAE,EAAE;IACtE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,4CAA4C;QAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvC,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IACtD,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,KAAK,YAAY,GAAG,CAAC,WAAW,EAAE,SAAS,IAAI,EAAE,CAAC;AACjF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,EAAE;IACxC,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,uDAAuD;YACvD,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;gBACvD,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBACpE,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAE,EAAE;IAC/C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,MAAM,CAAC;AAC5C,CAAC,CAAC;AAEF,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,oCAAqB,CAAA;IACrB,gDAAiC,CAAA;IACjC,2DAA4C,CAAA;AAC9C,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAED,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,CAAC,KAAK,EAAE,GAAG,IAAI,CAAoB,EACnC,MAAM,GAAG,SAAS,CAAC,QAAQ,EAC3B,EAAE,CACF,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAE7E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAY,EAAU,EAAE;IACrD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5B,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC5B,KAAa,EACb,YAAqB,EACb,EAAE;IACV,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9B,MAAM,CAAC,GAAG,IAAI,EACZ,EAAE,GAAG,YAAY,IAAI,CAAC,EACtB,KAAK,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,kCAAkC;IACnE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,UAAU,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,UAAsB,EAAE,EAAE;IAC1D,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC;IAC3D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAY,EAAE,EAAE;IACxC,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,KAAK,CAAC,cAAc,EAAE,CAAC;IACzB,CAAC;AACH,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,EAAE;IAC9C,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEnB,wDAAwD;IACxD,2DAA2D;IAC3D,IAAI,KAAK,GACP,IAAI,CAAC,KAAK,CAAC,mDAAmD,CAAC,IAAI,EAAE,CAAC;IACxE,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACxC,CAAC;IAED,+EAA+E;IAC/E,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC;IACb,CAAC;SAAM,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC;IAED,iFAAiF;IACjF,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACzD,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CACvC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,IAAI,KAAK,IAAI,CAAC,CACjD,CAAC;IACF,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3D,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAClC,CAAC,IAAI,GAAG,CAAC;IACT,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE;QACd,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;aAC3B,QAAQ,CAAC,EAAE,CAAC;aACZ,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,0CAA0C;IACjE,CAAC,CAAC;IACF,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,MAAc,EAAU,EAAE;IACnE,iBAAiB;IACjB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAC3B,oDAAoD,CACrD,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACd,wCAAwC;QACxC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS;aACzB,KAAK,CAAC,CAAC,CAAC;aACR,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;YAC/B,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QACrC,CAAC;QACD,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/B,CAAC;IACD,SAAS;IACT,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,GAAG,GAAG,GAAG;iBACN,KAAK,CAAC,EAAE,CAAC;iBACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;iBACjB,IAAI,CAAC,EAAE,CAAC,CAAC;QACd,CAAC;QACD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACzB,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;QAClB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/B,CAAC;IACD,WAAW;IACX,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAM5B,EAAE,EAAE;IACH,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,KAAK,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACtB,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAChE,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IAC5D,CAAC;IAED,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,KAAK,GAAG,EAAE,CAAC;IAEf,aAAa;IACb,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACpC,KAAK,GAAG,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,+BAA+B,CAAC;IACnE,CAAC;SAAM,IAAI,IAAI,EAAE,CAAC;QAChB,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAA;;wFAEmE,KAAK,CAAC,KAAK;QAC7F,CAAC;;;;;;;;;;;;;;;;yBAgBkB,KAAK;;UAEpB,QAAQ;QACR,CAAC,CAAC,IAAI,CAAA;;;oDAGoC,QAAQ;mBACzC;QACT,CAAC,CAAC,IAAI;;;GAGb,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,EAAE;IAC5B,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,CAAC;IACf,CAAC,EAAE,CAAC,CAAC,CAAC;AACR,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAa,EAAE,QAAgB,EAAE,EAAE;IAC1D,MAAc,CAAC,SAAS,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,IAAY,EAAU,EAAE;IAChE,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI;aACR,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,sBAAsB;aACtD,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,sBAAsB;aACtD,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,aAAa;aAC7C,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,sBAAsB;aAChD,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,WAAW;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE;IAClD,OAAO,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AAC5C,CAAC,CAAC;AACF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAU,EAAE,CAAU,EAAE,EAAE;IAClD,OAAO,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAC7C,CAAC,CAAC;AAEF,iDAAiD;AACjD,OAAO,EAAE,YAAY,EAAE,CAAC;AAgCxB,0EAA0E;AAC1E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,MAA4B,EAK5B,EAAE;IACF,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,GAC1E,MAAM,CAAC;IAET,yBAAyB;IACzB,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,gBAAgB;QACnC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,SAAS,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,YAAY,GAChB,gBAAgB,IAAI,aAAa;QAC/B,CAAC,CAAC,aAAa,CAAC,IAAI,CAChB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,KAAK,gBAAgB,CAAC,IAAI,CACzD;QACH,CAAC,CAAC,IAAI,CAAC;IAEX,0CAA0C;IAC1C,MAAM,YAAY,GAAG,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,KAAI,YAAY,EAAE,CAAC;IAC9D,MAAM,QAAQ,GAAG,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,KAAI,YAAY,EAAE,CAAC;IACtD,MAAM,QAAQ,GAAG,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,KAAI,YAAY,EAAE,CAAC;IAEtD,MAAM,QAAQ,GAAmB;QAC/B,IAAI,EAAE,YAAY;QAClB,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,QAAQ;KACpB,CAAC;IAEF,MAAM,IAAI,GAAe;QACvB,IAAI,EAAE,QAAQ;QACd,gBAAgB,EAAE,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,gBAAgB,KAAI,IAAI;KACzD,CAAC;IAEF,MAAM,MAAM,GAIR,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAEvB,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,GAAG;YACZ,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,aAAa,EAAE,YAAY;SAC5B,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,uFAAuF;AACvF,MAAM,CAAC,MAAM,0BAA0B,GAAG,CACxC,OAAe,EACf,iBAAwD,EACxD,qBAA4B,EAAE,EAC9B,gBAAuB,EAAE,EACzB,gBAAuB,EAAE,EACzB,EAAE;IACF,MAAM,OAAO,GAAG,wBAAwB,CAAC;QACvC,IAAI,EAAE,SAAS;QACf,kBAAkB;QAClB,aAAa;QACb,aAAa;QACb,UAAU,EAAE,iBAAiB;KAC9B,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,wBAAwB,CAAC;QACvC,IAAI,EAAE,SAAS;QACf,kBAAkB;QAClB,aAAa;KACd,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE;YACN,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC;YAChD,qBAAqB,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;YAC5C,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;SAC1C;QACD,KAAK,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;KACpC,CAAC;AACJ,CAAC,CAAC;AAEF,gFAAgF;AAChF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,OAAe,EACf,cAAwB,EACxB,iBAGC,EACD,qBAA4B,EAAE,EAC9B,gBAAuB,EAAE,EACzB,gBAAuB,EAAE,EACzB,EAAE;IACF,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAiB,EAAE,CAAC;IAE/B,sBAAsB;IACtB,cAAc,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;QACtC,MAAM,MAAM,GAAG,wBAAwB,CAAC;YACtC,IAAI,EAAE,YAAY;YAClB,kBAAkB;YAClB,aAAa;YACb,aAAa;YACb,UAAU,EAAE,iBAAiB,CAAC,YAAY,CAAC;SAC5C,CAAC,CAAC;QAEH,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,iCAAiC;IACjC,MAAM,KAAK,GAAG,wBAAwB,CAAC;QACrC,IAAI,EAAE,OAAO;QACb,kBAAkB;QAClB,aAAa;KACd,CAAC,CAAC;IACH,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEvB,yBAAyB;IACzB,MAAM,OAAO,GAAG,wBAAwB,CAAC;QACvC,IAAI,EAAE,SAAS;QACf,kBAAkB;QAClB,aAAa;QACb,aAAa;QACb,UAAU,EAAE;YACV,IAAI,EAAE,eAAe;YACrB,SAAS,EAAE,CAAC,SAAS,CAAC;SACvB;KACF,CAAC,CAAC;IACH,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,MAAM,EAAE;YACN,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE,UAAU;YACtB,qBAAqB,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;YAC1C,OAAO,EAAE,OAAO;YAChB,KAAK,EAAE,KAAK;SACb;QACD,KAAK,EAAE,KAAK;KACb,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE;IACvC,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;AAClE,CAAC,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-this-alias */\nimport { html, TemplateResult } from 'lit-html';\nimport { Button } from './display/Button';\nimport { Dialog } from './layout/Dialog';\nimport { Attachment, ContactField, Shortcut, Ticket, User } from './interfaces';\nimport ColorHash from 'color-hash';\nimport { Toast } from './display/Toast';\nimport { v4 as generateUUID } from 'uuid';\n\nexport const DEFAULT_MEDIA_ENDPOINT = '/api/v2/media.json';\n\nexport const colorHash = new ColorHash();\n\nexport type Asset = KeyedAsset & Ticket & ContactField & Shortcut;\n\nexport const DATE_FORMAT =\n /(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))/;\n\ninterface KeyedAsset {\n key?: string;\n}\n\ninterface AssetPage {\n assets: Asset[];\n next: string;\n}\n\nexport interface ResultsPage {\n results: any[];\n next: string;\n}\n\nexport enum Color {\n BLUE = 'color:#5078b5;',\n GREEN = 'color:#62bd6a;',\n RED = 'color:#e36049;',\n PURPLE = 'color:#a626a4;'\n}\n\nexport const log = (message: string | object, styling = '', details = []) => {\n if (styling === '') {\n // eslint-disable-next-line no-console\n console.log(message);\n return;\n }\n\n if (typeof message === 'object') {\n // eslint-disable-next-line no-console\n console.log('%c' + JSON.stringify(message, null, 2), styling);\n return;\n }\n // eslint-disable-next-line no-console\n console.log('%c' + message, styling, ...details);\n};\n\n/** Get the value for a named cookie */\nexport const getHTTPCookie = (name: string): string => {\n for (const cookie of document.cookie.split(';')) {\n const idx = cookie.indexOf('=');\n let key = cookie.substr(0, idx);\n let value = cookie.substr(idx + 1);\n\n // no spaces allowed\n key = key.trim();\n value = value.trim();\n\n if (key === name) {\n return value;\n }\n }\n return null;\n};\n\nexport const getHeaders = (headers: any = {}) => {\n let csrf = getHTTPCookie('csrftoken');\n if (!csrf) {\n const tokenEle = document.querySelector(\n '[name=csrfmiddlewaretoken]'\n ) as HTMLInputElement;\n if (tokenEle) {\n csrf = tokenEle.value;\n }\n }\n\n const fetchHeaders: any = csrf ? { 'X-CSRFToken': csrf } : {};\n\n // include the current org id\n const org_id = (window as any).org_id;\n if (org_id) {\n fetchHeaders['X-Temba-Org'] = org_id;\n }\n\n // mark us as ajax\n fetchHeaders['X-Requested-With'] = 'XMLHttpRequest';\n\n Object.keys(headers).forEach((key) => {\n // if we are adding a service org, we omit temba-org\n if (key === 'X-Temba-Service-Org') {\n delete fetchHeaders['X-Temba-Org'];\n }\n\n fetchHeaders[key] = headers[key];\n });\n return fetchHeaders;\n};\n\nexport const getUrl = (\n url: string,\n controller: AbortController = null,\n headers: { [key: string]: string } = {}\n): Promise<WebResponse> => {\n return new Promise<WebResponse>((resolve, reject) => {\n const options = {\n method: 'GET',\n headers: getHeaders(headers)\n };\n\n if (controller) {\n options['signal'] = controller.signal;\n }\n\n fetch(url, options)\n .then((response) => {\n if (response.status < 200 || response.status >= 300) {\n reject(response);\n return;\n }\n\n response.text().then((body: string) => {\n let json = {};\n try {\n json = JSON.parse(body);\n // eslint-disable-next-line no-empty\n } catch (err) {}\n resolve({\n controller,\n body,\n json,\n url: response.url,\n headers: response.headers,\n status: response.status\n });\n });\n })\n .catch((error) => {\n reject(error);\n });\n });\n};\n\nexport type ClassMap = {\n [className: string]: boolean;\n};\n\nexport const getClasses = (map: ClassMap): string => {\n const classNames: string[] = [];\n Object.keys(map).forEach((className: string) => {\n if (map[className]) {\n classNames.push(className);\n }\n });\n\n let result = classNames.join(' ');\n if (result.trim().length > 0) {\n result = ' ' + result;\n }\n return result.trim();\n};\n\nexport const fetchResultsPage = (\n url: string,\n controller: AbortController = null,\n headers: { [key: string]: string } = {}\n): Promise<ResultsPage> => {\n return new Promise<ResultsPage>((resolve, reject) => {\n getUrl(url, controller, headers)\n .then((response: WebResponse) => {\n resolve({\n results: response.json.results,\n next: response.json.next\n });\n })\n .catch((error) => {\n return reject(error);\n });\n });\n};\n\nexport const fetchResults = async (\n url: string,\n headers: { [key: string]: string } = {}\n): Promise<any[]> => {\n if (!url) {\n return new Promise<any[]>((resolve) => resolve([]));\n }\n\n let results: any[] = [];\n let pageUrl = url;\n while (pageUrl) {\n const resultsPage = await fetchResultsPage(pageUrl, null, headers);\n if (resultsPage.results) {\n results = results.concat(resultsPage.results);\n }\n pageUrl = resultsPage.next;\n }\n return results;\n};\n\nexport const getAssetPage = (url: string): Promise<AssetPage> => {\n return new Promise<AssetPage>((resolve, reject) => {\n getUrl(url)\n .then((response: WebResponse) => {\n if (response.status >= 200 && response.status < 300) {\n resolve({\n assets: response.json.results,\n next: response.json.next\n });\n } else {\n reject(response);\n }\n })\n .catch((error) => reject(error));\n });\n};\n\nexport const getAssets = async (url: string): Promise<Asset[]> => {\n if (!url) {\n return new Promise<Asset[]>((resolve) => resolve([]));\n }\n\n let assets: Asset[] = [];\n let pageUrl = url;\n while (pageUrl) {\n const assetPage = await getAssetPage(pageUrl);\n if (assetPage.assets) {\n assets = assets.concat(assetPage.assets);\n pageUrl = assetPage.next;\n } else {\n pageUrl = null;\n }\n }\n return assets;\n};\n\nexport interface WebResponse {\n json: any;\n body?: string;\n status: number;\n url?: string;\n headers: Headers;\n controller?: AbortController;\n redirected?: boolean;\n}\n\nexport const postUrl = (\n url: string,\n payload: any,\n headers: any = {},\n contentType = null\n): Promise<WebResponse> => {\n const fetchHeaders = getHeaders(headers);\n\n if (contentType) {\n fetchHeaders['Content-Type'] = contentType;\n }\n\n const options = {\n method: 'POST',\n headers: fetchHeaders,\n body: payload\n };\n\n return new Promise<WebResponse>((resolve, reject) => {\n fetch(url, options)\n .then(async (response) => {\n if (response.status >= 500) {\n reject(response);\n return;\n }\n\n const toasts = response.headers.get('X-Temba-Toasts');\n if (toasts) {\n const toastEle = document.querySelector('temba-toast') as Toast;\n if (toastEle) {\n toastEle.addMessages(JSON.parse(toasts));\n }\n }\n\n response.text().then((body: string) => {\n let json = {};\n try {\n json = JSON.parse(body);\n // eslint-disable-next-line no-empty\n } catch (err) {}\n resolve({\n body,\n json,\n headers: response.headers,\n status: response.status,\n redirected: response.redirected,\n url: response.url\n });\n });\n })\n .catch((error) => {\n reject(error);\n });\n });\n};\n\nexport const postJSON = (url: string, payload: any): Promise<WebResponse> => {\n return postUrl(url, JSON.stringify(payload), false, 'application/json');\n};\n\nexport const postFormData = (\n url: string,\n formData: FormData,\n headers: any = {}\n): Promise<WebResponse> => {\n return new Promise<WebResponse>((resolve, reject) => {\n postUrl(url, formData, headers)\n .then((response) => {\n if (response.status >= 200 && response.status < 400) {\n resolve(response);\n } else {\n if (url === DEFAULT_MEDIA_ENDPOINT) {\n reject(response);\n } else {\n reject('Server failure');\n }\n }\n })\n .catch((err) => {\n reject(err);\n });\n });\n};\n\nexport const postForm = (\n url: string,\n payload: any | FormData,\n headers: any = {}\n): Promise<WebResponse> => {\n const formData = new FormData();\n Object.keys(payload).forEach((key: string) => {\n formData.append(key, payload[key]);\n });\n return postFormData(url, formData, headers);\n};\n\n/**\n */\nexport const renderIf =\n (predicate: boolean | any) =>\n (then: () => TemplateResult, otherwise?: () => TemplateResult) => {\n return predicate ? then() : otherwise ? otherwise() : html``;\n };\n\nexport const hexToRgb = (hex: string): { r: number; g: number; b: number } => {\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\n return result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16)\n }\n : null;\n};\n\nexport const getElementOffset = (\n ele: HTMLElement\n): {\n top: number;\n left: number;\n bottom: number;\n right: number;\n width: number;\n height: number;\n} => {\n const rect = ele.getBoundingClientRect();\n const scrollLeft = window.pageXOffset || document.documentElement.scrollLeft;\n const scrollTop = window.pageYOffset || document.documentElement.scrollTop;\n return {\n top: rect.top + scrollTop,\n left: rect.left + scrollLeft,\n bottom: rect.top + rect.height,\n right: rect.left + rect.width,\n width: rect.width,\n height: rect.height\n };\n};\n\nexport const plural = (count: number, singular: string, plural: string) => {\n return count === 1 ? singular : plural;\n};\n\nexport const range = (start: number, end: number) =>\n Array.from({ length: end - start }, (v: number, k: number) => k + start);\n\nexport const fillTemplate = (\n template: string,\n replacements: { [key: string]: string | number }\n): TemplateResult => {\n for (const key in replacements) {\n const className = key + '-replaced';\n replacements[\n key\n ] = `<span class=\"${className}\">${replacements[key]}</span>`;\n }\n\n const templateDiv = document.createElement('div');\n // templateDiv.innerHTML = dynamicTemplate(template, replacements);\n return html` ${templateDiv} `;\n};\n\n/*!\n * Serialize all form data into a query string\n * (c) 2018 Chris Ferdinandi, MIT License, https://gomakethings.com\n * @param {Node} form The form to serialize\n * @return {String} The serialized form data\n */\nexport const serialize = function (form: any) {\n // Setup our serialized data\n const serialized = [];\n\n // Loop through each field in the form\n for (let i = 0; i < form.elements.length; i++) {\n const field = form.elements[i];\n\n // Don't serialize fields without a name, submits, buttons, file and reset inputs, and disabled fields\n if (\n !field.name ||\n field.disabled ||\n field.type === 'file' ||\n field.type === 'reset' ||\n field.type === 'submit' ||\n field.type === 'button'\n )\n continue;\n\n // If a multi-select, get all selections\n if (field.type === 'select-multiple') {\n for (let n = 0; n < field.options.length; n++) {\n if (!field.options[n].selected) continue;\n if (field.options[n].value) {\n serialized.push(\n encodeURIComponent(field.name) +\n '=' +\n encodeURIComponent(field.options[n].value)\n );\n }\n }\n }\n\n // Convert field data to a query string\n else if (\n (field.type !== 'checkbox' && field.type !== 'radio') ||\n field.checked\n ) {\n let value = field.value;\n if (!value && field.checked) {\n value = '1';\n }\n\n if (value) {\n serialized.push(\n encodeURIComponent(field.name) + '=' + encodeURIComponent(value)\n );\n }\n }\n }\n return serialized.join('&');\n};\n\nexport const getScrollParent = (node: any): any => {\n const parent = node.parentNode || node.host;\n if (parent) {\n const isElement = parent instanceof HTMLElement;\n const overflowY = isElement && window.getComputedStyle(parent).overflowY;\n const isScrollable =\n overflowY &&\n !(overflowY.includes('hidden') || overflowY.includes('visible'));\n\n if (!parent) {\n return null;\n } else if (isScrollable && parent.scrollHeight >= parent.clientHeight) {\n return parent;\n }\n\n return getScrollParent(parent);\n }\n return null;\n};\n\nexport const isElementVisible = (el: any, holder?: any) => {\n holder = holder || document.body;\n const { top, bottom } = el.getBoundingClientRect();\n const holderRect = holder.getBoundingClientRect();\n\n return top <= holderRect.top\n ? bottom > holderRect.top\n : bottom < holderRect.bottom;\n};\n\nconst HOUR = 3600;\nconst DAY = HOUR * 24;\nconst MONTH = DAY * 30;\n\nexport class Stubbable {\n public getCurrentDate() {\n return new Date();\n }\n}\n\nexport const stubbable = new Stubbable();\n\nexport const spreadAttributes = (obj): TemplateResult[] => {\n return Object.entries(obj).map(([key, value]) => {\n if (key.startsWith('@')) {\n return html`@${key.slice(1)}=${value}`;\n } else if (key.startsWith('.')) {\n return html`.${key.slice(1)}=${value}`;\n } else {\n return html`${key}=${value}`;\n }\n });\n};\n\nexport const timeSince = (\n date: Date,\n options: { compareDate?: Date; hideRecentText?: boolean; suffix?: string } = {\n suffix: ''\n }\n) => {\n const { compareDate, hideRecentText, suffix } = options;\n const now = compareDate || stubbable.getCurrentDate();\n const secondsPast = Math.floor((now.getTime() - date.getTime()) / 1000);\n\n if (secondsPast < 60) {\n if (compareDate) {\n return secondsPast + 's' + suffix;\n }\n\n if (!hideRecentText && suffix) {\n return suffix;\n }\n return 'just now';\n }\n\n if (secondsPast < HOUR) {\n return Math.round(secondsPast / 60) + 'm' + suffix;\n }\n\n if (secondsPast <= DAY) {\n return Math.round(secondsPast / HOUR) + 'h' + suffix;\n }\n\n if (secondsPast <= MONTH) {\n return Math.round(secondsPast / DAY) + 'd' + suffix;\n }\n\n if (secondsPast < MONTH * 6) {\n return Math.round(secondsPast / MONTH) + 'mth' + suffix;\n } else {\n const day = date.getDate();\n const month = date\n .toDateString()\n .match(/ [a-zA-Z]*/)[0]\n .replace(' ', '');\n const year =\n date.getFullYear() == now.getFullYear() ? '' : ' ' + date.getFullYear();\n return day + ' ' + month + year;\n }\n};\n\nexport const isDate = (value: any): boolean => {\n if (toString.call(value) === '[object Date]') {\n return true;\n }\n /* c8 ignore next 3 */\n if (typeof value.replace === 'function') {\n value.replace(/^\\s+|\\s+$/gm, '');\n }\n\n // value = value.split(\"+\")[0];\n return DATE_FORMAT.test(value);\n};\n\nexport const debounce = (fn: any, millis: number, immediate = false) => {\n let timeout: any;\n return function (...args: any) {\n const context = this;\n const later = function () {\n timeout = null;\n if (!immediate) {\n fn.apply(context, args);\n }\n };\n const callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, millis);\n if (callNow) {\n fn.apply(context, args);\n }\n };\n};\n\nexport const throttle = (fn: any, millis: number) => {\n let ready = true;\n return function (...args: any) {\n const context = this;\n if (!ready) {\n return;\n }\n\n ready = false;\n fn.apply(context, args);\n setTimeout(() => {\n ready = true;\n }, millis);\n };\n};\n\nexport interface NamedObject {\n name: string;\n}\n\nexport const truncate = (input: string, max: number): string => {\n if (input.length > max) {\n return input.substring(0, max) + '...';\n }\n\n return input;\n};\n\nexport const oxford = (items: any[], joiner = 'and'): any => {\n if (items.length === 0) {\n return '';\n }\n\n if (items.length === 1) {\n return items[0];\n }\n\n if (items.length === 2) {\n // TemplateResults get a different treatment\n if (typeof items[0] === 'object') {\n return html`${items[0]} ${joiner} ${items[1]}`;\n }\n return items.join(' ' + joiner + ' ');\n }\n\n // TemplateResults get a different treatment\n if (typeof items[0] === 'object') {\n return items.map((tr: TemplateResult, idx: number) => {\n if (idx < items.length - 1) {\n return html`${tr}, `;\n }\n return html`${joiner} ${tr}`;\n });\n }\n\n const allButLast = items.slice(0, -1);\n const last = items[items.length - 1];\n return allButLast.join(', ') + ', ' + joiner + ' ' + last;\n};\n\nexport const oxfordFn = (\n items: any[],\n fn: (item: any) => any,\n joiner = 'and'\n): any => {\n return oxford(items.map(fn), joiner);\n};\n\nexport const oxfordNamed = (items: NamedObject[], joiner = 'and'): any => {\n return oxfordFn(items, (value: any) => value.name, joiner);\n};\n\nexport const getDialog = (button: Button): Dialog => {\n return (button.getRootNode() as ShadowRoot).host as Dialog;\n};\n\nexport const setCookie = (name: string, value: any, path = undefined) => {\n if (!path) {\n // default path is the first word in the url\n const url = document.location.pathname;\n path = url.substring(0, url.indexOf('/', 1));\n }\n const now = new Date();\n now.setTime(now.getTime() + 60 * 1000 * 60 * 24 * 30);\n document.cookie = `${name}=${value};expires=${now.toUTCString()};path=${path}`;\n};\n\nexport const getCookie = (name: string) => {\n let cookieValue = null;\n if (document.cookie && document.cookie != '') {\n const cookies = document.cookie.split(';');\n for (let i = 0; i < cookies.length; i++) {\n const cookie = cookies[i].trim();\n // Does this cookie string begin with the name we want?\n if (cookie.substring(0, name.length + 1) == name + '=') {\n cookieValue = decodeURIComponent(cookie.substring(name.length + 1));\n break;\n }\n }\n }\n return cookieValue;\n};\n\nexport const getCookieBoolean = (name: string) => {\n return (getCookie(name) || '') === 'true';\n};\n\nexport enum COOKIE_KEYS {\n SETTINGS = 'settings',\n MENU_COLLAPSED = 'menu-collapsed',\n TICKET_SHOW_DETAILS = 'tickets.show-details'\n}\n\nexport const capitalize = (\n [first, ...rest]: string[] | string,\n locale = navigator.language\n) =>\n first === undefined ? '' : first.toLocaleUpperCase(locale) + rest.join('');\n\nexport const formatFileType = (type: string): string => {\n return type.split('/')[1];\n};\nexport const formatFileSize = (\n bytes: number,\n decimalPoint?: number\n): string => {\n if (bytes == 0) return '0 KB';\n const k = 1024,\n dm = decimalPoint || 2,\n sizes = ['B', 'KB', 'MB', 'GB'], //, 'TB', 'PB', 'EB', 'ZB', 'YB'],\n i = Math.floor(Math.log(bytes) / Math.log(k));\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\n};\n\nexport const isImageAttachment = (attachment: Attachment) => {\n if (attachment) {\n return attachment.content_type.split('/')[0] === 'image';\n }\n return false;\n};\n\nexport const stopEvent = (event: Event) => {\n if (event) {\n event.stopPropagation();\n event.preventDefault();\n }\n};\n\n/**\n * Extracts 2-letter initials from text like a workspace or user name\n * @param text the input text\n * @returns the initials\n */\nexport const extractInitials = (text: string) => {\n text = text.trim();\n\n // split into words, first allowing hypens inside words,\n // then splitting by hypen to try to get more than one word\n let words =\n text.match(/(([\\p{L}\\p{N}]+-[\\p{L}\\p{N}]+)|([\\p{L}\\p{N}]+))/gu) || [];\n if (words.length == 1) {\n words = text.match(/[\\p{L}\\p{N}]+/gu);\n }\n\n // for the case of no words use ? and for only one word take first 2 characters\n if (words.length == 0) {\n return '?';\n } else if (words.length == 1) {\n return words[0].substring(0, 2).toUpperCase();\n }\n\n // use initial letters of words with preference to first word and capital letters\n const firstLetters = words.map((w) => w.substring(0, 1));\n const firstCapitals = firstLetters.filter(\n (l, index) => l == l.toUpperCase() || index == 0\n );\n if (firstCapitals.length >= 2) {\n return (firstCapitals[0] + firstCapitals[1]).toUpperCase();\n } else {\n return (firstLetters[0] + firstLetters[1]).toUpperCase();\n }\n};\n\nexport const hslToHex = (h, s, l) => {\n l /= 100;\n const a = (s * Math.min(l, 1 - l)) / 100;\n const f = (n) => {\n const k = (n + h / 30) % 12;\n const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return Math.round(255 * color)\n .toString(16)\n .padStart(2, '0'); // convert to Hex and prefix \"0\" if needed\n };\n return `#${f(0)}${f(8)}${f(4)}`;\n};\n\nexport const darkenColor = (color: string, factor: number): string => {\n // If rgba or rgb\n const rgbaMatch = color.match(\n /rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([0-9.]+))?\\)/\n );\n if (rgbaMatch) {\n // eslint-disable-next-line prefer-const\n let [r, g, b, a] = rgbaMatch\n .slice(1)\n .map((v, i) => (i < 3 ? parseInt(v) : parseFloat(v)));\n r = Math.max(0, Math.floor(r * (1 - factor)));\n g = Math.max(0, Math.floor(g * (1 - factor)));\n b = Math.max(0, Math.floor(b * (1 - factor)));\n if (rgbaMatch[4] !== undefined) {\n return `rgba(${r},${g},${b},${a})`;\n }\n return `rgb(${r},${g},${b})`;\n }\n // If hex\n if (color.startsWith('#')) {\n let hex = color.replace('#', '');\n if (hex.length === 3) {\n hex = hex\n .split('')\n .map((c) => c + c)\n .join('');\n }\n const num = parseInt(hex, 16);\n let r = (num >> 16) & 255;\n let g = (num >> 8) & 255;\n let b = num & 255;\n r = Math.max(0, Math.floor(r * (1 - factor)));\n g = Math.max(0, Math.floor(g * (1 - factor)));\n b = Math.max(0, Math.floor(b * (1 - factor)));\n return `rgb(${r},${g},${b})`;\n }\n // fallback\n return color;\n};\n\nexport const renderAvatar = (input: {\n name?: string;\n user?: User;\n icon?: string;\n position?: string;\n scale?: number;\n}) => {\n if (!input.position) {\n input.position = 'right';\n }\n\n let text = input.name;\n if (input.user && input.user.first_name && input.user.last_name) {\n text = `${input.user.first_name} ${input.user.last_name}`;\n }\n\n let initials = '';\n let color = '';\n\n // just a url\n if (input.user && input.user.avatar) {\n color = `url('${input.user.avatar}') center / contain no-repeat`;\n } else if (text) {\n color = colorHash.hex(text);\n initials = extractInitials(text);\n }\n\n const avatar = html`\n <div\n style=\"display:flex; flex-direction: column; align-items:center;transform:scale(${input.scale ||\n 1});\"\n >\n <div\n class=\"avatar-circle\"\n style=\"\n display: flex;\n height: 30px;\n width: 30px;\n flex-direction: row;\n align-items: center;\n color: #fff;\n border-radius: 100%;\n font-weight: 400;\n overflow: hidden;\n font-size: 12px;\n box-shadow: inset 0 0 0 3px rgba(0, 0, 0, 0.1);\n background:${color}\"\n >\n ${initials\n ? html` <div\n style=\"border: 0px solid red; display:flex; flex-direction: column; align-items:center;flex-grow:1\"\n >\n <div style=\"border:0px solid blue;\">${initials}</div>\n </div>`\n : null}\n </div>\n </div>\n `;\n return avatar;\n};\n\nexport const hashCode = (s) => {\n return s.split('').reduce((a, b) => {\n a = (a << 5) - a + b.charCodeAt(0);\n return a & a;\n }, 0);\n};\n\nexport const showModax = (title: string, endpoint: string) => {\n (window as any).showModax(title, endpoint);\n};\nexport const sanitizeUnintendedUnicode = (text: string): string => {\n if (text) {\n return text\n .replace(/[\\u2018\\u2019]/g, \"'\") // Smart single quotes\n .replace(/[\\u201C\\u201D]/g, '\"') // Smart double quotes\n .replace(/[\\u2013\\u2014]/g, '-') // En/em dash\n .replace(/\\u2026/g, '...') // Horizontal ellipsis\n .replace(/\\u2002/g, ' '); // En space\n }\n return text;\n};\nexport const getCenter = (a: DOMRect, b: DOMRect) => {\n return a.left + a.width / 2 - b.width / 2;\n};\nexport const getMiddle = (a: DOMRect, b: DOMRect) => {\n return a.top + a.height / 2 - b.height / 2;\n};\n\n// Export the UUID function from the uuid package\nexport { generateUUID };\n\n// Helper types for router creation\nexport interface RouterCategory {\n uuid: string;\n name: string;\n exit_uuid: string;\n}\n\nexport interface RouterExit {\n uuid: string;\n destination_uuid: string | null;\n}\n\nexport interface RouterCase {\n uuid: string;\n type: string;\n arguments: string[];\n category_uuid: string;\n}\n\nexport interface CreateCategoryParams {\n name: string;\n existingCategories: any[];\n existingExits: any[];\n existingCases?: any[];\n caseConfig?: {\n type: string;\n arguments: string[];\n };\n}\n\n// Helper function to create or preserve a category with its exit and case\nexport const createOrPreserveCategory = (\n params: CreateCategoryParams\n): {\n category: RouterCategory;\n exit: RouterExit;\n case?: RouterCase;\n} => {\n const { name, existingCategories, existingExits, existingCases, caseConfig } =\n params;\n\n // Find existing category\n const existingCategory = existingCategories.find((cat) => cat.name === name);\n const existingExit = existingCategory\n ? existingExits.find((exit) => exit.uuid === existingCategory.exit_uuid)\n : null;\n const existingCase =\n existingCategory && existingCases\n ? existingCases.find(\n (case_) => case_.category_uuid === existingCategory.uuid\n )\n : null;\n\n // Use existing UUIDs or generate new ones\n const categoryUuid = existingCategory?.uuid || generateUUID();\n const exitUuid = existingExit?.uuid || generateUUID();\n const caseUuid = existingCase?.uuid || generateUUID();\n\n const category: RouterCategory = {\n uuid: categoryUuid,\n name: name,\n exit_uuid: exitUuid\n };\n\n const exit: RouterExit = {\n uuid: exitUuid,\n destination_uuid: existingExit?.destination_uuid || null\n };\n\n const result: {\n category: RouterCategory;\n exit: RouterExit;\n case?: RouterCase;\n } = { category, exit };\n\n if (caseConfig) {\n result.case = {\n uuid: caseUuid,\n type: caseConfig.type,\n arguments: caseConfig.arguments,\n category_uuid: categoryUuid\n };\n }\n\n return result;\n};\n\n// Helper function to create a complete router with standard Success/Failure categories\nexport const createSuccessFailureRouter = (\n operand: string,\n successCaseConfig: { type: string; arguments: string[] },\n existingCategories: any[] = [],\n existingExits: any[] = [],\n existingCases: any[] = []\n) => {\n const success = createOrPreserveCategory({\n name: 'Success',\n existingCategories,\n existingExits,\n existingCases,\n caseConfig: successCaseConfig\n });\n\n const failure = createOrPreserveCategory({\n name: 'Failure',\n existingCategories,\n existingExits\n });\n\n return {\n router: {\n type: 'switch' as const,\n categories: [success.category, failure.category],\n default_category_uuid: failure.category.uuid,\n operand: operand,\n cases: success.case ? [success.case] : []\n },\n exits: [success.exit, failure.exit]\n };\n};\n\n// Helper function to create a multi-category router with Other/Failure defaults\nexport const createMultiCategoryRouter = (\n operand: string,\n userCategories: string[],\n categoryToCaseMap: (categoryName: string) => {\n type: string;\n arguments: string[];\n },\n existingCategories: any[] = [],\n existingExits: any[] = [],\n existingCases: any[] = []\n) => {\n const categories: RouterCategory[] = [];\n const exits: RouterExit[] = [];\n const cases: RouterCase[] = [];\n\n // Add user categories\n userCategories.forEach((categoryName) => {\n const result = createOrPreserveCategory({\n name: categoryName,\n existingCategories,\n existingExits,\n existingCases,\n caseConfig: categoryToCaseMap(categoryName)\n });\n\n categories.push(result.category);\n exits.push(result.exit);\n if (result.case) {\n cases.push(result.case);\n }\n });\n\n // Add \"Other\" category (default)\n const other = createOrPreserveCategory({\n name: 'Other',\n existingCategories,\n existingExits\n });\n categories.push(other.category);\n exits.push(other.exit);\n\n // Add \"Failure\" category\n const failure = createOrPreserveCategory({\n name: 'Failure',\n existingCategories,\n existingExits,\n existingCases,\n caseConfig: {\n type: 'has_only_text',\n arguments: ['<ERROR>']\n }\n });\n categories.push(failure.category);\n exits.push(failure.exit);\n if (failure.case) {\n cases.push(failure.case);\n }\n\n return {\n router: {\n type: 'switch' as const,\n categories: categories,\n default_category_uuid: other.category.uuid,\n operand: operand,\n cases: cases\n },\n exits: exits\n };\n};\n\nexport const titleCase = (str: string) => {\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();\n};\n"]}
@@ -21,12 +21,6 @@ describe('split_by_random node config', () => {
21
21
  expect(split_by_random.router).to.exist;
22
22
  expect(split_by_random.router.type).to.equal('random');
23
23
  });
24
- it('is a simple node config without form or layout', () => {
25
- expect(split_by_random.form).to.be.undefined;
26
- expect(split_by_random.layout).to.be.undefined;
27
- expect(split_by_random.toFormData).to.be.undefined;
28
- expect(split_by_random.fromFormData).to.be.undefined;
29
- });
30
24
  });
31
25
  describe('node scenarios', () => {
32
26
  helper.testNode({
@@ -1 +1 @@
1
- {"version":3,"file":"split_by_random.test.js","sourceRoot":"","sources":["../../../test/nodes/split_by_random.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { split_by_random } from '../../src/flow/nodes/split_by_random';\nimport { Node } from '../../src/store/flow-definition';\nimport { NodeTest } from '../NodeHelper';\n\n/**\n * Test suite for the split_by_random node configuration.\n */\ndescribe('split_by_random node config', () => {\n const helper = new NodeTest(split_by_random, 'split_by_random');\n\n describe('basic properties', () => {\n helper.testBasicProperties();\n\n it('has correct name', () => {\n expect(split_by_random.name).to.equal('Split by Random');\n });\n\n it('has correct type', () => {\n expect(split_by_random.type).to.equal('split_by_random');\n });\n\n it('has correct color', () => {\n expect(split_by_random.color).to.exist;\n });\n\n it('has router configuration', () => {\n expect(split_by_random.router).to.exist;\n expect(split_by_random.router.type).to.equal('random');\n });\n\n it('is a simple node config without form or layout', () => {\n expect(split_by_random.form).to.be.undefined;\n expect(split_by_random.layout).to.be.undefined;\n expect(split_by_random.toFormData).to.be.undefined;\n expect(split_by_random.fromFormData).to.be.undefined;\n });\n });\n\n describe('node scenarios', () => {\n helper.testNode(\n {\n uuid: 'test-random-node-1',\n actions: [],\n router: {\n type: 'random',\n categories: [\n {\n uuid: 'random-cat-1',\n name: 'Bucket A',\n exit_uuid: 'random-exit-1'\n },\n {\n uuid: 'random-cat-2',\n name: 'Bucket B',\n exit_uuid: 'random-exit-2'\n }\n ]\n },\n exits: [\n { uuid: 'random-exit-1', destination_uuid: null },\n { uuid: 'random-exit-2', destination_uuid: null }\n ]\n } as Node,\n { type: 'split_by_random' },\n 'two-bucket-split'\n );\n\n helper.testNode(\n {\n uuid: 'test-random-node-2',\n actions: [],\n router: {\n type: 'random',\n categories: [\n {\n uuid: 'random-cat-1',\n name: 'Group A',\n exit_uuid: 'random-exit-1'\n },\n {\n uuid: 'random-cat-2',\n name: 'Group B',\n exit_uuid: 'random-exit-2'\n },\n {\n uuid: 'random-cat-3',\n name: 'Group C',\n exit_uuid: 'random-exit-3'\n }\n ]\n },\n exits: [\n { uuid: 'random-exit-1', destination_uuid: null },\n { uuid: 'random-exit-2', destination_uuid: null },\n { uuid: 'random-exit-3', destination_uuid: null }\n ]\n } as Node,\n { type: 'split_by_random' },\n 'three-way-split'\n );\n\n helper.testNode(\n {\n uuid: 'test-random-node-3',\n actions: [],\n router: {\n type: 'random',\n categories: [\n {\n uuid: 'random-cat-1',\n name: 'Treatment',\n exit_uuid: 'random-exit-1'\n },\n {\n uuid: 'random-cat-2',\n name: 'Control',\n exit_uuid: 'random-exit-2'\n },\n {\n uuid: 'random-cat-3',\n name: 'Variant A',\n exit_uuid: 'random-exit-3'\n },\n {\n uuid: 'random-cat-4',\n name: 'Variant B',\n exit_uuid: 'random-exit-4'\n },\n {\n uuid: 'random-cat-5',\n name: 'Holdout',\n exit_uuid: 'random-exit-5'\n }\n ]\n },\n exits: [\n { uuid: 'random-exit-1', destination_uuid: null },\n { uuid: 'random-exit-2', destination_uuid: null },\n { uuid: 'random-exit-3', destination_uuid: null },\n { uuid: 'random-exit-4', destination_uuid: null },\n { uuid: 'random-exit-5', destination_uuid: null }\n ]\n } as Node,\n { type: 'split_by_random' },\n 'ab-test-multiple-variants'\n );\n\n helper.testNode(\n {\n uuid: 'test-random-node-4',\n actions: [],\n router: {\n type: 'random',\n categories: [\n {\n uuid: 'random-cat-1',\n name: 'Sample Group',\n exit_uuid: 'random-exit-1'\n },\n {\n uuid: 'random-cat-2',\n name: 'Remaining Population',\n exit_uuid: 'random-exit-2'\n }\n ]\n },\n exits: [\n { uuid: 'random-exit-1', destination_uuid: null },\n { uuid: 'random-exit-2', destination_uuid: null }\n ]\n } as Node,\n { type: 'split_by_random' },\n 'sampling-split'\n );\n });\n});\n"]}
1
+ {"version":3,"file":"split_by_random.test.js","sourceRoot":"","sources":["../../../test/nodes/split_by_random.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { split_by_random } from '../../src/flow/nodes/split_by_random';\nimport { Node } from '../../src/store/flow-definition';\nimport { NodeTest } from '../NodeHelper';\n\n/**\n * Test suite for the split_by_random node configuration.\n */\ndescribe('split_by_random node config', () => {\n const helper = new NodeTest(split_by_random, 'split_by_random');\n\n describe('basic properties', () => {\n helper.testBasicProperties();\n\n it('has correct name', () => {\n expect(split_by_random.name).to.equal('Split by Random');\n });\n\n it('has correct type', () => {\n expect(split_by_random.type).to.equal('split_by_random');\n });\n\n it('has correct color', () => {\n expect(split_by_random.color).to.exist;\n });\n\n it('has router configuration', () => {\n expect(split_by_random.router).to.exist;\n expect(split_by_random.router.type).to.equal('random');\n });\n });\n\n describe('node scenarios', () => {\n helper.testNode(\n {\n uuid: 'test-random-node-1',\n actions: [],\n router: {\n type: 'random',\n categories: [\n {\n uuid: 'random-cat-1',\n name: 'Bucket A',\n exit_uuid: 'random-exit-1'\n },\n {\n uuid: 'random-cat-2',\n name: 'Bucket B',\n exit_uuid: 'random-exit-2'\n }\n ]\n },\n exits: [\n { uuid: 'random-exit-1', destination_uuid: null },\n { uuid: 'random-exit-2', destination_uuid: null }\n ]\n } as Node,\n { type: 'split_by_random' },\n 'two-bucket-split'\n );\n\n helper.testNode(\n {\n uuid: 'test-random-node-2',\n actions: [],\n router: {\n type: 'random',\n categories: [\n {\n uuid: 'random-cat-1',\n name: 'Group A',\n exit_uuid: 'random-exit-1'\n },\n {\n uuid: 'random-cat-2',\n name: 'Group B',\n exit_uuid: 'random-exit-2'\n },\n {\n uuid: 'random-cat-3',\n name: 'Group C',\n exit_uuid: 'random-exit-3'\n }\n ]\n },\n exits: [\n { uuid: 'random-exit-1', destination_uuid: null },\n { uuid: 'random-exit-2', destination_uuid: null },\n { uuid: 'random-exit-3', destination_uuid: null }\n ]\n } as Node,\n { type: 'split_by_random' },\n 'three-way-split'\n );\n\n helper.testNode(\n {\n uuid: 'test-random-node-3',\n actions: [],\n router: {\n type: 'random',\n categories: [\n {\n uuid: 'random-cat-1',\n name: 'Treatment',\n exit_uuid: 'random-exit-1'\n },\n {\n uuid: 'random-cat-2',\n name: 'Control',\n exit_uuid: 'random-exit-2'\n },\n {\n uuid: 'random-cat-3',\n name: 'Variant A',\n exit_uuid: 'random-exit-3'\n },\n {\n uuid: 'random-cat-4',\n name: 'Variant B',\n exit_uuid: 'random-exit-4'\n },\n {\n uuid: 'random-cat-5',\n name: 'Holdout',\n exit_uuid: 'random-exit-5'\n }\n ]\n },\n exits: [\n { uuid: 'random-exit-1', destination_uuid: null },\n { uuid: 'random-exit-2', destination_uuid: null },\n { uuid: 'random-exit-3', destination_uuid: null },\n { uuid: 'random-exit-4', destination_uuid: null },\n { uuid: 'random-exit-5', destination_uuid: null }\n ]\n } as Node,\n { type: 'split_by_random' },\n 'ab-test-multiple-variants'\n );\n\n helper.testNode(\n {\n uuid: 'test-random-node-4',\n actions: [],\n router: {\n type: 'random',\n categories: [\n {\n uuid: 'random-cat-1',\n name: 'Sample Group',\n exit_uuid: 'random-exit-1'\n },\n {\n uuid: 'random-cat-2',\n name: 'Remaining Population',\n exit_uuid: 'random-exit-2'\n }\n ]\n },\n exits: [\n { uuid: 'random-exit-1', destination_uuid: null },\n { uuid: 'random-exit-2', destination_uuid: null }\n ]\n } as Node,\n { type: 'split_by_random' },\n 'sampling-split'\n );\n });\n});\n"]}
@@ -104,7 +104,7 @@ describe('FieldRenderer', () => {
104
104
  options: ['United States', 'Canada', 'United Kingdom', 'Australia'],
105
105
  searchable: true
106
106
  };
107
- const template = FieldRenderer.renderField('country', config, 'Canada', {
107
+ const template = FieldRenderer.renderField('country', config, [{ name: 'Canada', value: 'Canada' }], {
108
108
  errors: [],
109
109
  showLabel: true,
110
110
  onChange: () => { }
@@ -120,7 +120,10 @@ describe('FieldRenderer', () => {
120
120
  multi: true,
121
121
  tags: true
122
122
  };
123
- const template = FieldRenderer.renderField('skills', config, ['JavaScript', 'TypeScript'], {
123
+ const template = FieldRenderer.renderField('skills', config, [
124
+ { name: 'JavaScript', value: 'JavaScript' },
125
+ { name: 'TypeScript', value: 'TypeScript' }
126
+ ], {
124
127
  errors: [],
125
128
  showLabel: true,
126
129
  onChange: () => { }
@@ -134,7 +137,7 @@ describe('FieldRenderer', () => {
134
137
  label: 'Status',
135
138
  options: ['Active', 'Inactive', 'Pending']
136
139
  };
137
- const template = FieldRenderer.renderField('status', config, 'Active', {
140
+ const template = FieldRenderer.renderField('status', config, [{ name: 'Active', value: 'Active' }], {
138
141
  errors: [],
139
142
  showLabel: false,
140
143
  flavor: 'small',
@@ -1 +1 @@
1
- {"version":3,"file":"temba-field-renderer.test.js","sourceRoot":"","sources":["../../test/temba-field-renderer.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, html } from '@open-wc/testing';\nimport { FieldRenderer } from '../src/form/FieldRenderer';\nimport {\n TextFieldConfig,\n TextareaFieldConfig,\n SelectFieldConfig,\n CheckboxFieldConfig,\n KeyValueFieldConfig,\n MessageEditorFieldConfig\n} from '../src/flow/types';\nimport { assertScreenshot, getClip } from './utils.test';\n\ndescribe('FieldRenderer', () => {\n describe('text fields', () => {\n it('should render text field with label', async () => {\n const config: TextFieldConfig = {\n type: 'text',\n label: 'Website URL',\n placeholder: 'Enter URL'\n };\n\n const template = FieldRenderer.renderField(\n 'url',\n config,\n 'https://example.com',\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/text-with-label',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render evaluated text field with completion', async () => {\n const config: TextFieldConfig = {\n type: 'text',\n label: 'Dynamic URL',\n evaluated: true,\n placeholder: 'Enter URL with expressions'\n };\n\n const template = FieldRenderer.renderField(\n 'url',\n config,\n 'https://api.com/@contact.name',\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/text-evaluated',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render text field without label for ArrayEditor context', async () => {\n const config: TextFieldConfig = {\n type: 'text',\n label: 'Item Name',\n placeholder: 'Enter name'\n };\n\n const template = FieldRenderer.renderField(\n 'name',\n config,\n 'Sample Item',\n {\n errors: [],\n showLabel: false,\n flavor: 'small',\n extraClasses: 'form-control',\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 300px; padding: 10px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/text-no-label',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render text field with errors', async () => {\n const config: TextFieldConfig = {\n type: 'text',\n label: 'Email Address',\n placeholder: 'Enter email'\n };\n\n const template = FieldRenderer.renderField(\n 'email',\n config,\n 'invalid-email',\n {\n errors: ['Invalid email format', 'Email is required'],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/text-with-errors',\n getClip(container as HTMLElement)\n );\n });\n });\n\n describe('textarea fields', () => {\n it('should render textarea with label', async () => {\n const config: TextareaFieldConfig = {\n type: 'textarea',\n label: 'Description',\n placeholder: 'Enter description',\n rows: 4\n };\n\n const template = FieldRenderer.renderField(\n 'description',\n config,\n 'This is a sample description\\nwith multiple lines',\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/textarea-with-label',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render evaluated textarea with completion', async () => {\n const config: TextareaFieldConfig = {\n type: 'textarea',\n label: 'Message Template',\n evaluated: true,\n placeholder: 'Enter message with expressions',\n rows: 3\n };\n\n const template = FieldRenderer.renderField(\n 'message',\n config,\n 'Hello @contact.name,\\nYour order is ready!',\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/textarea-evaluated',\n getClip(container as HTMLElement)\n );\n });\n });\n\n describe('select fields', () => {\n it('should render select field with label', async () => {\n const config: SelectFieldConfig = {\n type: 'select',\n label: 'Country',\n options: ['United States', 'Canada', 'United Kingdom', 'Australia'],\n searchable: true\n };\n\n const template = FieldRenderer.renderField('country', config, 'Canada', {\n errors: [],\n showLabel: true,\n onChange: () => {}\n });\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/select-with-label',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render multi-select field', async () => {\n const config: SelectFieldConfig = {\n type: 'select',\n label: 'Skills',\n options: ['JavaScript', 'Python', 'TypeScript', 'React', 'Node.js'],\n multi: true,\n tags: true\n };\n\n const template = FieldRenderer.renderField(\n 'skills',\n config,\n ['JavaScript', 'TypeScript'],\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/select-multi',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render select field without label for ArrayEditor context', async () => {\n const config: SelectFieldConfig = {\n type: 'select',\n label: 'Status',\n options: ['Active', 'Inactive', 'Pending']\n };\n\n const template = FieldRenderer.renderField('status', config, 'Active', {\n errors: [],\n showLabel: false,\n flavor: 'small',\n extraClasses: 'form-control',\n onChange: () => {}\n });\n\n const container = await fixture(\n html`<div style=\"width: 200px; padding: 10px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/select-no-label',\n getClip(container as HTMLElement)\n );\n });\n });\n\n describe('checkbox fields', () => {\n it('should render checkbox with label', async () => {\n const config: CheckboxFieldConfig = {\n type: 'checkbox',\n label: 'Accept Terms and Conditions'\n };\n\n const template = FieldRenderer.renderField('accept', config, true, {\n errors: [],\n showLabel: true,\n onChange: () => {}\n });\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/checkbox-checked',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render unchecked checkbox', async () => {\n const config: CheckboxFieldConfig = {\n type: 'checkbox',\n label: 'Subscribe to newsletter'\n };\n\n const template = FieldRenderer.renderField('subscribe', config, false, {\n errors: [],\n showLabel: true,\n onChange: () => {}\n });\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/checkbox-unchecked',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render checkbox with errors', async () => {\n const config: CheckboxFieldConfig = {\n type: 'checkbox',\n label: 'Agree to terms',\n required: true\n };\n\n const template = FieldRenderer.renderField('terms', config, false, {\n errors: ['You must accept the terms to continue'],\n showLabel: true,\n onChange: () => {}\n });\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/checkbox-with-errors',\n getClip(container as HTMLElement)\n );\n });\n });\n\n describe('key-value fields', () => {\n it('should render key-value field with label', async () => {\n const config: KeyValueFieldConfig = {\n type: 'key-value',\n label: 'HTTP Headers',\n keyPlaceholder: 'Header name',\n valuePlaceholder: 'Header value'\n };\n\n const template = FieldRenderer.renderField(\n 'headers',\n config,\n [\n { key: 'Content-Type', value: 'application/json' },\n { key: 'Authorization', value: 'Bearer token123' }\n ],\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 500px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/key-value-with-label',\n getClip(container as HTMLElement)\n );\n });\n });\n\n describe('message-editor fields', () => {\n it('should render message-editor with label', async () => {\n const config: MessageEditorFieldConfig = {\n type: 'message-editor',\n label: 'Email Message',\n placeholder: 'Enter your message...',\n minHeight: 120\n };\n\n const template = FieldRenderer.renderField(\n 'message',\n config,\n 'Hello! This is a test message.',\n {\n errors: [],\n showLabel: true,\n onChange: () => {},\n additionalData: { attachments: [] }\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 500px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/message-editor-with-label',\n getClip(container as HTMLElement)\n );\n });\n });\n\n describe('field consistency', () => {\n it('should render the same field type consistently between contexts', async () => {\n const config: TextFieldConfig = {\n type: 'text',\n label: 'Product Name',\n placeholder: 'Enter product name'\n };\n\n // NodeEditor context (with label)\n const nodeEditorTemplate = FieldRenderer.renderField(\n 'product',\n config,\n 'iPhone 15',\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n // ArrayEditor context (without label)\n const arrayEditorTemplate = FieldRenderer.renderField(\n 'product',\n config,\n 'iPhone 15',\n {\n errors: [],\n showLabel: false,\n flavor: 'small',\n extraClasses: 'form-control',\n onChange: () => {}\n }\n );\n\n const nodeContainer = await fixture(html`<div\n style=\"width: 400px; padding: 20px; border: 1px solid #ddd; margin: 10px;\"\n >\n <h3 style=\"margin: 0 0 10px 0; font-size: 14px; color: #666;\">\n NodeEditor Context\n </h3>\n ${nodeEditorTemplate}\n </div>`);\n\n const arrayContainer = await fixture(html`<div\n style=\"width: 400px; padding: 20px; border: 1px solid #ddd; margin: 10px;\"\n >\n <h3 style=\"margin: 0 0 10px 0; font-size: 14px; color: #666;\">\n ArrayEditor Context\n </h3>\n ${arrayEditorTemplate}\n </div>`);\n\n const combinedContainer = await fixture(html`<div\n style=\"display: flex; flex-direction: column; width: 420px;\"\n >\n ${nodeContainer} ${arrayContainer}\n </div>`);\n\n await assertScreenshot(\n 'field-renderer/context-comparison',\n getClip(combinedContainer as HTMLElement)\n );\n });\n });\n\n describe('error handling', () => {\n it('should handle all field types without throwing errors', () => {\n const configs = [\n { type: 'text', label: 'Text' } as TextFieldConfig,\n { type: 'textarea', label: 'Textarea' } as TextareaFieldConfig,\n { type: 'select', label: 'Select', options: [] } as SelectFieldConfig,\n { type: 'checkbox', label: 'Checkbox' },\n { type: 'key-value', label: 'KeyValue' },\n { type: 'array', label: 'Array', itemConfig: {} },\n { type: 'message-editor', label: 'MessageEditor' }\n ];\n\n configs.forEach((config, index) => {\n expect(() => {\n FieldRenderer.renderField(`field${index}`, config as any, null, {\n errors: [],\n showLabel: true,\n onChange: () => {}\n });\n }).to.not.throw;\n });\n });\n });\n});\n"]}
1
+ {"version":3,"file":"temba-field-renderer.test.js","sourceRoot":"","sources":["../../test/temba-field-renderer.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect, fixture, html } from '@open-wc/testing';\nimport { FieldRenderer } from '../src/form/FieldRenderer';\nimport {\n TextFieldConfig,\n TextareaFieldConfig,\n SelectFieldConfig,\n CheckboxFieldConfig,\n KeyValueFieldConfig,\n MessageEditorFieldConfig\n} from '../src/flow/types';\nimport { assertScreenshot, getClip } from './utils.test';\n\ndescribe('FieldRenderer', () => {\n describe('text fields', () => {\n it('should render text field with label', async () => {\n const config: TextFieldConfig = {\n type: 'text',\n label: 'Website URL',\n placeholder: 'Enter URL'\n };\n\n const template = FieldRenderer.renderField(\n 'url',\n config,\n 'https://example.com',\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/text-with-label',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render evaluated text field with completion', async () => {\n const config: TextFieldConfig = {\n type: 'text',\n label: 'Dynamic URL',\n evaluated: true,\n placeholder: 'Enter URL with expressions'\n };\n\n const template = FieldRenderer.renderField(\n 'url',\n config,\n 'https://api.com/@contact.name',\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/text-evaluated',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render text field without label for ArrayEditor context', async () => {\n const config: TextFieldConfig = {\n type: 'text',\n label: 'Item Name',\n placeholder: 'Enter name'\n };\n\n const template = FieldRenderer.renderField(\n 'name',\n config,\n 'Sample Item',\n {\n errors: [],\n showLabel: false,\n flavor: 'small',\n extraClasses: 'form-control',\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 300px; padding: 10px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/text-no-label',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render text field with errors', async () => {\n const config: TextFieldConfig = {\n type: 'text',\n label: 'Email Address',\n placeholder: 'Enter email'\n };\n\n const template = FieldRenderer.renderField(\n 'email',\n config,\n 'invalid-email',\n {\n errors: ['Invalid email format', 'Email is required'],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/text-with-errors',\n getClip(container as HTMLElement)\n );\n });\n });\n\n describe('textarea fields', () => {\n it('should render textarea with label', async () => {\n const config: TextareaFieldConfig = {\n type: 'textarea',\n label: 'Description',\n placeholder: 'Enter description',\n rows: 4\n };\n\n const template = FieldRenderer.renderField(\n 'description',\n config,\n 'This is a sample description\\nwith multiple lines',\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/textarea-with-label',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render evaluated textarea with completion', async () => {\n const config: TextareaFieldConfig = {\n type: 'textarea',\n label: 'Message Template',\n evaluated: true,\n placeholder: 'Enter message with expressions',\n rows: 3\n };\n\n const template = FieldRenderer.renderField(\n 'message',\n config,\n 'Hello @contact.name,\\nYour order is ready!',\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/textarea-evaluated',\n getClip(container as HTMLElement)\n );\n });\n });\n\n describe('select fields', () => {\n it('should render select field with label', async () => {\n const config: SelectFieldConfig = {\n type: 'select',\n label: 'Country',\n options: ['United States', 'Canada', 'United Kingdom', 'Australia'],\n searchable: true\n };\n\n const template = FieldRenderer.renderField(\n 'country',\n config,\n [{ name: 'Canada', value: 'Canada' }],\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/select-with-label',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render multi-select field', async () => {\n const config: SelectFieldConfig = {\n type: 'select',\n label: 'Skills',\n options: ['JavaScript', 'Python', 'TypeScript', 'React', 'Node.js'],\n multi: true,\n tags: true\n };\n\n const template = FieldRenderer.renderField(\n 'skills',\n config,\n [\n { name: 'JavaScript', value: 'JavaScript' },\n { name: 'TypeScript', value: 'TypeScript' }\n ],\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/select-multi',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render select field without label for ArrayEditor context', async () => {\n const config: SelectFieldConfig = {\n type: 'select',\n label: 'Status',\n options: ['Active', 'Inactive', 'Pending']\n };\n\n const template = FieldRenderer.renderField(\n 'status',\n config,\n [{ name: 'Active', value: 'Active' }],\n {\n errors: [],\n showLabel: false,\n flavor: 'small',\n extraClasses: 'form-control',\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 200px; padding: 10px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/select-no-label',\n getClip(container as HTMLElement)\n );\n });\n });\n\n describe('checkbox fields', () => {\n it('should render checkbox with label', async () => {\n const config: CheckboxFieldConfig = {\n type: 'checkbox',\n label: 'Accept Terms and Conditions'\n };\n\n const template = FieldRenderer.renderField('accept', config, true, {\n errors: [],\n showLabel: true,\n onChange: () => {}\n });\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/checkbox-checked',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render unchecked checkbox', async () => {\n const config: CheckboxFieldConfig = {\n type: 'checkbox',\n label: 'Subscribe to newsletter'\n };\n\n const template = FieldRenderer.renderField('subscribe', config, false, {\n errors: [],\n showLabel: true,\n onChange: () => {}\n });\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/checkbox-unchecked',\n getClip(container as HTMLElement)\n );\n });\n\n it('should render checkbox with errors', async () => {\n const config: CheckboxFieldConfig = {\n type: 'checkbox',\n label: 'Agree to terms',\n required: true\n };\n\n const template = FieldRenderer.renderField('terms', config, false, {\n errors: ['You must accept the terms to continue'],\n showLabel: true,\n onChange: () => {}\n });\n\n const container = await fixture(\n html`<div style=\"width: 400px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/checkbox-with-errors',\n getClip(container as HTMLElement)\n );\n });\n });\n\n describe('key-value fields', () => {\n it('should render key-value field with label', async () => {\n const config: KeyValueFieldConfig = {\n type: 'key-value',\n label: 'HTTP Headers',\n keyPlaceholder: 'Header name',\n valuePlaceholder: 'Header value'\n };\n\n const template = FieldRenderer.renderField(\n 'headers',\n config,\n [\n { key: 'Content-Type', value: 'application/json' },\n { key: 'Authorization', value: 'Bearer token123' }\n ],\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 500px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/key-value-with-label',\n getClip(container as HTMLElement)\n );\n });\n });\n\n describe('message-editor fields', () => {\n it('should render message-editor with label', async () => {\n const config: MessageEditorFieldConfig = {\n type: 'message-editor',\n label: 'Email Message',\n placeholder: 'Enter your message...',\n minHeight: 120\n };\n\n const template = FieldRenderer.renderField(\n 'message',\n config,\n 'Hello! This is a test message.',\n {\n errors: [],\n showLabel: true,\n onChange: () => {},\n additionalData: { attachments: [] }\n }\n );\n\n const container = await fixture(\n html`<div style=\"width: 500px; padding: 20px;\">${template}</div>`\n );\n await assertScreenshot(\n 'field-renderer/message-editor-with-label',\n getClip(container as HTMLElement)\n );\n });\n });\n\n describe('field consistency', () => {\n it('should render the same field type consistently between contexts', async () => {\n const config: TextFieldConfig = {\n type: 'text',\n label: 'Product Name',\n placeholder: 'Enter product name'\n };\n\n // NodeEditor context (with label)\n const nodeEditorTemplate = FieldRenderer.renderField(\n 'product',\n config,\n 'iPhone 15',\n {\n errors: [],\n showLabel: true,\n onChange: () => {}\n }\n );\n\n // ArrayEditor context (without label)\n const arrayEditorTemplate = FieldRenderer.renderField(\n 'product',\n config,\n 'iPhone 15',\n {\n errors: [],\n showLabel: false,\n flavor: 'small',\n extraClasses: 'form-control',\n onChange: () => {}\n }\n );\n\n const nodeContainer = await fixture(html`<div\n style=\"width: 400px; padding: 20px; border: 1px solid #ddd; margin: 10px;\"\n >\n <h3 style=\"margin: 0 0 10px 0; font-size: 14px; color: #666;\">\n NodeEditor Context\n </h3>\n ${nodeEditorTemplate}\n </div>`);\n\n const arrayContainer = await fixture(html`<div\n style=\"width: 400px; padding: 20px; border: 1px solid #ddd; margin: 10px;\"\n >\n <h3 style=\"margin: 0 0 10px 0; font-size: 14px; color: #666;\">\n ArrayEditor Context\n </h3>\n ${arrayEditorTemplate}\n </div>`);\n\n const combinedContainer = await fixture(html`<div\n style=\"display: flex; flex-direction: column; width: 420px;\"\n >\n ${nodeContainer} ${arrayContainer}\n </div>`);\n\n await assertScreenshot(\n 'field-renderer/context-comparison',\n getClip(combinedContainer as HTMLElement)\n );\n });\n });\n\n describe('error handling', () => {\n it('should handle all field types without throwing errors', () => {\n const configs = [\n { type: 'text', label: 'Text' } as TextFieldConfig,\n { type: 'textarea', label: 'Textarea' } as TextareaFieldConfig,\n { type: 'select', label: 'Select', options: [] } as SelectFieldConfig,\n { type: 'checkbox', label: 'Checkbox' },\n { type: 'key-value', label: 'KeyValue' },\n { type: 'array', label: 'Array', itemConfig: {} },\n { type: 'message-editor', label: 'MessageEditor' }\n ];\n\n configs.forEach((config, index) => {\n expect(() => {\n FieldRenderer.renderField(`field${index}`, config as any, null, {\n errors: [],\n showLabel: true,\n onChange: () => {}\n });\n }).to.not.throw;\n });\n });\n });\n});\n"]}
@@ -104,6 +104,24 @@ export const mockAPI = () => {
104
104
  mockGET(url, key);
105
105
  }
106
106
  }
107
+ // Add mock data for contact form endpoints
108
+ mockGET(/\/api\/v2\/channels\.json/, {
109
+ results: [
110
+ { uuid: 'chan-1', name: 'WhatsApp Channel' },
111
+ { uuid: 'chan-2', name: 'Telegram Channel' },
112
+ { uuid: 'chan-3', name: 'SMS Channel' },
113
+ { uuid: 'chan-4', name: 'Facebook Messenger' }
114
+ ]
115
+ });
116
+ mockGET(/\/api\/v2\/languages\.json/, {
117
+ results: [
118
+ { iso: 'eng', name: 'English' },
119
+ { iso: 'spa', name: 'Spanish' },
120
+ { iso: 'fra', name: 'French' },
121
+ { iso: 'por', name: 'Portuguese' },
122
+ { iso: 'deu', name: 'German' }
123
+ ]
124
+ });
107
125
  };
108
126
  export const mockGET = (endpoint, body, headers = {}, status = '200') => {
109
127
  gets.push({ endpoint, body, headers, status });