@djangocfg/ui-tools 2.1.289 → 2.1.290

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 (97) hide show
  1. package/README.md +14 -3
  2. package/dist/{DocsLayout-YDR7DSMM.cjs → DocsLayout-IKH7BLSU.cjs} +1537 -682
  3. package/dist/DocsLayout-IKH7BLSU.cjs.map +1 -0
  4. package/dist/{DocsLayout-TKJQ5W5E.mjs → DocsLayout-JPXFUKAR.mjs} +1429 -574
  5. package/dist/DocsLayout-JPXFUKAR.mjs.map +1 -0
  6. package/dist/{PrettyCode.client-5GABIN2I.cjs → PrettyCode.client-RPDIE5CH.cjs} +104 -3
  7. package/dist/PrettyCode.client-RPDIE5CH.cjs.map +1 -0
  8. package/dist/{PrettyCode.client-IZTXXYHG.mjs → PrettyCode.client-SPMTQEG4.mjs} +106 -5
  9. package/dist/PrettyCode.client-SPMTQEG4.mjs.map +1 -0
  10. package/dist/{chunk-IULI4XII.cjs → chunk-5Q4UMSWB.cjs} +355 -9
  11. package/dist/chunk-5Q4UMSWB.cjs.map +1 -0
  12. package/dist/{chunk-VZGQC3NG.mjs → chunk-EFWOJPA6.mjs} +349 -9
  13. package/dist/chunk-EFWOJPA6.mjs.map +1 -0
  14. package/dist/index.cjs +10 -10
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.cts +18 -0
  17. package/dist/index.d.ts +18 -0
  18. package/dist/index.mjs +5 -5
  19. package/dist/index.mjs.map +1 -1
  20. package/package.json +18 -14
  21. package/src/components/markdown/MarkdownMessage.tsx +46 -0
  22. package/src/tools/OpenapiViewer/OpenapiViewer.story.tsx +87 -178
  23. package/src/tools/OpenapiViewer/README.md +114 -6
  24. package/src/tools/OpenapiViewer/components/DocsLayout/ApiIntroSection.tsx +20 -6
  25. package/src/tools/OpenapiViewer/components/DocsLayout/DocsView.tsx +6 -0
  26. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/CodeSamples/LanguageTabs.tsx +36 -0
  27. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/CodeSamples/index.tsx +56 -0
  28. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/CodeSamples/useCodeSnippet.ts +77 -0
  29. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Header/MetaActions.tsx +146 -0
  30. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Header/MethodBadge.tsx +6 -0
  31. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Header/PathDisplay.tsx +26 -0
  32. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Header/index.tsx +87 -0
  33. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Parameters/ParamGroup.tsx +30 -0
  34. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Parameters/ParamRow.tsx +36 -0
  35. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Parameters/index.tsx +22 -0
  36. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/RequestBody/index.tsx +33 -0
  37. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Responses/ResponseBody.tsx +76 -0
  38. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Responses/ResponseRow.tsx +80 -0
  39. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Responses/StatusTag.tsx +32 -0
  40. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Responses/index.tsx +21 -0
  41. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/SchemaFields/FieldRow.tsx +106 -0
  42. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/SchemaFields/buildTree.ts +127 -0
  43. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/SchemaFields/index.tsx +31 -0
  44. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/SchemaFields/types.ts +28 -0
  45. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Section/SectionHeader.tsx +87 -0
  46. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Section/defaults.ts +27 -0
  47. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/Section/index.tsx +45 -0
  48. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/context.tsx +56 -0
  49. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/hooks/useSectionHash.ts +63 -0
  50. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/index.tsx +96 -0
  51. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/store/index.ts +133 -0
  52. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/store/selectors.ts +40 -0
  53. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc/types.ts +17 -0
  54. package/src/tools/OpenapiViewer/components/DocsLayout/SchemaCopyMenu.tsx +8 -2
  55. package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/BrandHeader.tsx +48 -0
  56. package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/CategoryBlock.tsx +33 -0
  57. package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/EndpointRow.tsx +73 -0
  58. package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/MethodChips.tsx +43 -0
  59. package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/SchemaSection.tsx +27 -0
  60. package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/SearchInput.tsx +45 -0
  61. package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/SidebarBody.tsx +50 -0
  62. package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/Toolbar.tsx +64 -0
  63. package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/buildVM.ts +126 -0
  64. package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/index.tsx +112 -0
  65. package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/types.ts +42 -0
  66. package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar/useDebouncedValue.ts +14 -0
  67. package/src/tools/OpenapiViewer/components/DocsLayout/SlideInPlayground.tsx +10 -7
  68. package/src/tools/OpenapiViewer/components/DocsLayout/TryItSheet.tsx +9 -6
  69. package/src/tools/OpenapiViewer/components/shared/ResponsePanel/PrettyView.tsx +55 -0
  70. package/src/tools/OpenapiViewer/components/shared/ResponsePanel/PreviewView.tsx +115 -0
  71. package/src/tools/OpenapiViewer/components/shared/ResponsePanel/RawView.tsx +24 -0
  72. package/src/tools/OpenapiViewer/components/shared/ResponsePanel/StatusBar.tsx +63 -0
  73. package/src/tools/OpenapiViewer/components/shared/ResponsePanel/ViewTabs.tsx +45 -0
  74. package/src/tools/OpenapiViewer/components/shared/ResponsePanel/detectContent.ts +97 -0
  75. package/src/tools/OpenapiViewer/components/shared/ResponsePanel/index.tsx +93 -0
  76. package/src/tools/OpenapiViewer/components/shared/ResponsePanel/types.ts +26 -0
  77. package/src/tools/OpenapiViewer/components/shared/ResponsePanel/useResponseView.ts +62 -0
  78. package/src/tools/OpenapiViewer/hooks/useOpenApiSchema.ts +41 -71
  79. package/src/tools/OpenapiViewer/types.ts +10 -0
  80. package/src/tools/OpenapiViewer/utils/codeSamples.ts +287 -0
  81. package/src/tools/OpenapiViewer/utils/index.ts +3 -0
  82. package/src/tools/OpenapiViewer/utils/operationToHar.ts +119 -0
  83. package/src/tools/OpenapiViewer/utils/sampler.ts +72 -0
  84. package/src/tools/PrettyCode/PrettyCode.client.tsx +88 -1
  85. package/src/tools/PrettyCode/PrettyCode.story.tsx +114 -361
  86. package/src/tools/PrettyCode/index.tsx +13 -0
  87. package/src/tools/PrettyCode/lazy.tsx +5 -0
  88. package/src/tools/PrettyCode/registerPrismLanguages.ts +111 -0
  89. package/dist/DocsLayout-TKJQ5W5E.mjs.map +0 -1
  90. package/dist/DocsLayout-YDR7DSMM.cjs.map +0 -1
  91. package/dist/PrettyCode.client-5GABIN2I.cjs.map +0 -1
  92. package/dist/PrettyCode.client-IZTXXYHG.mjs.map +0 -1
  93. package/dist/chunk-IULI4XII.cjs.map +0 -1
  94. package/dist/chunk-VZGQC3NG.mjs.map +0 -1
  95. package/src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc.tsx +0 -273
  96. package/src/tools/OpenapiViewer/components/DocsLayout/Sidebar.tsx +0 -439
  97. package/src/tools/OpenapiViewer/components/shared/ResponsePanel.tsx +0 -127
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/tools/OpenapiViewer/hooks/useOpenApiSchema.ts","../src/tools/OpenapiViewer/hooks/useDocsUrlSync.ts","../src/tools/OpenapiViewer/hooks/useEndpointDraft.ts","../src/tools/OpenapiViewer/components/shared/EndpointDraftSync.tsx","../src/tools/OpenapiViewer/components/DocsLayout/anchor.ts","../src/tools/OpenapiViewer/components/shared/ui.tsx","../src/tools/OpenapiViewer/components/DocsLayout/sidebarLabel.ts","../src/tools/OpenapiViewer/components/DocsLayout/grouping.ts","../src/tools/OpenapiViewer/components/DocsLayout/SchemaCopyMenu.tsx","../src/tools/OpenapiViewer/components/DocsLayout/Sidebar.tsx","../src/tools/OpenapiViewer/utils/scrollParent.ts","../src/tools/OpenapiViewer/components/DocsLayout/ApiIntroSection.tsx","../src/tools/OpenapiViewer/components/DocsLayout/schemaFields.ts","../src/tools/OpenapiViewer/components/DocsLayout/EndpointDoc.tsx","../src/tools/OpenapiViewer/components/DocsLayout/DocsView.tsx","../src/tools/OpenapiViewer/components/shared/BodyFormEditor.tsx","../src/tools/OpenapiViewer/components/shared/EndpointResetButton.tsx","../src/tools/OpenapiViewer/components/shared/RequestPanel.tsx","../src/tools/OpenapiViewer/components/shared/ResponsePanel.tsx","../src/tools/OpenapiViewer/components/shared/SendButton.tsx","../src/tools/OpenapiViewer/components/DocsLayout/SlideInPlayground.tsx","../src/tools/OpenapiViewer/components/DocsLayout/TryItSheet.tsx","../src/tools/OpenapiViewer/components/DocsLayout/index.tsx"],"names":["__name","joinUrl","useState","useMemo","dereferenceSchema","resolveBaseUrl","useEffect","consola","useCallback","useRef","usePlaygroundContext","jsx","cn","jsxs","React","ChevronRight","relativePath","groupBy","orderBy","partition","sortBy","toMarkdown","toCompactJson","toRawJson","formatBytes","toast","DropdownMenu","DropdownMenuTrigger","Button","Sparkles","ChevronDown","DropdownMenuContent","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuItem","Check","deduplicateEndpoints","Combobox","Search","Input","CategoryBlock","EndpointRow","Tooltip","TooltipTrigger","TooltipContent","MarkdownMessage","endpointToMarkdown","Link2","CopyButton","Play","DocsView","SchemaSectionView","MAX_DEPTH","Switch","Textarea","Minus","Plus","RotateCcw","isValidJson","resolveAbsolute","findApiKeyById","parseRequestHeaders","Send","Fragment","Key","Terminal","PrettyCode_default","Loader2","WifiOff","JsonTree_default","UrlBuilder","AlertCircle","SidePanel","ResponsiveSheet","ResponsiveSheetContent","ResponsiveSheetHeader","ResponsiveSheetTitle","useMediaQuery","keyBy","Skeleton","TooltipProvider"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,SAAS,iBAAA,CAAkB,MAAA,EAAoC,KAAA,GAAQ,CAAA,EAAY;AACjF,EAAA,IAAI,CAAC,MAAA,IAAU,KAAA,GAAQ,CAAA,EAAG,OAAO,IAAA;AAIjC,EAAA,IAAI,MAAA,CAAO,OAAA,KAAY,MAAA,EAAW,OAAO,MAAA,CAAO,OAAA;AAChD,EAAA,IAAI,MAAA,CAAO,OAAA,KAAY,MAAA,EAAW,OAAO,MAAA,CAAO,OAAA;AAChD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAE9E,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,QAAA,EAAU;AACb,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,IAAc,EAAC;AACpC,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,iBAAA,CAAkB,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,MACzC;AACA,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,IACA,KAAK,OAAA;AACH,MAAA,OAAO,CAAC,iBAAA,CAAkB,MAAA,CAAO,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,IACpD,KAAK,SAAA;AAAA,IACL,KAAK,QAAA;AACH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,IAAI,OAAO,MAAA,KAAW,WAAA,0BAAoB,IAAI,IAAA,IAAO,WAAA,EAAY;AACjE,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,MAAA,EAAQ,OAAA,iBAAO,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AACzE,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,OAAA,EAAS,OAAO,kBAAA;AACtC,MAAA,IAAI,OAAO,MAAA,KAAW,KAAA,IAAS,MAAA,CAAO,MAAA,KAAW,OAAO,OAAO,qBAAA;AAC/D,MAAA,IAAI,MAAA,CAAO,MAAA,KAAW,MAAA,EAAQ,OAAO,sCAAA;AACrC,MAAA,OAAO,EAAA;AAAA,IACT;AAIE,MAAA,IAAI,OAAO,UAAA,EAAY;AACrB,QAAA,MAAM,MAA+B,EAAC;AACtC,QAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AACtD,UAAA,GAAA,CAAI,CAAC,CAAA,GAAI,iBAAA,CAAkB,CAAA,EAAG,QAAQ,CAAC,CAAA;AAAA,QACzC;AACA,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,OAAO,IAAA;AAAA;AAEb;AA7CSA,wBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAgDT,IAAM,eAAe,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAS,QAAQ,CAAA;AAO7D,IAAM,gBAAA,mBAAmBA,wBAAA,CAAA,CAAC,MAAA,EAAuB,OAAA,EAAiB,QAAA,KAAqC;AACrG,EAAA,MAAM,YAA2B,EAAC;AAElC,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,OAAO,EAAC;AAE3B,EAAA,KAAA,MAAW,CAAC,MAAM,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAC1D,IAAA,KAAA,MAAW,UAAU,YAAA,EAAc;AACjC,MAAA,MAAM,EAAA,GAAM,QAAgB,MAAM,CAAA;AAClC,MAAA,IAAI,CAAC,EAAA,EAAI;AAET,MAAA,MAAM,WAAA,GAAc,OAAO,WAAA,EAAY;AACvC,MAAA,MAAM,OAAA,GAAA,CAAW,EAAA,CAAG,OAAA,IAAW,EAAA,EAAI,IAAA,EAAK;AACxC,MAAA,MAAM,cAAc,EAAA,CAAG,WAAA,IAAe,WAAW,CAAA,EAAG,WAAW,IAAI,IAAI,CAAA,CAAA;AACvE,MAAA,MAAM,QAAA,GAAW,EAAA,CAAG,IAAA,GAAO,CAAC,CAAA,IAAK,OAAA;AAEjC,MAAA,MAAM,aAKD,EAAC;AAGN,MAAA,MAAM,SAAA,GAAY,CAAC,GAAK,OAAA,CAAgB,UAAA,IAAc,EAAC,EAAI,GAAI,EAAA,CAAG,UAAA,IAAc,EAAG,CAAA;AACnF,MAAA,KAAA,MAAW,SAAS,SAAA,EAAW;AAC7B,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,IAAA,EAAM,KAAA,CAAM,MAAA,EAAQ,IAAA,IAAQ,QAAA;AAAA,UAC5B,QAAA,EAAU,MAAM,QAAA,IAAY,KAAA;AAAA,UAC5B,aAAa,KAAA,CAAM;AAAA,SACpB,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,YAGD,EAAC;AAEN,MAAA,IAAI,GAAG,SAAA,EAAW;AAChB,QAAA,KAAA,MAAW,CAAC,MAAM,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,EAAA,CAAG,SAAS,CAAA,EAAG;AAC3D,UAAA,SAAA,CAAU,IAAA,CAAK;AAAA,YACb,IAAA;AAAA,YACA,WAAA,EAAc,QAAA,CAAiB,WAAA,IAAe,CAAA,SAAA,EAAY,IAAI,CAAA;AAAA,WAC/D,CAAA;AAAA,QACH;AAAA,MACF;AAKA,MAAA,IAAI,WAAA;AACJ,MAAA,IAAI,GAAG,WAAA,EAAa;AAClB,QAAA,MAAM,OAAA,GAAU,GAAG,WAAA,CAAY,OAAA;AAC/B,QAAA,MAAM,SAAA,GAAY,OAAA,GAAU,kBAAkB,CAAA,IAAK,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,OAAA,IAAW,EAAE,CAAA,CAAE,CAAC,CAAC,CAAA;AAC1F,QAAA,MAAM,YAAY,SAAA,EAAW,MAAA;AAC7B,QAAA,WAAA,GAAc;AAAA,UACZ,IAAA,EAAM,WAAW,IAAA,IAAQ,QAAA;AAAA,UACzB,WAAA,EAAa,GAAG,WAAA,CAAY,WAAA;AAAA,UAC5B,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,YACL,IAAA,CAAK,SAAA,CAAU,kBAAkB,SAAS,CAAA,EAAG,IAAA,EAAM,CAAC,CAAA,GACpD;AAAA,SACN;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAwB;AAAA,QAC5B,MAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,IAAA;AAAA,QAC/B,MAAA,EAAQ,WAAA;AAAA,QACR,IAAA,EAAM,OAAA,GAAUC,yBAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,GAAI,IAAA;AAAA,QACzC,OAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA,EAAY,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,MAAA;AAAA,QACjD,WAAA;AAAA,QACA,SAAA,EAAW,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,MAAA;AAAA,QAC9C;AAAA,OACF;AAEA,MAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT,CAAA,EApFyB,kBAAA,CAAA;AAuFzB,IAAM,aAAA,6CAAiB,SAAA,KAAuC;AAC5D,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,SAAA,CAAU,QAAQ,CAAC,QAAA,KAAa,WAAW,GAAA,CAAI,QAAA,CAAS,QAAQ,CAAC,CAAA;AACjE,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA,CAAE,IAAA,EAAK;AACrC,CAAA,EAJsB,eAAA,CAAA;AAOtB,IAAM,WAAA,mDAAqB,GAAA,KAAwC;AACjE,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,IAChC,OAAA,EAAS;AAAA,MACP,QAAA,EAAU;AAAA;AACZ,GACD,CAAA;AACD,EAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,SAAS,IAAA,EAAK;AACvB,CAAA,EAVoB,aAAA,CAAA;AA+BL,SAAR,gBAAA,CAAkC;AAAA,EACvC,OAAA;AAAA,EACA,eAAA;AAAA,EACA,OAAA,EAAS,aAAA;AAAA,EACT,UAAA,GAAa;AACf,CAAA,EAAkD;AAChD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,gBAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,gBAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,eAAA;AAAA,IAC5C,eAAA,IAAmB,OAAA,CAAQ,CAAC,CAAA,EAAG;AAAA,GACjC;AACA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,eAAA;AAAA,wBACpC,GAAA;AAAI,GACV;AAIA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,IAAIA,eAAA,iBAAuC,IAAI,KAAK,CAAA;AAEpF,EAAA,MAAM,aAAA,GAAgBC,cAAA;AAAA,IACpB,MAAM,QAAQ,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,eAAe,CAAA,IAAK,IAAA;AAAA,IACvD,CAAC,SAAS,eAAe;AAAA,GAC3B;AAEA,EAAA,MAAM,oBAAA,GAAuBA,cAAA;AAAA,IAC3B,MAAO,eAAA,GAAkB,aAAA,CAAc,GAAA,CAAI,eAAe,CAAA,GAAI,IAAA;AAAA,IAC9D,CAAC,eAAe,eAAe;AAAA,GACjC;AAMA,EAAA,MAAM,kBAAA,GAAqBA,cAAA;AAAA,IACzB,MAAO,oBAAA,GAAuBC,mCAAA,CAAkB,oBAAoB,CAAA,GAAI,IAAA;AAAA,IACxE,CAAC,oBAAoB;AAAA,GACvB;AAIA,EAAA,MAAM,eAAA,GAAkBD,cAAA;AAAA,IACtB,MACEE,gCAAA,CAAe;AAAA,MACb,cAAc,aAAA,EAAe,OAAA;AAAA,MAC7B,MAAA,EAAQ,aAAA;AAAA,MACR,WAAA,EAAa,oBAAA,EAAsB,OAAA,GAAU,CAAC,CAAA,EAAG;AAAA,KAClD,CAAA;AAAA,IACH,CAAC,aAAA,EAAe,OAAA,EAAS,aAAA,EAAe,oBAAoB;AAAA,GAC9D;AAEA,EAAA,MAAM,SAAA,GAAYF,cAAA;AAAA,IAChB,MACE,kBAAA,GACI,gBAAA,CAAiB,oBAAoB,eAAA,EAAiB,eAAe,IACrE,EAAC;AAAA,IACP,CAAC,kBAAA,EAAoB,eAAA,EAAiB,eAAe;AAAA,GACvD;AAEA,EAAA,MAAM,UAAA,GAAaA,eAAQ,MAAM,aAAA,CAAc,SAAS,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAEtE,EAAA,MAAM,UAAA,GAAaA,eAA4B,MAAM;AACnD,IAAA,IAAI,CAAC,oBAAA,EAAsB,IAAA,EAAM,OAAO,IAAA;AACxC,IAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,WAAA,KAAgB,oBAAA,CAAqB,IAAA;AAC7D,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAS,oBAAA,CAAqB;AAAA,KAChC;AAAA,EACF,CAAA,EAAG,CAAC,oBAAoB,CAAC,CAAA;AAGzB,EAAAG,gBAAA,CAAU,MAAM;AACd,IAAA,IAAI,UAAA,EAAY;AAChB,IAAA,IAAI,CAAC,aAAA,EAAe;AAGpB,IAAA,IAAI,aAAA,CAAc,GAAA,CAAI,aAAA,CAAc,EAAE,CAAA,EAAG;AACvC,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAEb,IAAA,WAAA,CAAY,aAAA,CAAc,GAAG,CAAA,CAC1B,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,MAAA,gBAAA,CAAiB,CAAC,IAAA,KAAS,IAAI,GAAA,CAAI,IAAI,EAAE,GAAA,CAAI,aAAA,CAAc,EAAA,EAAI,MAAM,CAAC,CAAA;AACtE,MAAAC,wBAAA,CAAQ,OAAA,CAAQ,CAAA,eAAA,EAAkB,aAAA,CAAc,IAAI,CAAA,CAAE,CAAA;AACtD,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAAA,wBAAA,CAAQ,KAAA,CAAM,CAAA,0BAAA,EAA6B,aAAA,CAAc,GAAG,KAAK,GAAG,CAAA;AACpE,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,uBAAuB,CAAA;AACrE,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,aAAA,EAAe,aAAA,EAAe,UAAU,CAAC,CAAA;AAI7C,EAAAD,gBAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,UAAA,EAAY;AACjB,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAA,GAAY,KAAA;AAChB,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,EAAE,CAAC,CAAA;AAC9D,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,aAAA,CAAc,CAAC,IAAA,KAAS;AACtB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,KAAA,MAAW,CAAA,IAAK,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,EAAE,OAAA,EAAS,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AACtE,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,UAAA;AAAA,MACN,OAAA,CAAQ,GAAA;AAAA,QAAI,CAAC,CAAA,KACX,WAAA,CAAY,CAAA,CAAE,GAAG,EAAE,IAAA,CAAK,CAAC,MAAA,MAAY,EAAE,IAAI,CAAA,CAAE,EAAA,EAAI,MAAM,CAAA,CAAE,IAAA,EAAM,QAAO,CAAE;AAAA;AAC1E,KACF,CAAE,IAAA,CAAK,CAAC,OAAA,KAAY;AAClB,MAAA,IAAI,SAAA,EAAW;AAEf,MAAA,gBAAA,CAAiB,CAAC,IAAA,KAAS;AACzB,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,QAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,UAAA,IAAI,CAAA,CAAE,WAAW,WAAA,EAAa;AAC5B,YAAA,IAAA,CAAK,IAAI,CAAA,CAAE,KAAA,CAAM,EAAA,EAAI,CAAA,CAAE,MAAM,MAAM,CAAA;AACnC,YAAAC,wBAAA,CAAQ,OAAA,CAAQ,CAAA,eAAA,EAAkB,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAAA,UAClD;AAAA,QACF;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,aAAA,CAAc,CAAC,IAAA,KAAS;AACtB,QAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,QAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM;AACxB,UAAA,MAAM,GAAA,GAAM,QAAQ,CAAC,CAAA;AACrB,UAAA,IAAI,CAAA,CAAE,WAAW,WAAA,EAAa;AAC5B,YAAA,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,EAAI,EAAE,SAAS,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA;AAAA,UAClD,CAAA,MAAO;AACL,YAAA,MAAM,MAAM,CAAA,CAAE,MAAA,YAAkB,KAAA,GAAQ,CAAA,CAAE,OAAO,OAAA,GAAU,uBAAA;AAC3D,YAAAA,wBAAA,CAAQ,MAAM,CAAA,0BAAA,EAA6B,GAAA,CAAI,GAAG,CAAA,CAAA,CAAA,EAAK,EAAE,MAAM,CAAA;AAC/D,YAAA,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,EAAI,EAAE,SAAS,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AAAA,UACjD;AAAA,QACF,CAAC,CAAA;AACD,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAED,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,OAAA,EAAS,aAAa,CAAC,CAAA;AAEvC,EAAA,MAAM,WAAA,GAAcJ,eAA6B,MAAM;AACrD,IAAA,IAAI,CAAC,UAAA,EAAY,OAAO,EAAC;AACzB,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC1B,MAAA,MAAM,GAAA,GAAM,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,IAAK,IAAA;AACzC,MAAA,MAAM,KAAA,GAAQ,GAAA,GAAMC,mCAAA,CAAkB,GAAG,CAAA,GAAI,IAAA;AAC7C,MAAA,MAAM,WAAWC,gCAAA,CAAe;AAAA,QAC9B,cAAc,GAAA,CAAI,OAAA;AAAA,QAClB,MAAA,EAAQ,aAAA;AAAA,QACR,WAAA,EAAa,GAAA,EAAK,OAAA,GAAU,CAAC,CAAA,EAAG;AAAA,OACjC,CAAA;AACD,MAAA,MAAM,IAAA,GAA2B,KAAK,IAAA,GAClC;AAAA,QACE,KAAA,EAAO,IAAI,IAAA,CAAK,KAAA;AAAA,QAChB,OAAA,EAAS,IAAI,IAAA,CAAK,OAAA;AAAA,QAClB,WAAA,EAAa,IAAI,IAAA,CAAK,WAAA;AAAA,QACtB,SAAS,GAAA,CAAI;AAAA,OACf,GACA,IAAA;AACJ,MAAA,MAAM,GAAA,GAAM,QAAQ,gBAAA,CAAiB,KAAA,EAAO,UAAU,GAAA,CAAI,EAAE,IAAI,EAAC;AACjE,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,IAAK,EAAE,OAAA,EAAS,CAAC,GAAA,EAAK,KAAA,EAAO,IAAA,EAAK;AACrE,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,GAAA;AAAA,QACR,IAAA;AAAA,QACA,SAAA,EAAW,GAAA;AAAA,QACX,SAAA,EAAW,GAAA;AAAA,QACX,iBAAiB,QAAA,IAAY,MAAA;AAAA,QAC7B,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,OAAO,KAAA,CAAM;AAAA,OACf;AAAA,IACF,CAAC,CAAA;AAAA,EACH,GAAG,CAAC,UAAA,EAAY,SAAS,aAAA,EAAe,UAAA,EAAY,aAAa,CAAC,CAAA;AAElE,EAAA,MAAM,gBAAA,GAAmBG,kBAAA,CAAY,CAAC,QAAA,KAAqB;AACzD,IAAA,kBAAA,CAAmB,QAAQ,CAAA;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,mBAAY,MAAM;AAChC,IAAA,IAAI,CAAC,aAAA,EAAe;AAEpB,IAAA,UAAA,CAAW,IAAI,CAAA;AACf,IAAA,QAAA,CAAS,IAAI,CAAA;AAGb,IAAA,gBAAA,CAAiB,CAAC,IAAA,KAAS;AACzB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAA,CAAK,MAAA,CAAO,cAAc,EAAE,CAAA;AAC5B,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAED,IAAA,WAAA,CAAY,aAAA,CAAc,GAAG,CAAA,CAC1B,IAAA,CAAK,CAAC,MAAA,KAAW;AAChB,MAAA,gBAAA,CAAiB,CAAC,IAAA,KAAS,IAAI,GAAA,CAAI,IAAI,EAAE,GAAA,CAAI,aAAA,CAAc,EAAA,EAAI,MAAM,CAAC,CAAA;AACtE,MAAAD,wBAAA,CAAQ,OAAA,CAAQ,CAAA,kBAAA,EAAqB,aAAA,CAAc,IAAI,CAAA,CAAE,CAAA;AACzD,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,MAAAA,wBAAA,CAAQ,KAAA,CAAM,CAAA,6BAAA,EAAgC,aAAA,CAAc,GAAG,KAAK,GAAG,CAAA;AACvE,MAAA,QAAA,CAAS,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,0BAA0B,CAAA;AACxE,MAAA,UAAA,CAAW,KAAK,CAAA;AAAA,IAClB,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAW,oBAAA,IAAwB,IAAA;AAAA;AAAA;AAAA;AAAA,IAInC,iBAAiB,eAAA,IAAmB,MAAA;AAAA,IACpC,gBAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAjPwBP,wBAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AC1LjB,SAAS,cAAc,IAAA,EAA0B;AACtD,EAAA,MAAM,GAAA,GAAM,KAAK,UAAA,CAAW,GAAG,IAAI,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AACnD,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,QAAQ,IAAA,EAAK;AAChD,EAAA,MAAM,CAAC,WAAW,IAAA,EAAM,GAAG,IAAI,CAAA,GAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAChD,EAAA,MAAM,SAAS,IAAA,CAAK,MAAA,GAAS,IAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAClD,EAAA,OAAO;AAAA,IACL,UAAU,QAAA,IAAY,IAAA;AAAA,IACtB,QAAQ,MAAA,IAAU;AAAA,GACpB;AACF;AATgBA,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AAWT,SAAS,aAAA,CAAc,UAAyB,MAAA,EAA+B;AACpF,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,MAAA,EAAQ,OAAO,EAAA;AACjC,EAAA,IAAI,YAAY,MAAA,EAAQ,OAAO,CAAA,CAAA,EAAI,QAAQ,IAAI,MAAM,CAAA,CAAA;AACrD,EAAA,IAAI,QAAA,EAAU,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACjC,EAAA,OAAO,MAAA,GAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,GAAK,EAAA;AACjC;AALgBA,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AA2BT,SAAS,cAAA,CAAe;AAAA,EAC7B,OAAA;AAAA,EACA,eAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA,EAAwB;AAItB,EAAA,MAAM,SAAA,GAAYS,cAAO,KAAK,CAAA;AAC9B,EAAA,MAAM,eAAA,GAAkBA,cAAO,YAAY,CAAA;AAC3C,EAAAH,iBAAU,MAAM;AACd,IAAA,eAAA,CAAgB,OAAA,GAAU,YAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAGjB,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,MAAA,KAAW,WAAA,EAAa;AAE/C,IAAA,MAAM,wBAAQN,wBAAA,CAAA,MAAM;AAClB,MAAA,eAAA,CAAgB,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAO,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,IAC7D,CAAA,EAFc,OAAA,CAAA;AAGd,IAAA,KAAA,EAAM;AACN,IAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAEpB,IAAA,MAAA,CAAO,gBAAA,CAAiB,cAAc,KAAK,CAAA;AAC3C,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,KAAK,CAAA;AACzC,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,KAAK,CAAA;AAC9C,MAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,KAAK,CAAA;AAAA,IAC9C,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAGZ,EAAAM,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAA,IAAW,OAAO,MAAA,KAAW,WAAA,EAAa;AAC/C,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AAExB,IAAA,MAAM,IAAA,GAAO,aAAA,CAAc,eAAA,EAAiB,YAAY,CAAA;AACxD,IAAA,MAAM,OAAA,GAAU,OAAO,QAAA,CAAS,IAAA;AAChC,IAAA,IAAI,SAAS,OAAA,EAAS;AAItB,IAAA,MAAM,GAAA,GAAM,OACR,CAAA,EAAG,MAAA,CAAO,SAAS,QAAQ,CAAA,EAAG,OAAO,QAAA,CAAS,MAAM,GAAG,IAAI,CAAA,CAAA,GAC3D,GAAG,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,EAAG,MAAA,CAAO,SAAS,MAAM,CAAA,CAAA;AACxD,IAAA,MAAA,CAAO,QAAQ,YAAA,CAAa,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,IAAI,GAAG,CAAA;AAAA,EAC3D,CAAA,EAAG,CAAC,OAAA,EAAS,eAAA,EAAiB,YAAY,CAAC,CAAA;AAE3C,EAAA,MAAM,UAAA,GAAaE,kBAAAA;AAAA,IACjB,CAAC,UAAyB,MAAA,KAA0B;AAClD,MAAA,IAAI,CAAC,OAAA,IAAW,OAAO,MAAA,KAAW,WAAA,EAAa;AAC/C,MAAA,MAAM,IAAA,GAAO,aAAA,CAAc,QAAA,EAAU,MAAM,CAAA;AAC3C,MAAA,MAAM,GAAA,GAAM,OACR,CAAA,EAAG,MAAA,CAAO,SAAS,QAAQ,CAAA,EAAG,OAAO,QAAA,CAAS,MAAM,GAAG,IAAI,CAAA,CAAA,GAC3D,GAAG,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,EAAG,MAAA,CAAO,SAAS,MAAM,CAAA,CAAA;AACxD,MAAA,MAAA,CAAO,QAAQ,SAAA,CAAU,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,IAAI,GAAG,CAAA;AAAA,IACxD,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,OAAO,EAAE,UAAA,EAAW;AACtB;AA/DgBR,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;ACxBhB,IAAM,cAA6B,EAAE,UAAA,EAAY,EAAC,EAAG,aAAa,EAAA,EAAG;AAErE,SAAS,UAAA,CAAW,UAAyB,EAAA,EAAuC;AAChF,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,EAAA,EAAI,OAAO,IAAA;AAC7B,EAAA,OAAO,4BAA4B,QAAQ,CAAA,CAAA,EAAI,GAAG,MAAM,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA,CAAA;AACvE;AAHSA,wBAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAKT,SAAS,UAAU,GAAA,EAAmC;AAClD,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,MAAA,KAAW,aAAa,OAAO,WAAA;AAClD,EAAA,IAAI;AACA,IAAA,MAAM,GAAA,GAAM,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAC3C,IAAA,IAAI,CAAC,KAAK,OAAO,WAAA;AACjB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,OAAO;AAAA,MACH,UAAA,EAAY,MAAA,EAAQ,UAAA,IAAc,EAAC;AAAA,MACnC,aAAa,OAAO,MAAA,EAAQ,WAAA,KAAgB,QAAA,GAAW,OAAO,WAAA,GAAc;AAAA,KAChF;AAAA,EACJ,CAAA,CAAA,MAAQ;AACJ,IAAA,OAAO,WAAA;AAAA,EACX;AACJ;AAbSA,wBAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AAeT,SAAS,UAAA,CAAW,KAAoB,KAAA,EAA4B;AAChE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,MAAA,KAAW,WAAA,EAAa;AAC3C,EAAA,IAAI;AAGA,IAAA,IAAI,MAAA,CAAO,KAAK,KAAA,CAAM,UAAU,EAAE,MAAA,KAAW,CAAA,IAAK,CAAC,KAAA,CAAM,WAAA,EAAa;AAClE,MAAA,MAAA,CAAO,YAAA,CAAa,WAAW,GAAG,CAAA;AAClC,MAAA;AAAA,IACJ;AACA,IAAA,MAAA,CAAO,aAAa,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AAAA,EAER;AACJ;AAbSA,wBAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AA2BF,SAAS,gBAAA,CACZ,UACA,QAAA,EACsB;AACtB,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,QAAA,EAAU,QAAQ,CAAA;AAKzC,EAAA,MAAM,CAAC,OAAO,gBAAgB,CAAA,GAAIE,gBAAwB,MAAM,SAAA,CAAU,GAAG,CAAC,CAAA;AAG9E,EAAA,MAAM,YAAA,GAAeO,cAAsB,GAAG,CAAA;AAC9C,EAAAH,iBAAU,MAAM;AACZ,IAAA,IAAI,YAAA,CAAa,YAAY,GAAA,EAAK;AAClC,IAAA,YAAA,CAAa,OAAA,GAAU,GAAA;AACvB,IAAA,gBAAA,CAAiB,SAAA,CAAU,GAAG,CAAC,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAKR,EAAA,MAAM,MAAA,GAASG,cAAO,GAAG,CAAA;AACzB,EAAAH,iBAAU,MAAM;AACZ,IAAA,MAAA,CAAO,OAAA,GAAU,GAAA;AAAA,EACrB,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAIR,EAAA,MAAM,SAAA,GAAYG,cAAsB,KAAK,CAAA;AAC7C,EAAAH,iBAAU,MAAM;AACZ,IAAA,SAAA,CAAU,OAAA,GAAU,KAAA;AAAA,EACxB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,aAAA,GAAgBE,kBAAAA,CAAY,CAAC,MAAA,KAAmC;AAClE,IAAA,MAAM,IAAA,GAAsB;AAAA,MACxB,UAAA,EAAY,MAAA;AAAA,MACZ,WAAA,EAAa,UAAU,OAAA,CAAQ;AAAA,KACnC;AACA,IAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,IAAA,UAAA,CAAW,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBA,kBAAAA,CAAY,CAAC,IAAA,KAAiB;AACjD,IAAA,MAAM,IAAA,GAAsB;AAAA,MACxB,UAAA,EAAY,UAAU,OAAA,CAAQ,UAAA;AAAA,MAC9B,WAAA,EAAa;AAAA,KACjB;AACA,IAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AACpB,IAAA,UAAA,CAAW,MAAA,CAAO,SAAS,IAAI,CAAA;AAAA,EACnC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,mBAAY,MAAM;AAC5B,IAAA,SAAA,CAAU,OAAA,GAAU,WAAA;AACpB,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,OAAO,MAAA,KAAW,WAAA,EAAa;AACjD,MAAA,IAAI;AAAE,QAAA,MAAA,CAAO,YAAA,CAAa,UAAA,CAAW,MAAA,CAAO,OAAO,CAAA;AAAA,MAAG,CAAA,CAAA,MAAQ;AAAA,MAAa;AAAA,IAC/E;AACA,IAAA,gBAAA,CAAiB,WAAW,CAAA;AAAA,EAChC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,EAAE,KAAA,EAAO,aAAA,EAAe,cAAA,EAAgB,KAAA,EAAM;AACzD;AA7DgBR,wBAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;;;AC/CT,SAAS,iBAAA,CAAkB,EAAE,QAAA,EAAS,EAA2B;AACpE,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,cAAA,EAAgB,iBAAA,KAAsBU,sCAAA,EAAqB;AACzF,EAAA,MAAM,KAAK,KAAA,CAAM,gBAAA;AAKjB,EAAAJ,iBAAU,MAAM;AACZ,IAAA,iBAAA,CAAkB,QAAQ,CAAA;AAAA,EAC9B,CAAA,EAAG,CAAC,QAAA,EAAU,iBAAiB,CAAC,CAAA;AAEhC,EAAA,MAAM,EAAE,OAAO,aAAA,EAAe,aAAA,EAAe,gBAAgB,WAAA,EAAY,GACrE,gBAAA,CAAiB,QAAA,EAAU,EAAE,CAAA;AAEjC,EAAA,MAAM,gBAAA,GAAmBG,cAAsB,IAAI,CAAA;AACnD,EAAA,MAAM,sBAAA,GAAyBA,cAAe,EAAE,CAAA;AAChD,EAAA,MAAM,oBAAA,GAAuBA,cAAe,EAAE,CAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,KAAK,CAAA,EAAG,EAAA,CAAG,MAAM,CAAA,CAAA,EAAI,EAAA,CAAG,IAAI,CAAA,CAAA,GAAK,IAAA;AAUpD,EAAAH,iBAAU,MAAM;AACZ,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,UAAA,EAAY;AACpB,MAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAC3B,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,gBAAA,CAAiB,YAAY,UAAA,EAAY;AAC7C,IAAA,gBAAA,CAAiB,OAAA,GAAU,UAAA;AAE3B,IAAA,MAAM,eAAA,GACF,MAAM,UAAA,IAAc,MAAA,CAAO,KAAK,KAAA,CAAM,UAAU,EAAE,MAAA,GAAS,CAAA;AAC/D,IAAA,MAAM,gBAAgB,OAAO,KAAA,CAAM,WAAA,KAAgB,QAAA,IAAY,MAAM,WAAA,KAAgB,EAAA;AAErF,IAAA,IAAI,eAAA,EAAiB;AACjB,MAAA,aAAA,CAAc,MAAM,UAAU,CAAA;AAC9B,MAAA,sBAAA,CAAuB,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAA;AAAA,IACpE,CAAA,MAAO;AAGH,MAAA,sBAAA,CAAuB,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAA;AAAA,IACpE;AAEA,IAAA,IAAI,aAAA,EAAe;AACf,MAAA,cAAA,CAAe,MAAM,WAAW,CAAA;AAChC,MAAA,oBAAA,CAAqB,UAAU,KAAA,CAAM,WAAA;AAAA,IACzC,CAAA,MAAO;AACH,MAAA,oBAAA,CAAqB,UAAU,KAAA,CAAM,WAAA;AAAA,IACzC;AAAA,EAEJ,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,EAAAA,iBAAU,MAAM;AACZ,IAAA,IAAI,CAAC,EAAA,IAAM,gBAAA,CAAiB,OAAA,KAAY,UAAA,EAAY;AACpD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,UAAU,CAAA;AAClD,IAAA,IAAI,UAAA,KAAe,uBAAuB,OAAA,EAAS;AACnD,IAAA,sBAAA,CAAuB,OAAA,GAAU,UAAA;AACjC,IAAA,aAAA,CAAc,MAAM,UAAU,CAAA;AAAA,EAClC,GAAG,CAAC,KAAA,CAAM,YAAY,EAAA,EAAI,UAAA,EAAY,aAAa,CAAC,CAAA;AAEpD,EAAAA,iBAAU,MAAM;AACZ,IAAA,IAAI,CAAC,EAAA,IAAM,gBAAA,CAAiB,OAAA,KAAY,UAAA,EAAY;AACpD,IAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,oBAAA,CAAqB,OAAA,EAAS;AACxD,IAAA,oBAAA,CAAqB,UAAU,KAAA,CAAM,WAAA;AACrC,IAAA,WAAA,CAAY,MAAM,WAAW,CAAA;AAAA,EACjC,GAAG,CAAC,KAAA,CAAM,aAAa,EAAA,EAAI,UAAA,EAAY,WAAW,CAAC,CAAA;AAEnD,EAAA,OAAO,IAAA;AACX;AA1EgBN,wBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;;;ACvBT,SAAS,cAAA,CACd,IACA,QAAA,EACQ;AACR,EAAA,MAAM,OAAO,EAAA,CAAG,IAAA,CACb,QAAQ,mBAAA,EAAqB,EAAE,EAC/B,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA,CACnB,OAAA,CAAQ,kBAAkB,GAAG,CAAA,CAC7B,QAAQ,UAAA,EAAY,EAAE,EACtB,WAAA,EAAY;AACf,EAAA,MAAM,aAAa,QAAA,GAAW,CAAA,EAAG,eAAA,CAAgB,QAAQ,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AAChE,EAAA,OAAO,CAAA,GAAA,EAAM,UAAU,CAAA,EAAG,EAAA,CAAG,OAAO,WAAA,EAAa,IAAI,IAAI,CAAA,CAAA;AAC3D;AAZgBA,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAeT,SAAS,gBAAgB,EAAA,EAAoB;AAClD,EAAA,OAAO,GAAG,OAAA,CAAQ,kBAAA,EAAoB,GAAG,CAAA,CAAE,OAAA,CAAQ,YAAY,EAAE,CAAA;AACnE;AAFgBA,wBAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;ACVhB,IAAM,aAAA,GAAwC;AAAA,EAC1C,GAAA,EAAQ,gFAAA;AAAA,EACR,IAAA,EAAQ,6EAAA;AAAA,EACR,GAAA,EAAQ,8EAAA;AAAA,EACR,KAAA,EAAQ,+EAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAEA,IAAM,eAAA,GAAkB,8CAAA;AAEjB,SAAS,eAAe,MAAA,EAAwB;AACnD,EAAA,OAAO,aAAA,CAAc,MAAA,CAAO,WAAA,EAAa,CAAA,IAAK,eAAA;AAClD;AAFgBA,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAIT,SAAS,eAAe,MAAA,EAAwB;AACnD,EAAA,IAAI,MAAA,IAAU,KAAK,OAAO,gEAAA;AAC1B,EAAA,IAAI,MAAA,IAAU,KAAK,OAAO,wEAAA;AAC1B,EAAA,IAAI,MAAA,IAAU,KAAK,OAAO,oEAAA;AAC1B,EAAA,OAAO,gFAAA;AACX;AALgBA,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAaT,SAAS,WAAA,CAAY,EAAE,MAAA,EAAO,EAAuB;AACxD,EAAA,uBACIW,cAAA,CAAC,UAAK,SAAA,EAAWC,MAAA;AAAA,IACb,+DAAA;AAAA,IACA,uEAAA;AAAA,IACA,eAAe,MAAM;AAAA,KAEpB,QAAA,EAAA,MAAA,EACL,CAAA;AAER;AAVgBZ,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAYT,SAAS,WAAA,CAAY,EAAE,MAAA,EAAO,EAAuB;AACxD,EAAA,uBACIW,cAAA,CAAC,UAAK,SAAA,EAAWC,MAAA;AAAA,IACb,sDAAA;AAAA,IACA,8CAAA;AAAA,IACA,eAAe,MAAM;AAAA,KAEpB,QAAA,EAAA,MAAA,EACL,CAAA;AAER;AAVgBZ,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAYT,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAAkC;AACtE,EAAA,uBACIW,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yFAAA,EACR,QAAA,EACL,CAAA;AAER;AANgBX,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAQT,SAAS,KAAA,CAAM,EAAE,QAAA,EAAU,SAAA,EAAU,EAAsD;AAC9F,EAAA,sCACK,KAAA,EAAA,EAAI,SAAA,EAAWY,OAAG,uCAAA,EAAyC,SAAS,GAChE,QAAA,EACL,CAAA;AAER;AANgBZ,wBAAA,CAAA,KAAA,EAAA,OAAA,CAAA;AAQT,SAAS,UAAA,CAAW,EAAE,QAAA,EAAU,SAAA,EAAU,EAAsD;AACnG,EAAA,sCACK,KAAA,EAAA,EAAI,SAAA,EAAWY,OAAG,gCAAA,EAAkC,SAAS,GACzD,QAAA,EACL,CAAA;AAER;AANgBZ,wBAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAkBT,SAAS,UAAA,CAAW;AAAA,EACvB,IAAA,EAAM,IAAA;AAAA,EACN,IAAA;AAAA,EACA;AACJ,CAAA,EAIG;AACC,EAAA,uBACIa,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACG,SAAA,EAAWD,MAAA;AAAA,QACP,yEAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,cAAA,CAAC,IAAA,EAAA,EAAK,WAAU,kCAAA,EAAmC,CAAA;AAAA,wBACnDA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,IAAA,EAAK;AAAA;AAAA;AAAA,GACvD;AAER;AApBgBX,wBAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAsBT,SAAS,kBAAA,CAAmB;AAAA,EAC/B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA,GAAc;AAClB,CAAA,EAKG;AACC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIc,uBAAAA,CAAM,SAAS,WAAW,CAAA;AAClD,EAAA,uBACID,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACX,QAAA,EAAA;AAAA,sBAAAA,eAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAC,CAAA;AAAA,UAChC,SAAA,EAAU,0JAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAF,cAAA,CAACI,4BAAa,SAAA,EAAWH,MAAA,CAAG,8BAAA,EAAgC,IAAA,IAAQ,WAAW,CAAA,EAAG,CAAA;AAAA,YACjF;AAAA;AAAA;AAAA,OACL;AAAA,MACC,MAAA,oBAAUD,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAY,QAAA,EAAA,MAAA,EAAO;AAAA,KAAA,EACjD,CAAA;AAAA,IACC,IAAA,oBAAQA,cAAA,CAAC,KAAA,EAAA,EAAK,QAAA,EAAS;AAAA,GAAA,EAC5B,CAAA;AAER;AA5BgBX,wBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;;;AChHT,SAAS,oBAAoB,KAAA,EAAyB;AACzD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC/B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAE/B,EAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,QAAA,CAAS,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,MAAM,CAAC,CAAA;AAExD,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC7B,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,CAAC,CAAA,CAAG,CAAC,CAAA;AAC5B,IAAA,IAAI,QAAA,CAAS,MAAM,CAAC,CAAA,KAAM,EAAE,CAAC,CAAA,KAAM,KAAK,CAAA,EAAG;AACvC,MAAA,MAAA,CAAO,KAAK,KAAM,CAAA;AAAA,IACtB,CAAA,MAAO;AACH,MAAA;AAAA,IACJ;AAAA,EACJ;AAIA,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA;AAE9B,EAAA,OAAO,MAAA;AACX;AAtBgBA,wBAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AAgCT,SAAS,YAAA,CAAa,IAAiB,iBAAA,EAAmC;AAC7E,EAAA,IAAI,EAAA,CAAG,OAAA,EAAS,OAAO,EAAA,CAAG,OAAA;AAE1B,EAAA,IAAI,iBAAA,IAAqB,EAAA,CAAG,IAAA,CAAK,UAAA,CAAW,iBAAiB,CAAA,EAAG;AAC5D,IAAA,MAAM,OAAO,EAAA,CAAG,IAAA,CAAK,KAAA,CAAM,iBAAA,CAAkB,MAAM,CAAA,IAAK,GAAA;AACxD,IAAA,OAAO,IAAA;AAAA,EACX;AACA,EAAA,OAAOgB,aAAAA,CAAa,GAAG,IAAI,CAAA;AAC/B;AARgBhB,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAUhB,SAASgB,cAAa,IAAA,EAAsB;AACxC,EAAA,IAAI;AAAE,IAAA,OAAO,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,QAAA;AAAA,EAAU,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,IAAA;AAAA,EAAM;AAChE;AAFShB,wBAAA,CAAAgB,aAAAA,EAAA,cAAA,CAAA;AAKF,SAAS,eAAe,EAAA,EAAyB;AACpD,EAAA,OAAO,GAAG,EAAA,CAAG,MAAM,IAAIA,aAAAA,CAAa,EAAA,CAAG,IAAI,CAAC,CAAA,CAAA;AAChD;AAFgBhB,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;;;AC3BhB,IAAM,YAAA,GAAuC;AAAA,EACzC,GAAA,EAAK,CAAA;AAAA,EACL,IAAA,EAAM,CAAA;AAAA,EACN,GAAA,EAAK,CAAA;AAAA,EACL,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ;AACZ,CAAA;AAEA,IAAM,6BAAaA,wBAAA,CAAA,CAAC,EAAA,KAAoB,aAAa,EAAA,CAAG,MAAM,KAAK,EAAA,EAAhD,YAAA,CAAA;AAYZ,SAAS,eAAe,IAAA,EAAsC;AACjE,EAAA,MAAM,UAAA,GAAaiB,gBAAA,CAAQ,IAAA,EAAM,UAAU,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAuB,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,IAAI,CAAC,CAAC,QAAA,EAAU,SAAS,CAAA,MAAO;AAAA,IACpF,QAAA;AAAA,IACA,SAAA,EAAWC,gBAAA,CAAQ,SAAA,EAAW,CAAC,MAAA,EAAQ,UAAU,CAAA,EAAG,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,IAClE,YAAA,EAAc,oBAAoB,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC;AAAA,GAClE,CAAE,CAAA;AAEF,EAAA,MAAM,CAAC,KAAA,EAAO,KAAK,CAAA,GAAIC,kBAAA,CAAU,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,OAAO,CAAA;AACnE,EAAA,OAAO,CAAC,GAAGC,eAAA,CAAO,KAAA,EAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,CAAS,WAAA,EAAa,CAAA,EAAG,GAAG,KAAK,CAAA;AACvE;AAVgBpB,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAsBT,SAAS,mBAAA,CACZ,SACA,iBAAA,EACe;AACf,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,IAC5B,MAAA;AAAA,IACA,QAAQ,cAAA,CAAe,iBAAA,CAAkB,OAAO,EAAE,CAAA,IAAK,EAAE;AAAA,GAC7D,CAAE,CAAA;AACN;AARgBA,wBAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;AC9ChB,IAAM,cAAA,GAAmE;AAAA,EACrE,QAAA,EAAU;AAAA,IACN,KAAA,EAAO,kBAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACV;AAAA,EACA,OAAA,EAAS;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACV;AAAA,EACA,GAAA,EAAK;AAAA,IACD,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAM;AAAA;AAEd,CAAA;AAqBO,SAAS,eAAe,EAAE,MAAA,EAAQ,WAAW,OAAA,EAAS,OAAA,GAAU,UAAS,EAAwB;AACpG,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIE,eAAAA,CAA2C,EAAE,CAAA;AAC/E,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,gBAAyB,IAAI,CAAA;AACjE,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAEtC,EAAA,MAAM,OAAA,GAAU,MAAA,KAAW,IAAA,IAAQ,SAAA,CAAU,MAAA,GAAS,CAAA;AAEtD,EAAA,MAAM,KAAA,GAAQM,kBAAAA;AAAA,IACV,CAAC,OAAA,KAA6B;AAC1B,MAAA,IAAI,CAAC,QAAQ,OAAO,EAAA;AACpB,MAAA,IAAI,YAAY,UAAA,EAAY,OAAOa,4BAAA,CAAW,MAAA,EAAQ,WAAW,OAAO,CAAA;AACxE,MAAA,IAAI,OAAA,KAAY,SAAA,EAAW,OAAOC,+BAAA,CAAc,QAAQ,OAAO,CAAA;AAC/D,MAAA,OAAOC,2BAAA,CAAU,QAAQ,OAAO,CAAA;AAAA,IACpC,CAAA;AAAA,IACA,CAAC,MAAA,EAAQ,SAAA,EAAW,OAAO;AAAA,GAC/B;AAEA,EAAA,MAAM,UAAA,GAAaf,kBAAAA;AAAA,IACf,OAAO,OAAA,KAAqB;AACxB,MAAA,IAAI,CAAC,OAAA,EAAS;AACd,MAAA,MAAM,IAAA,GAAO,MAAM,OAAO,CAAA;AAC1B,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,OAAO,CAAA,CAAE,KAAA;AACtC,MAAA,IAAI;AACA,QAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,QAAA,MAAM,IAAA,GAAOgB,8BAAY,IAAI,CAAA;AAC7B,QAAA,YAAA,CAAa,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,IAAA,EAAK,CAAE,CAAA;AACrD,QAAA,aAAA,CAAc,OAAO,CAAA;AACrB,QAAA,UAAA,CAAW,MAAM,aAAA,CAAc,IAAI,CAAA,EAAG,IAAI,CAAA;AAC1C,QAAA,OAAA,CAAQ,KAAK,CAAA;AACb,QAAAC,WAAA,CAAM,QAAQ,CAAA,OAAA,EAAU,KAAK,IAAI,EAAE,WAAA,EAAa,MAAM,CAAA;AAAA,MAC1D,SAAS,GAAA,EAAK;AACV,QAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,6BAAA;AACrD,QAAAA,WAAA,CAAM,KAAA,CAAM,aAAA,EAAe,EAAE,WAAA,EAAa,SAAS,CAAA;AAAA,MACvD;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,OAAO,OAAO;AAAA,GACnB;AAEA,EAAA,MAAM,QAAA,GAAWtB,eAAmB,MAAM,CAAC,YAAY,SAAA,EAAW,KAAK,CAAA,EAAG,EAAE,CAAA;AAE5E,EAAA,uBACIU,eAAAA,CAACa,uBAAA,EAAA,EAAa,IAAA,EAAY,cAAc,OAAA,EACpC,QAAA,EAAA;AAAA,oBAAAf,eAACgB,8BAAA,EAAA,EAAoB,OAAA,EAAO,IAAA,EACvB,QAAA,EAAA,OAAA,KAAY,yBACThB,cAAAA;AAAA,MAACiB,iBAAA;AAAA,MAAA;AAAA,QACG,OAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAU,kBAAA;AAAA,QACV,UAAU,CAAC,OAAA;AAAA,QACX,KAAA,EAAM,oBAAA;AAAA,QACN,YAAA,EAAW,oBAAA;AAAA,QAEX,QAAA,kBAAAjB,cAAAA,CAACkB,oBAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA,KACtC,mBAEAhB,eAAAA,CAACe,iBAAA,EAAA,EAAO,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,SAAA,EAAU,qBAAA,EAAsB,QAAA,EAAU,CAAC,OAAA,EAC3E,QAAA,EAAA;AAAA,sBAAAjB,cAAAA,CAACkB,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,MAAE,aAAA;AAAA,sBAEhClB,cAAAA,CAACmB,uBAAA,EAAA,EAAY,SAAA,EAAU,oBAAA,EAAqB;AAAA,KAAA,EAChD,CAAA,EAER,CAAA;AAAA,oBACAjB,eAAAA,CAACkB,8BAAA,EAAA,EAAoB,KAAA,EAAM,KAAA,EAAM,WAAU,MAAA,EACvC,QAAA,EAAA;AAAA,sBAAApB,cAAAA,CAACqB,4BAAA,EAAA,EAAkB,SAAA,EAAU,+DAAA,EAAgE,QAAA,EAAA,aAAA,EAE7F,CAAA;AAAA,sBACArB,eAACsB,gCAAA,EAAA,EAAsB,CAAA;AAAA,MACtB,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM;AACjB,QAAA,MAAM,KAAA,GAAQ,eAAe,CAAC,CAAA;AAC9B,QAAA,MAAM,IAAA,GAAO,UAAU,CAAC,CAAA;AACxB,QAAA,MAAM,SAAS,UAAA,KAAe,CAAA;AAC9B,QAAA,uBACIpB,eAAAA;AAAA,UAACqB,2BAAA;AAAA,UAAA;AAAA,YAEG,OAAA,EAAS,CAAC,CAAA,KAAM;AACZ,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,KAAK,WAAW,CAAC,CAAA;AAAA,YACrB,CAAA;AAAA,YACA,SAAA,EAAU,uDAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAArB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gCAAA,EACX,QAAA,EAAA;AAAA,gCAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EAA8B,gBAAM,KAAA,EAAM,CAAA;AAAA,gBACzD,MAAA,mBACGE,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6DAAA,EACZ,QAAA,EAAA;AAAA,kCAAAF,cAAAA,CAACwB,iBAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,kBAAE;AAAA,iBAAA,EACjC,CAAA,GACA,uBACAxB,cAAAA,CAAC,UAAK,SAAA,EAAU,6DAAA,EACX,gBACL,CAAA,GACA;AAAA,eAAA,EACR,CAAA;AAAA,8BACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAA,EACX,gBAAM,IAAA,EACX;AAAA;AAAA,WAAA;AAAA,UArBK;AAAA,SAsBT;AAAA,MAER,CAAC;AAAA,KAAA,EACL;AAAA,GAAA,EACJ,CAAA;AAER;AArGgBX,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;ACZhB,IAAM,iBAAiB,CAAC,KAAA,EAAO,OAAO,MAAA,EAAQ,KAAA,EAAO,SAAS,QAAQ,CAAA;AAmCtE,SAAS,eAAA,CACL,IAAA,EACA,KAAA,EACA,MAAA,EACa;AACb,EAAA,IAAI,GAAA,GAAM,IAAA;AACV,EAAA,IAAI,WAAW,KAAA,EAAO;AAClB,IAAA,GAAA,GAAM,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,MAAM,CAAA;AAAA,EAC/C;AACA,EAAA,IAAI,KAAA,EAAO;AACP,IAAA,MAAM,CAAA,GAAI,MAAM,WAAA,EAAY;AAC5B,IAAA,GAAA,GAAM,GAAA,CAAI,MAAA;AAAA,MACN,CAAC,CAAA,KACG,CAAA,CAAE,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAA,IAClC,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAA,IAC/B,CAAA,CAAE,WAAA,CAAY,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC,CAAA,IACtC,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,CAAC;AAAA,KACvC;AAAA,EACJ;AACA,EAAA,OAAO,GAAA;AACX;AApBSA,wBAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAsBT,SAAS,aAAA,CACL,KAAA,EACA,gBAAA,EACA,QAAA,EACA,SAAA,EACU;AACV,EAAA,MAAM,IAAA,GAAwB,KAAA,CAAM,SAAA,CAAU,GAAA,CAAI,CAAC,EAAA,KAAO;AACtD,IAAA,MAAM,SAAS,cAAA,CAAe,EAAA,EAAI,QAAA,IAAY,EAAA,CAAG,YAAY,IAAI,CAAA;AACjE,IAAA,OAAO;AAAA,MACH,KAAK,CAAA,EAAG,EAAA,CAAG,MAAM,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA,CAAA;AAAA,MAC5B,MAAA;AAAA,MACA,QAAA,EAAU,QAAA,IAAY,EAAA,CAAG,QAAA,IAAY,IAAA;AAAA,MACrC,KAAA,EAAO,YAAA,CAAa,EAAA,EAAI,KAAA,CAAM,YAAY,CAAA;AAAA,MAC1C,OAAA,EAAS,eAAe,EAAE,CAAA;AAAA,MAC1B,QAAQ,EAAA,CAAG,MAAA;AAAA,MACX,OAAA,EAAS,CAAC,EAAA,CAAG,OAAA;AAAA,MACb,UAAU,gBAAA,KAAqB;AAAA,KACnC;AAAA,EACJ,CAAC,CAAA;AACD,EAAA,OAAO;AAAA,IACH,GAAA,EAAK,CAAA,EAAG,SAAS,CAAA,EAAG,MAAM,QAAQ,CAAA,CAAA;AAAA,IAClC,UAAU,KAAA,CAAM,QAAA;AAAA,IAChB;AAAA,GACJ;AACJ;AAxBSA,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;AA0BT,IAAM,YAAA,mBAAeA,wBAAA,CAAA,CAAC,KAAA,EAAe,MAAA,EAAsB,WAAA,KAAgC;AACvF,EAAA,IAAI,SAAS,MAAA,KAAW,KAAA,SAAc,CAAA,GAAA,EAAM,MAAM,qBAAqB,KAAK,CAAA,CAAA,CAAA;AAC5E,EAAA,IAAI,KAAA,EAAO,OAAO,CAAA,oBAAA,EAAuB,KAAK,CAAA,CAAA,CAAA;AAC9C,EAAA,IAAI,MAAA,KAAW,KAAA,EAAO,OAAO,CAAA,GAAA,EAAM,MAAM,CAAA,UAAA,CAAA;AACzC,EAAA,OAAO,WAAA;AACX,CAAA,EALqB,cAAA,CAAA;AAOrB,SAAS,WAAA,CACL,SAAA,EACA,eAAA,EACA,KAAA,EACA,QACA,gBAAA,EACa;AACb,EAAA,MAAM,WAAW,eAAA,CAAgBoC,sCAAA,CAAqB,WAAW,eAAe,CAAA,EAAG,OAAO,MAAM,CAAA;AAChG,EAAA,MAAM,MAAA,GAAS,eAAe,QAAQ,CAAA;AACtC,EAAA,OAAO;AAAA,IACH,IAAA,EAAM,MAAA;AAAA,IACN,UAAA,EAAY,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,cAAc,CAAA,EAAG,gBAAA,EAAkB,IAAA,EAAM,EAAE,CAAC,CAAA;AAAA,IAC1E,SAAA,EAAW,YAAA,CAAa,KAAA,EAAO,MAAA,EAAQ,6BAA6B;AAAA,GACxE;AACJ;AAdSpC,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAgBT,SAAS,gBACL,OAAA,EACA,iBAAA,EACA,eAAA,EACA,KAAA,EACA,QACA,gBAAA,EACa;AACb,EAAA,MAAM,cAA6C,EAAC;AACpD,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACvB,IAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,GAAA,CAAI,EAAE,KAAK,EAAC;AAC1C,IAAA,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,GAAI,eAAA,CAAgBoC,uCAAqB,GAAA,EAAK,eAAe,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AAAA,EACnG;AACA,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,OAAA,EAAS,WAAW,CAAA;AAC5D,EAAA,MAAM,QAAA,GAA8B,WAAA,CAC/B,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,CACjC,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACT,QAAA,EAAU,EAAE,MAAA,CAAO,EAAA;AAAA,IACnB,UAAA,EAAY,EAAE,MAAA,CAAO,IAAA;AAAA,IACrB,YAAY,CAAA,CAAE,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,aAAA,CAAc,CAAA,EAAG,gBAAA,EAAkB,CAAA,CAAE,OAAO,EAAA,EAAI,CAAA,EAAG,EAAE,MAAA,CAAO,EAAE,GAAG,CAAC;AAAA,GACtG,CAAE,CAAA;AACN,EAAA,OAAO;AAAA,IACH,IAAA,EAAM,UAAA;AAAA,IACN,QAAA;AAAA,IACA,SAAA,EAAW,YAAA,CAAa,KAAA,EAAO,MAAA,EAAQ,4BAA4B;AAAA,GACvE;AACJ;AA1BSpC,wBAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AA8BF,SAAS,WAAA,CAAY;AAAA,EACxB,IAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA,GAAW,UAAA;AAAA,EACX,iBAAA;AAAA,EACA,SAAA;AAAA,EACA;AACJ,CAAA,EAAqB;AACjB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIE,gBAAS,EAAE,CAAA;AACvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,EAAE,CAAA;AAC7C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,gBAAuB,KAAK,CAAA;AAEpE,EAAAI,iBAAU,MAAM;AACZ,IAAA,MAAM,KAAK,UAAA,CAAW,MAAM,YAAA,CAAa,MAAM,GAAG,GAAG,CAAA;AACrD,IAAA,OAAO,MAAM,aAAa,EAAE,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,IAAA,GAAOH,eAAuB,MAAM;AACtC,IAAA,IAAI,aAAa,UAAA,EAAY;AACzB,MAAA,OAAO,eAAA;AAAA,QACH,OAAA;AAAA,QACA,qBAAqB,EAAC;AAAA,QACtB,eAAA;AAAA,QACA,SAAA;AAAA,QACA,YAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ;AACA,IAAA,OAAO,WAAA,CAAY,SAAA,EAAW,eAAA,EAAiB,SAAA,EAAW,cAAc,gBAAgB,CAAA;AAAA,EAC5F,CAAA,EAAG;AAAA,IACC,QAAA;AAAA,IACA,OAAA;AAAA,IACA,iBAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACH,CAAA;AAED,EAAA,MAAM,aAAA,GAAgBA,cAAAA;AAAA,IAClB,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,CAAE,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,IAAA,EAAK,CAAE,CAAA;AAAA,IACzD,CAAC,OAAO;AAAA,GACZ;AACA,EAAA,MAAM,kBAAA,GAAqB,QAAQ,MAAA,GAAS,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,MAAM,KAAA,IAAS,eAAA;AAChC,EAAA,MAAM,YAAA,GAAe,aAAa,UAAA,IAAc,kBAAA;AAChD,EAAA,MAAM,YAAY,SAAA,KAAc,IAAA,IAAQ,SAAA,KAAc,MAAA,IAAa,UAAU,MAAA,GAAS,CAAA;AAEtF,EAAA,uBACIU,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,mDAAA,EAEb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDAAA,EACX,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACX,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oDAAA,EACX,QAAA,EAAA,QAAA,EACL,CAAA;AAAA,QACC,MAAM,OAAA,oBACHE,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,yDAAA,EAA0D,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UACpE,IAAA,CAAK;AAAA,SAAA,EACX;AAAA,OAAA,EAER,CAAA;AAAA,MACC,6BACGF,cAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACG,QAAQ,SAAA,IAAa,IAAA;AAAA,UACrB,SAAA;AAAA,UACA,OAAA,EAAS,eAAA;AAAA,UACT,OAAA,EAAQ;AAAA;AAAA;AACZ,KAAA,EAER,CAAA;AAAA,oBAGAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACV,QAAA,EAAA;AAAA,MAAA,YAAA,oBACGF,cAAAA;AAAA,QAAC0B,mBAAA;AAAA,QAAA;AAAA,UACG,OAAA,EAAS,aAAA;AAAA,UACT,OAAO,eAAA,IAAmB,EAAA;AAAA,UAC1B,aAAA,EAAe,CAAC,EAAA,KAAO,EAAA,IAAM,eAAe,EAAE,CAAA;AAAA,UAC9C,WAAA,EAAY,YAAA;AAAA,UACZ,iBAAA,EAAkB,mBAAA;AAAA,UAClB,SAAA,EAAU,eAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA,OACd;AAAA,sBAEJxB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACX,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAAC2B,kBAAA,EAAA,EAAO,SAAA,EAAU,qGAAA,EAAsG,CAAA;AAAA,wBACxH3B,cAAAA;AAAA,UAAC4B,gBAAA;AAAA,UAAA;AAAA,YACG,WAAA,EAAY,wBAAA;AAAA,YACZ,KAAA,EAAO,MAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAA2C,SAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC9E,SAAA,EAAU;AAAA;AAAA;AACd,OAAA,EACJ,CAAA;AAAA,sBACA5B,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,YAAA,EAAc,UAAU,eAAA,EAAiB;AAAA,KAAA,EACjE,CAAA;AAAA,oBAEAA,eAAC,UAAA,EAAA,EACG,QAAA,kBAAAA,eAAC,WAAA,EAAA,EAAY,IAAA,EAAY,YAAwB,CAAA,EACrD;AAAA,GAAA,EACJ,CAAA;AAER;AA7GgBX,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AA+GhB,SAAS,WAAA,CAAY;AAAA,EACjB,KAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,uBACIW,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCACV,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,CAAA,KAAM;AACvB,IAAA,MAAM,SAAS,KAAA,KAAU,CAAA;AACzB,IAAA,uBACIA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEG,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,CAAA;AAAA,QACzB,cAAA,EAAc,MAAA;AAAA,QACd,SAAA,EAAWC,MAAAA;AAAA,UACP,gGAAA;AAAA,UACA,SACM,iDAAA,GACA;AAAA,SACV;AAAA,QAEC,QAAA,EAAA;AAAA,OAAA;AAAA,MAXI;AAAA,KAYT;AAAA,EAER,CAAC,CAAA,EACL,CAAA;AAER;AA9BSZ,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAoCT,SAAS,WAAA,CAAY,EAAE,IAAA,EAAM,UAAA,EAAW,EAAoD;AACxF,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACtB,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAC9B,MAAA,uBACIW,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACV,eAAK,SAAA,EACV,CAAA;AAAA,IAER;AACA,IAAA,uBACIA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,MAAA,EACV,QAAA,EAAA,IAAA,CAAK,WAAW,GAAA,CAAI,CAAC,wBAClBA,cAAAA,CAAC,iBAA4B,QAAA,EAAU,GAAA,EAAK,cAAxB,GAAA,CAAI,GAA4C,CACvE,CAAA,EACL,CAAA;AAAA,EAER;AAEA,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAC5B,IAAA,uBACIA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACV,eAAK,SAAA,EACV,CAAA;AAAA,EAER;AAEA,EAAA,uBACIA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACV,QAAA,EAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,qBAChBE,eAAAA,CAAC,KAAA,EAAA,EAA2B,WAAU,gBAAA,EAClC,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wFAAA,EACX,QAAA,kBAAAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sEAAA,EACX,QAAA,EAAA,OAAA,CAAQ,UAAA,EACb,CAAA,EACJ,CAAA;AAAA,IACC,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,CAAC,GAAA,qBACrBA,cAAAA,CAAC,aAAA,EAAA,EAA4B,QAAA,EAAU,GAAA,EAAK,UAAA,EAAA,EAAxB,GAAA,CAAI,GAA4C,CACvE;AAAA,GAAA,EAAA,EARK,OAAA,CAAQ,QASlB,CACH,CAAA,EACL,CAAA;AAER;AA1CSX,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AA4CT,IAAM,aAAA,GAAgBc,uBAAAA,CAAM,IAAA,iBAAKd,wBAAA,CAAA,SAASwC,cAAAA,CAAc;AAAA,EACpD,QAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,uBACI3B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACX,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wGAAA,EACV,mBAAS,QAAA,EACd,CAAA;AAAA,oBACAA,cAAAA,CAAC,KAAA,EAAA,EACI,QAAA,EAAA,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,GAAA,qBAChBA,cAAAA,CAAC,eAA0B,GAAA,EAAU,UAAA,EAAA,EAAnB,GAAA,CAAI,GAAuC,CAChE,CAAA,EACL;AAAA,GAAA,EACJ,CAAA;AAER,CAAA,EAnBiC,eAAA,CAmBhC,CAAA;AAED,IAAM,WAAA,GAAcG,uBAAAA,CAAM,IAAA,iBAAKd,wBAAA,CAAA,SAASyC,YAAAA,CAAY;AAAA,EAChD,GAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,uBACI5B,eAAAA,CAAC6B,kBAAA,EAAA,EAAQ,aAAA,EAAe,GAAA,EACpB,QAAA,EAAA;AAAA,oBAAA/B,cAAAA,CAACgC,yBAAA,EAAA,EAAe,OAAA,EAAO,IAAA,EACnB,QAAA,kBAAA9B,eAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,SAAS,MAAM,UAAA,CAAW,GAAA,CAAI,MAAA,EAAQ,IAAI,QAAQ,CAAA;AAAA,QAClD,cAAA,EAAc,GAAA,CAAI,QAAA,GAAW,UAAA,GAAa,MAAA;AAAA,QAC1C,SAAA,EAAWD,MAAAA;AAAA,UACP,2FAAA;AAAA,UACA,GAAA,CAAI,WACE,+BAAA,GACA;AAAA,SACV;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,GAAA,CAAI,QAAA,oBACDD,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,2DAAA,EAA4D,CAAA;AAAA,0BAEhFA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mBAAA,EACZ,QAAA,kBAAAA,cAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,CAAA,EACrC,CAAA;AAAA,0BACAA,cAAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACG,SAAA,EAAWC,MAAAA;AAAA,gBACP,0CAAA;AAAA,gBACA,GAAA,CAAI,UAAU,iCAAA,GAAoC,aAAA;AAAA,gBAClD,IAAI,QAAA,IAAY;AAAA,eACpB;AAAA,cAEC,QAAA,EAAA,GAAA,CAAI;AAAA;AAAA;AACT;AAAA;AAAA,KACJ,EACJ,CAAA;AAAA,oBACAD,cAAAA,CAACiC,yBAAA,EAAA,EAAe,IAAA,EAAK,OAAA,EAAQ,OAAM,QAAA,EAAS,SAAA,EAAU,uBAAA,EACjD,QAAA,EAAA,GAAA,CAAI,OAAA,EACT;AAAA,GAAA,EACJ,CAAA;AAER,CAAA,EA1C+B,aAAA,CA0C9B,CAAA;;;ACpaM,SAAS,gBAAgB,EAAA,EAAsC;AAClE,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAQ,IAAA;AAC3C,EAAA,IAAI,CAAC,IAAI,OAAO,MAAA;AAEhB,EAAA,IAAI,MAA0B,EAAA,CAAG,aAAA;AACjC,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,CAAS,IAAA,IAAQ,GAAA,KAAQ,SAAS,eAAA,EAAiB;AACrE,IAAA,MAAM,KAAA,GAAQ,iBAAiB,GAAG,CAAA;AAClC,IAAA,MAAM,YAAY,KAAA,CAAM,SAAA;AACxB,IAAA,MAAM,SAAA,GAAA,CACD,cAAc,MAAA,IAAU,SAAA,KAAc,YAAY,SAAA,KAAc,SAAA,KACjE,GAAA,CAAI,YAAA,GAAe,GAAA,CAAI,YAAA;AAC3B,IAAA,IAAI,WAAW,OAAO,GAAA;AACtB,IAAA,GAAA,GAAM,GAAA,CAAI,aAAA;AAAA,EACd;AACA,EAAA,OAAO,MAAA;AACX;AAfgB5C,wBAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AAkBT,SAAS,aAAa,MAAA,EAA8B;AACvD,EAAA,OAAO,MAAA,KAAW,MAAA,GAAS,MAAA,CAAO,OAAA,GAAW,MAAA,CAAuB,SAAA;AACxE;AAFgBA,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAKT,SAAS,kBAAkB,MAAA,EAA8B;AAC5D,EAAA,OAAO,MAAA,KAAW,MAAA,GAAS,MAAA,CAAO,WAAA,GAAe,MAAA,CAAuB,YAAA;AAC5E;AAFgBA,wBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;AAOT,SAAS,aAAa,MAAA,EAA8B;AACvD,EAAA,OAAO,MAAA,KAAW,MAAA,GAAS,CAAA,GAAK,MAAA,CAAuB,uBAAsB,CAAE,GAAA;AACnF;AAFgBA,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAaT,SAAS,cAAA,CAAe,QAAsB,GAAA,EAAa;AAC9D,EAAA,IAAI,WAAW,MAAA,EAAQ;AACnB,IAAA,MAAA,CAAO,QAAA,CAAS,EAAE,GAAA,EAAK,QAAA,EAAU,UAAU,CAAA;AAC3C,IAAA;AAAA,EACJ;AACA,EAAC,OAAuB,SAAA,GAAY,GAAA;AACxC;AANgBA,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AC9CT,SAAS,gBAAgB,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAA,EAAW,iBAAgB,EAAyB;AAChG,EAAA,uBACIa,eAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,sBAAA,EACf,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACX,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EACX,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,qEAAA,EACT,eAAK,KAAA,EACV,CAAA;AAAA,wBACAE,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wGAAA,EAAyG,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UACnH,IAAA,CAAK;AAAA,SAAA,EACX;AAAA,OAAA,EACJ,CAAA;AAAA,sBACAF,cAAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACG,MAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS;AAAA;AAAA;AACb,KAAA,EACJ,CAAA;AAAA,IAEC,IAAA,CAAK,WAAA,oBACFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACX,QAAA,kBAAAA,cAAAA,CAACkC,iCAAA,EAAA,EAAgB,OAAA,EAAS,IAAA,CAAK,aAAa,CAAA,EAChD,CAAA;AAAA,IAGH,IAAA,CAAK,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,qBACnChC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6EAAA,EAA8E,QAAA,EAAA,UAAA,EAE5F,CAAA;AAAA,sBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eACV,QAAA,EAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,qBAClBE,eAAAA,CAAC,KAAA,EAAA,EAA0B,WAAU,qCAAA,EACjC,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qDAAA,EACX,YAAE,GAAA,EACP,CAAA;AAAA,QACC,CAAA,CAAE,+BACCA,cAAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EACX,YAAE,WAAA,EACP;AAAA,OAAA,EAAA,EAPE,GAAG,CAAA,CAAE,GAAG,IAAI,CAAC,CAAA,CASvB,CACH,CAAA,EACL;AAAA,KAAA,EACJ;AAAA,GAAA,EAER,CAAA;AAER;AAhDgBX,wBAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;;;ACmBhB,IAAM,SAAA,GAAY,CAAA;AAElB,SAAS,aAAa,IAAA,EAA8B;AAChD,EAAA,IAAI,CAAC,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,YAAY,OAAO,QAAA;AAC1C,EAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,KAAA;AAC1B,EAAA,IAAI,SAAS,OAAA,EAAS;AAClB,IAAA,MAAM,WAAW,IAAA,CAAK,KAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,GAAI,KAAA;AACzD,IAAA,OAAO,SAAS,QAAQ,CAAA,CAAA,CAAA;AAAA,EAC5B;AACA,EAAA,IAAI,KAAA,CAAM,QAAQ,IAAA,CAAK,IAAI,KAAK,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AAClD,IAAA,OAAO,GAAG,IAAI,CAAA,KAAA,CAAA;AAAA,EAClB;AACA,EAAA,IAAI,KAAK,MAAA,EAAQ,OAAO,GAAG,IAAI,CAAA,EAAA,EAAK,KAAK,MAAM,CAAA,CAAA,CAAA;AAC/C,EAAA,OAAO,IAAA;AACX;AAZSA,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAcF,SAAS,cAAA,CACZ,MAAA,EACA,MAAA,GAAS,EAAA,EACT,QAAQ,CAAA,EACK;AACb,EAAA,IAAI,CAAC,MAAA,IAAU,KAAA,GAAQ,SAAA,SAAkB,EAAC;AAG1C,EAAA,IAAI,MAAA,CAAO,SAAS,OAAA,EAAS;AACzB,IAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACf,MAAA,OAAO,CAAC,EAAE,IAAA,EAAM,MAAA,IAAU,MAAM,IAAA,EAAM,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,IACpE;AACA,IAAA,MAAM,KAAA,GAAQ,eAAe,MAAA,CAAO,KAAA,EAAO,SAAS,CAAA,EAAG,MAAM,CAAA,EAAA,CAAA,GAAO,IAAA,EAAM,KAAK,CAAA;AAC/E,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACpB,MAAA,OAAO;AAAA,QACH;AAAA,UACI,MAAM,MAAA,IAAU,IAAA;AAAA,UAChB,IAAA,EAAM,aAAa,MAAM,CAAA;AAAA,UACzB,QAAA,EAAU,KAAA;AAAA,UACV,aAAa,MAAA,CAAO;AAAA;AACxB,OACJ;AAAA,IACJ;AACA,IAAA,OAAO,KAAA;AAAA,EACX;AAGA,EAAA,IAAI,MAAA,CAAO,IAAA,KAAS,QAAA,IAAY,CAAC,OAAO,UAAA,EAAY;AAChD,IAAA,OAAO;AAAA,MACH;AAAA,QACI,MAAM,MAAA,IAAU,QAAA;AAAA,QAChB,IAAA,EAAM,aAAa,MAAM,CAAA;AAAA,QACzB,QAAA,EAAU,KAAA;AAAA,QACV,aAAa,MAAA,CAAO;AAAA;AACxB,KACJ;AAAA,EACJ;AAGA,EAAA,MAAM,WAAW,IAAI,GAAA,CAAI,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA;AAC9C,EAAA,MAAM,OAAsB,EAAC;AAC7B,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,UAAA,IAAc,EAAC;AACpC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC7C,IAAA,MAAM,WAAW,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GAAK,GAAA;AAC/C,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAEnC,IAAA,MAAM,kBAAA,GACD,KAAK,IAAA,KAAS,QAAA,IAAY,KAAK,UAAA,IAC/B,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,IAAA,CAAK,KAAA;AAEnC,IAAA,IAAI,kBAAA,IAAsB,QAAQ,SAAA,EAAW;AAGzC,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAa,IAAI,CAAA;AAAA,QACvB,QAAA,EAAU,UAAA;AAAA,QACV,aAAa,IAAA,CAAK;AAAA,OACrB,CAAA;AACD,MAAA,IAAA,CAAK,KAAK,GAAG,cAAA,CAAe,MAAM,QAAA,EAAU,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,IAC1D,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,IAAA,CAAK;AAAA,QACN,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,aAAa,IAAI,CAAA;AAAA,QACvB,QAAA,EAAU,UAAA;AAAA,QACV,aAAa,IAAA,CAAK;AAAA,OACrB,CAAA;AAAA,IACL;AAAA,EACJ;AACA,EAAA,OAAO,IAAA;AACX;AAtEgBA,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;ACzBT,SAAS,YAAY,EAAE,QAAA,EAAU,oBAAA,EAAsB,OAAA,EAAS,UAAS,EAAqB;AACjG,EAAA,MAAM,cAAA,GAAiB,QAAA,IAAY,QAAA,CAAS,QAAA,IAAY,IAAA;AACxD,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,QAAA,EAAU,cAAc,CAAA;AACtD,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,UAAA,EAAY,MAAA,CAAO,CAAC,CAAA,KAAM,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAC,KAAK,EAAC;AACjG,EAAA,MAAM,cAAc,QAAA,CAAS,UAAA,EAAY,MAAA,CAAO,CAAC,MAAM,CAAC,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAC,KAAK,EAAC;AAEnG,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIE,gBAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAaM,mBAAY,MAAM;AACjC,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAA,CAAO,QAAA,CAAS,MAAM,GAAG,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC1E,IAAA,KAAK,UAAU,SAAA,EAAW,SAAA,CAAU,GAAG,CAAA,CAAE,KAAK,MAAM;AAChD,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,CAAA,EAAG,IAAI,CAAA;AAAA,IAC3C,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAIX,EAAA,MAAM,UAAA,GAAaL,eAAQ,MAAM2C,oCAAA,CAAmB,QAAQ,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEzE,EAAA,uBACIjC,eAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACG,EAAA,EAAI,MAAA;AAAA,MACJ,sBAAA,EAAsB,MAAA;AAAA,MACtB,kBAAgB,cAAA,IAAkB,EAAA;AAAA,MAClC,SAAA,EAAU,+BAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,WAAA,EACd,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACX,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yDAAA,EACX,QAAA,EAAA;AAAA,8BAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,4BAAA,EACZ,QAAA,kBAAAA,eAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,QAAA,CAAS,MAAA,EAAQ,CAAA,EAC1C,CAAA;AAAA,8BACAA,cAAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACG,SAAA,EAAU,mFAAA;AAAA,kBACV,KAAA,EAAO,EAAE,YAAA,EAAc,UAAA,EAAY,WAAW,YAAA,EAAa;AAAA,kBAE1D,QAAA,EAAAK,8BAAA,CAAa,SAAS,IAAI;AAAA;AAAA,eAC/B;AAAA,8BACAL,cAAAA;AAAA,gBAAC,QAAA;AAAA,gBAAA;AAAA,kBACG,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAS,UAAA;AAAA,kBACT,KAAA,EAAM,2BAAA;AAAA,kBACN,SAAA,EAAWC,MAAAA;AAAA,oBACP,mGAAA;AAAA,oBACA,0CAAA;AAAA,oBACA,MAAA,IAAU;AAAA,mBACd;AAAA,kBAEC,QAAA,EAAA,MAAA,mBAASD,cAAAA,CAACwB,iBAAAA,EAAA,EAAM,SAAA,EAAU,aAAA,EAAc,CAAA,mBAAKxB,cAAAA,CAACoC,iBAAA,EAAA,EAAM,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA,eACjF;AAAA,8BACApC,cAAAA;AAAA,gBAACqC,qBAAA;AAAA,gBAAA;AAAA,kBACG,KAAA,EAAO,UAAA;AAAA,kBACP,KAAA,EAAM,oCAAA;AAAA,kBACN,OAAA,EAAQ,OAAA;AAAA,kBACR,IAAA,EAAK,MAAA;AAAA,kBACL,aAAA,EAAc,aAAA;AAAA,kBACd,SAAA,EAAWpC,MAAAA;AAAA,oBACP,iEAAA;AAAA,oBACA;AAAA;AACJ;AAAA;AACJ,aAAA,EACJ,CAAA;AAAA,4BACAC,eAAAA;AAAA,cAACe,iBAAAA;AAAA,cAAA;AAAA,gBACG,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAS,uBAAuB,WAAA,GAAc,SAAA;AAAA,gBAC9C,OAAA,EAAS,OAAA;AAAA,gBACT,SAAA,EAAU,6CAAA;AAAA,gBAEV,QAAA,EAAA;AAAA,kCAAAjB,cAAAA,CAACsC,gBAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,kBACzB,uBAAuB,QAAA,GAAW;AAAA;AAAA;AAAA;AACvC,WAAA,EACJ,CAAA;AAAA,UACC,QAAA,CAAS,WAAA,oBACNtC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACX,QAAA,kBAAAA,cAAAA,CAACkC,iCAAA,EAAA,EAAgB,OAAA,EAAS,QAAA,CAAS,aAAa,CAAA,EACpD,CAAA;AAAA,0BAGJhC,eAAAA;AAAA,YAACe,iBAAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAK,IAAA;AAAA,cACL,OAAA,EAAS,uBAAuB,WAAA,GAAc,SAAA;AAAA,cAC9C,OAAA,EAAS,OAAA;AAAA,cACT,SAAA,EAAU,+BAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAjB,cAAAA,CAACsC,gBAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,gBACzB,uBAAuB,sBAAA,GAAyB;AAAA;AAAA;AAAA;AACrD,SAAA,EACJ,CAAA;AAAA,QAAA,CAEE,UAAA,CAAW,MAAA,GAAS,CAAA,IAAK,WAAA,CAAY,SAAS,CAAA,IAAK,QAAA,CAAS,WAAA,IAAe,QAAA,CAAS,WAAW,MAAA,qBAC7FpC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gBAAA,EACV,QAAA,EAAA;AAAA,UAAA,UAAA,CAAW,MAAA,GAAS,qBACjBF,cAAAA,CAAC,cAAW,KAAA,EAAM,iBAAA,EAAkB,QAAQ,UAAA,EAAY,CAAA;AAAA,UAE3D,WAAA,CAAY,SAAS,CAAA,oBAClBA,eAAC,UAAA,EAAA,EAAW,KAAA,EAAM,kBAAA,EAAmB,MAAA,EAAQ,WAAA,EAAa,CAAA;AAAA,UAE7D,SAAS,WAAA,oBACNA,eAAC,kBAAA,EAAA,EAAmB,IAAA,EAAM,SAAS,WAAA,EAAa,CAAA;AAAA,UAEnD,QAAA,CAAS,aAAa,QAAA,CAAS,SAAA,CAAU,SAAS,CAAA,oBAC/CA,eAAC,UAAA,EAAA,EAAW,KAAA,EAAM,aACd,QAAA,kBAAAA,cAAAA,CAAC,SAAI,SAAA,EAAU,4CAAA,EACV,mBAAS,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,qBACrBE,eAAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cAEG,SAAA,EAAU,kFAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAAF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACX,QAAA,kBAAAA,eAAC,SAAA,EAAA,EAAU,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,CAAA,EAC7B,CAAA;AAAA,gCACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,2DAAA,EACX,YAAE,WAAA,EACP;AAAA;AAAA,aAAA;AAAA,YARK,CAAA,CAAE;AAAA,WAUd,GACL,CAAA,EACJ;AAAA,SAAA,EAER;AAAA;AAAA;AAAA,GAER;AAER;AA5HgBX,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AA8HhB,SAAS,kBAAA,CAAmB,EAAE,IAAA,EAAK,EAAsD;AACrF,EAAA,MAAM,MAAA,GAASG,cAAAA,CAAQ,MAAM,cAAA,CAAe,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,IAAA,CAAK,MAAM,CAAC,CAAA;AACvE,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,GACjB,IAAA,CAAK,SAAS,OAAA,GACV,CAAA,MAAA,EAAU,IAAA,CAAK,MAAA,CAAyC,OAAO,IAAA,IAAQ,QAAQ,CAAA,CAAA,CAAA,GAC/E,IAAA,CAAK,OACT,IAAA,CAAK,IAAA;AAEX,EAAA,uBACIQ,eAAC,UAAA,EAAA,EAAW,KAAA,EAAM,gBACd,QAAA,kBAAAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EAAkD,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,MAC3E,IAAA,CAAK,+BACFA,cAAAA,CAAC,UAAK,SAAA,EAAU,+BAAA,EAAiC,eAAK,WAAA,EAAY;AAAA,KAAA,EAE1E,CAAA;AAAA,IACC,OAAO,MAAA,GAAS,CAAA,oBAAKA,cAAAA,CAAC,eAAY,MAAA,EAAgB;AAAA,GAAA,EACvD,CAAA,EACJ,CAAA;AAER;AArBSX,wBAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAuBT,SAAS,WAAA,CAAY,EAAE,MAAA,EAAO,EAA8B;AACxD,EAAA,uBACIW,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACV,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,qBACTE,eAAAA,CAAC,KAAA,EAAA,EAAiB,WAAU,qCAAA,EACxB,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+CAAA,EAAiD,YAAE,IAAA,EAAK,CAAA;AAAA,MACvE,CAAA,CAAE,4BACCA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACG,KAAA,EAAM,UAAA;AAAA,UACN,SAAA,EAAU,oDAAA;AAAA,UACb,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBAEJA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EAAkD,YAAE,IAAA,EAAK;AAAA,KAAA,EAC7E,CAAA;AAAA,IACC,CAAA,CAAE,+BACCA,cAAAA,CAAC,OAAE,SAAA,EAAU,2DAAA,EACR,YAAE,WAAA,EACP;AAAA,GAAA,EAAA,EAhBE,CAAA,CAAE,IAkBZ,CACH,CAAA,EACL,CAAA;AAER;AA1BSX,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AA4BT,SAAS,UAAA,CAAW,EAAE,KAAA,EAAO,QAAA,EAAS,EAAiD;AACnF,EAAA,uBACIa,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACX,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,gFAAA,EACT,QAAA,EAAA,KAAA,EACL,CAAA;AAAA,IACC;AAAA,GAAA,EACL,CAAA;AAER;AATSX,wBAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAWT,SAAS,UAAA,CAAW;AAAA,EAChB,KAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,uBACIW,cAAAA,CAAC,UAAA,EAAA,EAAW,KAAA,EACR,QAAA,kBAAAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4CAAA,EACV,QAAA,EAAA,MAAA,CAAO,IAAI,CAAC,CAAA,qBACTE,eAAAA,CAAC,KAAA,EAAA,EAAiB,WAAU,qCAAA,EACxB,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+CAAA,EACX,YAAE,IAAA,EACP,CAAA;AAAA,MACC,CAAA,CAAE,4BACCA,cAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACG,KAAA,EAAM,UAAA;AAAA,UACN,SAAA,EAAU,oDAAA;AAAA,UACb,QAAA,EAAA;AAAA;AAAA,OAED;AAAA,sBAEJA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EACX,YAAE,IAAA,EACP;AAAA,KAAA,EACJ,CAAA;AAAA,IACC,CAAA,CAAE,8BACCA,cAAAA,CAAC,OAAE,SAAA,EAAU,2DAAA,EACR,QAAA,EAAA,CAAA,CAAE,WAAA,EACP,CAAA,GACA;AAAA,GAAA,EAAA,EArBE,CAAA,CAAE,IAsBZ,CACH,CAAA,EACL,CAAA,EACJ,CAAA;AAER;AAtCSX,wBAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AAwCT,SAAS,SAAA,CAAU,EAAE,IAAA,EAAK,EAAqB;AAC3C,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,IAAA,EAAM,EAAE,CAAA;AACxC,EAAA,MAAM,GAAA,GAAM,CAAC,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,GAC9B,8CAAA,GACA,OAAA,IAAW,GAAA,GACP,mEACA,OAAA,IAAW,GAAA,GACP,wEAAA,GACA,OAAA,IAAW,MACP,oEAAA,GACA,gFAAA;AAClB,EAAA,uBACIW,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAWC,MAAAA;AAAA,IACb,uIAAA;AAAA,IACA;AAAA,KAEC,QAAA,EAAA,IAAA,EACL,CAAA;AAER;AAnBSZ,wBAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AC3KT,IAAM,mCAAmBA,wBAAA,CAAA,MAAM;AAC3B,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,CAAA;AAC5C,EAAA,MAAM,MAAM,gBAAA,CAAiB,QAAA,CAAS,eAAe,CAAA,CAAE,iBAAiB,iBAAiB,CAAA;AACzF,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,IAAO,EAAA,EAAI,EAAE,CAAA;AACrC,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,GAAI,MAAA,GAAS,CAAA;AAC9C,CAAA,EALyB,kBAAA,CAAA;AAOzB,IAAM,cAAA,mBAAiBA,wBAAA,CAAA,CAAC,CAAA,EAAuB,CAAA,KAC3C,CAAA,KAAM,IAAA,IAAQ,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,IAAA,KAAS,EAAE,IAAA,EADjC,gBAAA,CAAA;AAGvB,SAAS,gBAAA,CACL,EAAA,EACA,cAAA,EACA,QAAA,EACW;AACX,EAAA,MAAM,SAAA,GAAY,QAAA,GAAW,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA,GAAM,EAAA;AAC9C,EAAA,OAAO;AAAA,IACH,GAAA,EAAK,GAAG,SAAS,CAAA,EAAG,GAAG,MAAM,CAAA,CAAA,EAAI,GAAG,IAAI,CAAA,CAAA;AAAA,IACxC,QAAA,EAAU,EAAA;AAAA,IACV,QAAA,EAAU,cAAA,CAAe,cAAA,EAAgB,EAAE,CAAA;AAAA,IAC3C;AAAA,GACJ;AACJ;AAZSA,wBAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAcT,SAAS,oBAAA,CACL,KAAA,EACA,eAAA,EACA,cAAA,EACe;AACf,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAM,KAAA,IAAS,MAAM,MAAA,CAAO,IAAA;AAChD,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,IAAA,EAAM,OAAA,IAAW,IAAA;AACvC,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,EAAM,WAAA,IAAe,IAAA;AAE/C,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,MAAM,OAAA,EAAS;AACf,IAAA,KAAA,GAAQ,EAAE,MAAM,SAAA,EAAU;AAAA,EAC9B,CAAA,MAAA,IAAW,MAAM,KAAA,EAAO;AACpB,IAAA,KAAA,GAAQ,EAAE,IAAA,EAAM,OAAA,EAAS,OAAA,EAAS,MAAM,KAAA,EAAM;AAAA,EAClD,CAAA,MAAO;AACH,IAAA,MAAM,OAAA,GAAUoC,sCAAA,CAAqB,KAAA,CAAM,SAAA,EAAW,eAAe,CAAA;AACrE,IAAA,KAAA,GAAQ,QAAQ,MAAA,KAAW,CAAA,GACrB,EAAE,IAAA,EAAM,SAAQ,GAChB;AAAA,MACE,IAAA,EAAM,OAAA;AAAA,MACN,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,EAAA,KAAO,gBAAA,CAAiB,EAAA,EAAI,cAAA,EAAgB,KAAA,CAAM,MAAA,CAAO,EAAE,CAAC;AAAA,KACnF;AAAA,EACR;AAEA,EAAA,OAAO;AAAA,IACH,QAAA,EAAU,MAAM,MAAA,CAAO,EAAA;AAAA,IACvB,KAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,KAAA;AAAA,IACA,WAAW,KAAA,CAAM,SAAA;AAAA,IACjB,SAAS,KAAA,CAAM,eAAA;AAAA,IACf,cAAc,KAAA,CAAM;AAAA,GACxB;AACJ;AAlCSpC,wBAAA,CAAA,oBAAA,EAAA,sBAAA,CAAA;AAsCF,IAAM,WAAWc,uBAAAA,CAAM,UAAA,iBAA0Cd,wBAAA,CAAA,SAASkD,SAAAA,CAC7E,OACA,GAAA,EACF;AACE,EAAA,MAAM,SAAA,GAAYzC,cAA8B,IAAI,CAAA;AACpD,EAAA,MAAM,eAAA,GAAkBA,cAA4B,IAAI,CAAA;AACxD,EAAA,MAAM,EAAE,gBAAe,GAAI,KAAA;AAK3B,EAAA,MAAM,kBAAA,GAAqBD,mBAAY,MAA2B;AAC9D,IAAA,IAAI,eAAA,CAAgB,OAAA,EAAS,OAAO,eAAA,CAAgB,OAAA;AACpD,IAAA,IAAI,CAAC,SAAA,CAAU,OAAA,EAAS,OAAO,IAAA;AAC/B,IAAA,eAAA,CAAgB,OAAA,GAAU,eAAA,CAAgB,SAAA,CAAU,OAAO,CAAA;AAC3D,IAAA,OAAO,eAAA,CAAgB,OAAA;AAAA,EAC3B,CAAA,EAAG,EAAE,CAAA;AAKL,EAAA,MAAM,cAAA,GAAiBA,kBAAAA;AAAA,IACnB,CAAC,MAAA,KAAmB;AAChB,MAAA,MAAM,OAAO,SAAA,CAAU,OAAA;AACvB,MAAA,IAAI,CAAC,IAAA,EAAM;AACX,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,aAAA,CAA2B,CAAA,uBAAA,EAA0B,MAAM,CAAA,EAAA,CAAI,CAAA;AAC/E,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,MAAM,SAAS,kBAAA,EAAmB;AAClC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,MAAA,MAAM,GAAA,GACF,EAAA,CAAG,qBAAA,EAAsB,CAAE,GAAA,GAC3B,YAAA,CAAa,MAAM,CAAA,GACnB,YAAA,CAAa,MAAM,CAAA,GACnB,MAAA,GACA,CAAA;AACJ,MAAA,cAAA,CAAe,QAAQ,GAAG,CAAA;AAAA,IAC9B,CAAA;AAAA,IACA,CAAC,kBAAkB;AAAA,GACvB;AAEA,EAAAM,uBAAAA,CAAM,oBAAoB,GAAA,EAAK,OAAO,EAAE,cAAA,EAAe,CAAA,EAAI,CAAC,cAAc,CAAC,CAAA;AAM3E,EAAAR,iBAAU,MAAM;AACZ,IAAA,MAAM,OAAO,SAAA,CAAU,OAAA;AACvB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,SAAS,kBAAA,EAAmB;AAClC,IAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,UAAA,GAA4B,IAAA;AAEhC,IAAA,MAAM,0BAAUN,wBAAA,CAAA,MAAM;AAClB,MAAA,KAAA,GAAQ,CAAA;AACR,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAA8B,wBAAwB,CAAA;AAC5E,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,MAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,MAAA,MAAM,WAAA,GAAc,aAAa,MAAM,CAAA;AACvC,MAAA,MAAM,SAAA,GAAY,WAAA,GAAc,MAAA,GAAS,iBAAA,CAAkB,MAAM,CAAA,GAAI,IAAA;AACrE,MAAA,IAAI,MAAA,GAA6B,IAAA;AACjC,MAAA,KAAA,MAAW,CAAA,IAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,EAAG;AAClC,QAAA,MAAM,GAAA,GAAM,CAAA,CAAE,qBAAA,EAAsB,CAAE,GAAA;AACtC,QAAA,IAAI,OAAO,SAAA,EAAW;AAClB,UAAA,MAAA,GAAS,CAAA;AAAA,QACb,CAAA,MAAO;AACH,UAAA;AAAA,QACJ;AAAA,MACJ;AACA,MAAA,MAAM,MAAA,GAAS,MAAA,EAAQ,OAAA,CAAQ,cAAA,IAAkB,IAAA;AACjD,MAAA,IAAI,WAAW,UAAA,EAAY;AACvB,QAAA,UAAA,GAAa,MAAA;AACb,QAAA,cAAA,CAAe,MAAA,EAAQ,MAAA,EAAQ,OAAA,CAAQ,QAAA,IAAY,IAAI,CAAA;AAAA,MAC3D;AAAA,IACJ,CAAA,EArBgB,SAAA,CAAA;AAuBhB,IAAA,MAAM,2BAAWA,wBAAA,CAAA,MAAM;AACnB,MAAA,IAAI,KAAA,EAAO;AACX,MAAA,KAAA,GAAQ,sBAAsB,OAAO,CAAA;AAAA,IACzC,CAAA,EAHiB,UAAA,CAAA;AAKjB,IAAA,OAAA,EAAQ;AACR,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AAE7D,IAAA,MAAA,CAAO,iBAAiB,QAAA,EAAU,QAAA,EAAU,EAAE,OAAA,EAAS,MAAM,CAAA;AAC7D,IAAA,OAAO,MAAM;AACT,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,QAAQ,CAAA;AAC7C,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,QAAQ,CAAA;AAC7C,MAAA,IAAI,KAAA,uBAA4B,KAAK,CAAA;AAAA,IACzC,CAAA;AAAA,EACJ,CAAA,EAAG,CAAC,cAAA,EAAgB,kBAAA,EAAoB,KAAK,CAAC,CAAA;AAE9C,EAAA,IAAI,KAAA,CAAM,aAAa,UAAA,EAAY;AAC/B,IAAA,uBAAOW,cAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAuB,GAAG,KAAA,EAAO,CAAA;AAAA,EAC1D;AAEA,EAAA,uBAAOA,cAAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAuB,GAAG,KAAA,EAAO,CAAA;AAC1D,CAAA,EApGwE,UAAA,CAoGvE,CAAA;AAID,SAAS,YAAA,CAAa;AAAA,EAClB,SAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA;AACJ,CAAA,EAA0E;AACtE,EAAA,MAAM,gBAAA,GAAmBR,cAAAA;AAAA,IACrB,MAAMiC,sCAAA,CAAqB,SAAA,EAAW,eAAe,CAAA;AAAA,IACrD,CAAC,WAAW,eAAe;AAAA,GAC/B;AAEA,EAAA,MAAM,IAAA,GAAOjC,cAAAA;AAAA,IACT,MAAM,gBAAA,CAAiB,GAAA,CAAI,CAAC,EAAA,KAAO,gBAAA,CAAiB,EAAA,EAAI,cAAA,EAAgB,EAAA,CAAG,QAAA,IAAY,IAAI,CAAC,CAAA;AAAA,IAC5F,CAAC,kBAAkB,cAAc;AAAA,GACrC;AAEA,EAAA,MAAM,OAAA,GAAU,KAAK,MAAA,KAAW,CAAA;AAEhC,EAAA,uBACIQ,eAAC,KAAA,EAAA,EAAI,GAAA,EAAK,WACN,QAAA,kBAAAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2DAAA,EACV,QAAA,EAAA;AAAA,IAAA,IAAA,oBACGF,cAAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACG,IAAA;AAAA,QACA,MAAA,EAAQ,SAAA;AAAA,QACR,SAAA,EAAW,gBAAA;AAAA,QACX;AAAA;AAAA,KACJ;AAAA,IAEH,0BACGA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAkD,QAAA,EAAA,0BAAA,EAEjE,CAAA,mBAEAA,cAAAA,CAAC,SAAI,SAAA,EAAU,2BAAA,EACV,eAAK,GAAA,CAAI,CAAC,wBACPA,cAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QAEG,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,sBAAsB,GAAA,CAAI,QAAA;AAAA,QAC1B,OAAA,EAAS,MAAM,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAAA,QACzC,UAAU,GAAA,CAAI;AAAA,OAAA;AAAA,MAJT,GAAA,CAAI;AAAA,KAMhB,CAAA,EACL;AAAA,GAAA,EAER,CAAA,EACJ,CAAA;AAER;AArDSX,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAyDT,SAAS,YAAA,CAAa;AAAA,EAClB,SAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,cAAA;AAAA,EACA;AACJ,CAAA,EAA0E;AACtE,EAAA,MAAM,QAAA,GAAWG,cAAAA;AAAA,IACb,MAAM,YAAY,GAAA,CAAI,CAAC,MAAM,oBAAA,CAAqB,CAAA,EAAG,eAAA,EAAiB,cAAc,CAAC,CAAA;AAAA,IACrF,CAAC,WAAA,EAAa,eAAA,EAAiB,cAAc;AAAA,GACjD;AAEA,EAAA,uBACIQ,eAAC,KAAA,EAAA,EAAI,GAAA,EAAK,WACN,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sEAAA,EACV,QAAA,EAAA,QAAA,CAAS,IAAI,CAAC,OAAA,qBACXA,cAAAA,CAAC,iBAAA,EAAA,EAAyC,OAAA,EAAkB,iBAApC,OAAA,CAAQ,QAA0D,CAC7F,CAAA,EACL,CAAA,EACJ,CAAA;AAER;AArBSX,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAuBT,IAAM,iBAAA,GAAoBc,uBAAAA,CAAM,IAAA,iBAAKd,wBAAA,CAAA,SAASmD,kBAAAA,CAAkB;AAAA,EAC5D,OAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,MAAM,UAAU,OAAA,CAAQ,SAAA,KAAc,IAAA,IAAQ,OAAA,CAAQ,aAAa,MAAA,GAAS,CAAA;AAC5E,EAAA,uBACItC,eAAAA,CAAC,SAAA,EAAA,EAAQ,sBAAoB,OAAA,CAAQ,QAAA,EAAU,WAAU,cAAA,EACrD,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAU,oBAAA,EACd,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACX,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACX,QAAA,EAAA;AAAA,0BAAAF,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAyC,kBAAQ,KAAA,EAAM,CAAA;AAAA,UACpE,QAAQ,OAAA,oBACLE,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,4CAAA,EAA6C,QAAA,EAAA;AAAA,YAAA,GAAA;AAAA,YACvD,OAAA,CAAQ;AAAA,WAAA,EACd;AAAA,SAAA,EAER,CAAA;AAAA,QACC,2BACGF,cAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACG,QAAQ,OAAA,CAAQ,SAAA;AAAA,YAChB,WAAW,OAAA,CAAQ,YAAA;AAAA,YACnB,SAAS,OAAA,CAAQ;AAAA;AAAA;AACrB,OAAA,EAER,CAAA;AAAA,MACC,OAAA,CAAQ,+BACLA,cAAAA,CAAC,OAAE,SAAA,EAAU,wDAAA,EACR,kBAAQ,WAAA,EACb;AAAA,KAAA,EAER,CAAA;AAAA,oBACAA,cAAAA,CAAC,sBAAA,EAAA,EAAuB,OAAA,EAAkB,aAAA,EAA8B;AAAA,GAAA,EAC5E,CAAA;AAER,CAAA,EArCqC,mBAAA,CAqCpC,CAAA;AAED,SAAS,sBAAA,CAAuB;AAAA,EAC5B,OAAA;AAAA,EACA;AACJ,CAAA,EAGG;AACC,EAAA,QAAQ,OAAA,CAAQ,MAAM,IAAA;AAAM,IACxB,KAAK,SAAA;AACD,MAAA,uBACIE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EAAiD,QAAA,EAAA;AAAA,QAAA,UAAA;AAAA,QACnD,OAAA,CAAQ,KAAA;AAAA,QAAM;AAAA,OAAA,EAC3B,CAAA;AAAA,IAER,KAAK,OAAA;AACD,MAAA,uBACIA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA;AAAA,QAAA,iBAAA;AAAA,QACvC,OAAA,CAAQ,KAAA;AAAA,QAAM,IAAA;AAAA,QAAG,QAAQ,KAAA,CAAM;AAAA,OAAA,EACnD,CAAA;AAAA,IAER,KAAK,OAAA;AACD,MAAA,uBACIF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAiD,QAAA,EAAA,8BAAA,EAEhE,CAAA;AAAA,IAER,KAAK,OAAA;AACD,MAAA,uBACIA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACV,QAAA,EAAA,OAAA,CAAQ,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,qBACrBA,cAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UAEG,UAAU,GAAA,CAAI,QAAA;AAAA,UACd,sBAAsB,GAAA,CAAI,QAAA;AAAA,UAC1B,OAAA,EAAS,MAAM,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AAAA,UACzC,UAAU,GAAA,CAAI;AAAA,SAAA;AAAA,QAJT,GAAA,CAAI;AAAA,OAMhB,CAAA,EACL,CAAA;AAAA;AAGhB;AAzCSX,wBAAA,CAAA,sBAAA,EAAA,wBAAA,CAAA;AC7UT,IAAMoD,UAAAA,GAAY,CAAA;AAIlB,SAAS,iBAAiB,MAAA,EAA6C;AACnE,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,IAAK,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA;AAC9E,EAAA,QAAQ,OAAO,IAAA;AAAM,IACjB,KAAK,QAAA,EAAU;AACX,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,MAAA,CAAO,QAAQ,MAAA,CAAO,UAAA,IAAc,EAAE,CAAA,EAAG;AAC1D,QAAA,GAAA,CAAI,CAAC,CAAA,GAAI,gBAAA,CAAiB,CAAC,CAAA;AAAA,MAC/B;AACA,MAAA,OAAO,GAAA;AAAA,IACX;AAAA,IACA,KAAK,OAAA;AACD,MAAA,OAAO,EAAC;AAAA,IACZ,KAAK,SAAA;AAAA,IACL,KAAK,QAAA;AACD,MAAA,OAAO,CAAA;AAAA,IACX,KAAK,SAAA;AACD,MAAA,OAAO,KAAA;AAAA,IACX,KAAK,QAAA;AACD,MAAA,OAAO,EAAA;AAAA,IACX;AACI,MAAA,IAAI,OAAO,UAAA,EAAY;AACnB,QAAA,MAAM,MAA+B,EAAC;AACtC,QAAA,KAAA,MAAW,CAAC,GAAG,CAAC,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AACpD,UAAA,GAAA,CAAI,CAAC,CAAA,GAAI,gBAAA,CAAiB,CAAC,CAAA;AAAA,QAC/B;AACA,QAAA,OAAO,GAAA;AAAA,MACX;AACA,MAAA,OAAO,EAAA;AAAA;AAEnB;AA9BSpD,wBAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AAwCF,SAAS,cAAA,CAAe,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAS,EAAwB;AAC7E,EAAA,uBACIW,cAAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACG,MAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,QAAA,EAAU;AAAA;AAAA,GACd;AAER;AAVgBX,wBAAA,CAAA,cAAA,EAAA,gBAAA,CAAA;AAuBhB,SAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,KAAA,EAAO,UAAU,KAAA,EAAO,QAAA,EAAU,OAAM,EAAqB;AAIxF,EAAA,IAAI,QAAQoD,UAAAA,EAAW;AACnB,IAAA,uBAAOzC,cAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAc,OAAc,QAAA,EAAoB,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,CAAO,IAAI,KAAK,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AACtD,IAAA,uBAAOA,cAAAA,CAAC,SAAA,EAAA,EAAU,QAAgB,KAAA,EAAc,QAAA,EAAoB,OAAc,QAAA,EAAoB,CAAA;AAAA,EAC1G;AAEA,EAAA,QAAQ,OAAO,IAAA;AAAM,IACjB,KAAK,QAAA;AACD,MAAA,uBAAOA,cAAAA,CAAC,WAAA,EAAA,EAAY,QAAgB,KAAA,EAAc,QAAA,EAAoB,OAAc,KAAA,EAAc,CAAA;AAAA,IACtG,KAAK,OAAA;AACD,MAAA,uBAAOA,eAAC,UAAA,EAAA,EAAW,MAAA,EAAgB,OAAc,QAAA,EAAoB,KAAA,EAAc,OAAc,QAAA,EAAoB,CAAA;AAAA,IACzH,KAAK,SAAA;AACD,MAAA,uBAAOA,cAAAA,CAAC,YAAA,EAAA,EAAa,OAAc,QAAA,EAAoB,KAAA,EAAc,QAAgB,QAAA,EAAoB,CAAA;AAAA,IAC7G,KAAK,SAAA;AAAA,IACL,KAAK,QAAA;AACD,MAAA,uBAAOA,cAAAA,CAAC,WAAA,EAAA,EAAY,OAAc,QAAA,EAAoB,KAAA,EAAc,QAAgB,QAAA,EAAoB,CAAA;AAAA,IAC5G,KAAK,QAAA;AAAA,IACL;AAGI,MAAA,IAAI,CAAC,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,UAAA,EAAY;AACnC,QAAA,uBAAOA,cAAAA,CAAC,WAAA,EAAA,EAAY,QAAgB,KAAA,EAAc,QAAA,EAAoB,OAAc,KAAA,EAAc,CAAA;AAAA,MACtG;AACA,MAAA,uBAAOA,cAAAA,CAAC,WAAA,EAAA,EAAY,OAAc,QAAA,EAAoB,KAAA,EAAc,QAAgB,QAAA,EAAoB,CAAA;AAAA;AAEpH;AA/BSX,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAmCT,SAAS,WAAA,CAAY;AAAA,EACjB,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACJ,CAAA,EAKG;AACC,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,EAAA,uBACIa,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACX,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACjE,4BAAYA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAqD,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACnFA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDAAkD,QAAA,EAAA,IAAA,EAAK;AAAA,KAAA,EAC3E,CAAA;AAAA,IACC,+BACGA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,qDAAqD,QAAA,EAAA,WAAA,EAAY;AAAA,GAAA,EAEtF,CAAA;AAER;AAxBSX,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AA0BT,SAAS,WAAA,CAAY;AAAA,EACjB,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ;AACpC,CAAA,EAMG;AACC,EAAA,MAAM,WAAA,GAAc,OAAO,KAAA,KAAU,QAAA,GAAW,QAAQ,KAAA,IAAS,IAAA,GAAO,EAAA,GAAK,MAAA,CAAO,KAAK,CAAA;AACzF,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,IAAA,IAAQ,QAAQ,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,CAAA,CAAA,GAAM,MAAA,CAAO,WAAA,IAAe,OAAO,IAAA,IAAQ,QAAA;AAC3H,EAAA,uBACIa,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAc,IAAA,EAAM,OAAO,MAAA,GAAS,CAAA,QAAA,EAAW,MAAA,CAAO,MAAM,CAAA,CAAA,CAAA,GAAM,QAAA,EAAU,QAAA,EAAoB,WAAA,EAAa,OAAO,WAAA,EAAa,CAAA;AAAA,oBAC9IA,cAAAA;AAAA,MAAC4B,gBAAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO,WAAA;AAAA,QACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QACxC,WAAA;AAAA,QACA,SAAA,EAAU;AAAA;AAAA;AACd,GAAA,EACJ,CAAA;AAER;AAtBSvC,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAwBT,SAAS,WAAA,CAAY;AAAA,EACjB,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ;AACpC,CAAA,EAMG;AACC,EAAA,MAAM,GAAA,GAAM,KAAA,IAAS,IAAA,GAAO,EAAA,GAAK,OAAO,KAAK,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,KAAS,SAAA,GAAY,SAAA,GAAY,QAAA;AACrD,EAAA,uBACIa,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,oBAAAF,eAAC,WAAA,EAAA,EAAY,KAAA,EAAc,IAAA,EAAM,MAAA,CAAO,SAAS,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,MAAM,CAAA,CAAA,CAAA,GAAM,IAAA,EAAM,QAAA,EAAoB,WAAA,EAAa,OAAO,WAAA,EAAa,CAAA;AAAA,oBAC3IA,cAAAA;AAAA,MAAC4B,gBAAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAK,QAAA;AAAA,QACL,KAAA,EAAO,GAAA;AAAA,QACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACb,UAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,UAAA,IAAI,CAAA,KAAM,EAAA,EAAI,OAAO,QAAA,CAAS,IAAI,CAAA;AAClC,UAAA,MAAM,CAAA,GAAI,OAAO,IAAA,KAAS,SAAA,GAAY,SAAS,CAAA,EAAG,EAAE,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA;AACpE,UAAA,QAAA,CAAS,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,GAAI,OAAO,CAAC,CAAA;AAAA,QACvC,CAAA;AAAA,QACA,WAAA,EAAa,IAAA;AAAA,QACb,SAAA,EAAU;AAAA;AAAA;AACd,GAAA,EACJ,CAAA;AAER;AA5BSvC,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AA8BT,SAAS,YAAA,CAAa;AAAA,EAClB,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ;AACpC,CAAA,EAMG;AACC,EAAA,MAAM,OAAO,KAAA,KAAU,IAAA;AACvB,EAAA,uBACIa,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACX,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,eAAY,KAAA,EAAc,IAAA,EAAK,WAAU,QAAA,EAAoB,WAAA,EAAa,OAAO,WAAA,EAAa,CAAA;AAAA,oBAC/FA,eAAC0C,iBAAA,EAAA,EAAO,OAAA,EAAS,MAAM,eAAA,EAAiB,QAAA,EAAU,WAAU,iBAAA,EAAkB;AAAA,GAAA,EAClF,CAAA;AAER;AAhBSrD,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAkBT,SAAS,SAAA,CAAU;AAAA,EACf,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO;AACpC,CAAA,EAMG;AACC,EAAA,MAAM,WAAW,MAAA,CAAO,IAAA,IAAQ,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IAC5C,KAAA,EAAO,OAAO,CAAC,CAAA;AAAA,IACf,KAAA,EAAO,OAAO,CAAC;AAAA,GACnB,CAAE,CAAA;AACF,EAAA,MAAM,QAAA,GAAW,KAAA,IAAS,IAAA,GAAO,EAAA,GAAK,OAAO,KAAK,CAAA;AAClD,EAAA,uBACIa,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAc,IAAA,EAAM,CAAA,EAAG,MAAA,CAAO,IAAA,IAAQ,MAAM,CAAA,KAAA,CAAA,EAAS,QAAA,EAAoB,WAAA,EAAa,MAAA,CAAO,WAAA,EAAa,CAAA;AAAA,oBACvHA,cAAAA;AAAA,MAAC0B,mBAAAA;AAAA,MAAA;AAAA,QACG,OAAA;AAAA,QACA,KAAA,EAAO,QAAA;AAAA,QACP,aAAA,EAAe,CAAC,CAAA,KAAM;AAElB,UAAA,IAAI,OAAO,IAAA,KAAS,SAAA,WAAoB,QAAA,CAAS,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,eAAA,IAC9C,OAAO,IAAA,KAAS,QAAA,EAAU,QAAA,CAAS,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,wBAC3C,CAAC,CAAA;AAAA,QACnB,CAAA;AAAA,QACA,WAAA,EAAY,cAAA;AAAA,QACZ,iBAAA,EAAkB,cAAA;AAAA,QAClB,SAAA,EAAU;AAAA;AAAA;AACd,GAAA,EACJ,CAAA;AAER;AAhCSrC,wBAAA,CAAA,SAAA,EAAA,WAAA,CAAA;AAkCT,SAAS,YAAA,CAAa;AAAA,EAClB,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO;AAClB,CAAA,EAIG;AACC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIc,uBAAAA,CAAM,QAAA,CAAS,MAAM,IAAA,CAAK,SAAA,CAAU,KAAA,IAAS,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAEnF,EAAAA,uBAAAA,CAAM,UAAU,MAAM;AAClB,IAAA,OAAA,CAAQ,KAAK,SAAA,CAAU,KAAA,IAAS,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EAClD,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACV,EAAA,uBACID,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACV,QAAA,EAAA;AAAA,IAAA,KAAA,oBAASA,gBAAC,YAAA,EAAA,EAAc,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MAAM;AAAA,KAAA,EAAM,CAAA;AAAA,oBACrCF,cAAAA;AAAA,MAAC2C,mBAAA;AAAA,MAAA;AAAA,QACG,KAAA,EAAO,IAAA;AAAA,QACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACb,UAAA,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AACtB,UAAA,IAAI;AAAE,YAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAAG,CAAA,CAAA,MAAQ;AAAA,UAAwB;AAAA,QAChF,CAAA;AAAA,QACA,SAAA,EAAU,oCAAA;AAAA,QACV,IAAA,EAAM;AAAA;AAAA;AACV,GAAA,EACJ,CAAA;AAER;AA1BStD,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AA8BT,SAAS,WAAA,CAAY;AAAA,EACjB,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO;AACpC,CAAA,EAMG;AACC,EAAA,MAAM,GAAA,GAAO,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAChE,KAAA,GACD,EAAC;AACP,EAAA,MAAM,WAAW,IAAI,GAAA,CAAI,MAAA,CAAO,QAAA,IAAY,EAAE,CAAA;AAC9C,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,UAAA,IAAc,EAAE,CAAA;AAEtD,EAAA,MAAM,MAAA,GAASQ,kBAAAA;AAAA,IACX,CAAC,GAAA,KAAgB,CAAC,IAAA,KAAkB;AAChC,MAAA,QAAA,CAAS,EAAE,GAAG,GAAA,EAAK,CAAC,GAAG,GAAG,MAAM,CAAA;AAAA,IACpC,CAAA;AAAA,IACA,CAAC,KAAK,QAAQ;AAAA,GAClB;AAEA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtB,IAAA,uBAAOG,cAAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAc,KAAA,EAAO,KAAK,QAAA,EAA4C,CAAA;AAAA,EAC/F;AAIA,EAAA,MAAM,YAAA,GAAe,KAAA,KAAU,CAAA,GACzB,WAAA,GACA,kDAAA;AAEN,EAAA,uBACIE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACV,QAAA,EAAA;AAAA,IAAA,KAAA,IAAS,QAAQ,CAAA,oBACdA,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAClEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDAAiD,QAAA,EAAA,QAAA,EAAM;AAAA,KAAA,EAC3E,CAAA;AAAA,oBAEJA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,OAAG,YAAY,CAAA,EAC1B,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,SAAS,sBACzBD,cAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QAEG,MAAA,EAAQ,SAAA;AAAA,QACR,KAAA,EAAO,IAAI,GAAG,CAAA;AAAA,QACd,QAAA,EAAU,OAAO,GAAG,CAAA;AAAA,QACpB,OAAO,KAAA,GAAQ,CAAA;AAAA,QACf,QAAA,EAAU,QAAA,CAAS,GAAA,CAAI,GAAG,CAAA;AAAA,QAC1B,KAAA,EAAO;AAAA,OAAA;AAAA,MANF;AAAA,KAQZ,CAAA,EACL;AAAA,GAAA,EACJ,CAAA;AAER;AAvDSX,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAyDT,SAAS,UAAA,CAAW;AAAA,EAChB,MAAA;AAAA,EAAQ,KAAA;AAAA,EAAO,QAAA;AAAA,EAAU,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO;AAC3C,CAAA,EAOG;AACC,EAAA,MAAM,MAAM,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,QAAQ,EAAC;AAC5C,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,IAAS,EAAE,MAAM,QAAA,EAAS;AAE/C,EAAA,MAAM,OAAA,mBAAUA,wBAAA,CAAA,MAAM,QAAA,CAAS,CAAC,GAAG,KAAK,gBAAA,CAAiB,KAAK,CAAC,CAAC,CAAA,EAAhD,SAAA,CAAA;AAChB,EAAA,MAAM,QAAA,mBAAWA,wBAAA,CAAA,CAAC,CAAA,KAAc,QAAA,CAAS,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,EAAG,GAAA,KAAQ,GAAA,KAAQ,CAAC,CAAC,CAAA,EAAzD,UAAA,CAAA;AACjB,EAAA,MAAM,wBAAQA,wBAAA,CAAA,CAAC,CAAA,KAAc,CAAC,IAAA,KAC1B,SAAS,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,QAAS,GAAA,KAAQ,CAAA,GAAI,IAAA,GAAO,CAAE,CAAC,CAAA,EAD1C,OAAA,CAAA;AAGd,EAAA,uBACIa,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACV,QAAA,EAAA;AAAA,IAAA,KAAA,oBACGA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MACjE,4BAAYA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAqD,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,sBACnFA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDACX,QAAA,EAAA,CAAA,MAAA,EAAS,KAAA,CAAM,IAAA,IAAQ,KAAK,CAAA,CAAA,CAAA,EACjC;AAAA,KAAA,EACJ,CAAA;AAAA,oBAEJE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACV,QAAA,EAAA;AAAA,MAAA,GAAA,CAAI,WAAW,CAAA,oBACZF,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+CAA8C,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,MAEzE,GAAA,CAAI,IAAI,CAAC,CAAA,EAAG,sBACTE,eAAAA,CAAC,KAAA,EAAA,EAAY,SAAA,EAAU,wBAAA,EACnB,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACX,QAAA,kBAAAA,cAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACG,MAAA,EAAQ,KAAA;AAAA,YACR,KAAA,EAAO,CAAA;AAAA,YACP,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,YACjB,OAAO,KAAA,GAAQ,CAAA;AAAA,YACf,QAAA,EAAU,KAAA;AAAA,YACV,KAAA,EAAO,CAAA,EAAG,KAAA,IAAS,EAAE,IAAI,CAAC,CAAA,CAAA;AAAA;AAAA,SAC9B,EACJ,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,CAAA;AAAA,YACzB,KAAA,EAAM,aAAA;AAAA,YACN,SAAA,EAAU,4JAAA;AAAA,YAEV,QAAA,kBAAAA,cAAAA,CAAC4C,iBAAA,EAAA,EAAM,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA;AACnC,OAAA,EAAA,EAlBM,CAmBV,CACH,CAAA;AAAA,sBACD1C,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAK,QAAA;AAAA,UACL,OAAA,EAAS,OAAA;AAAA,UACT,SAAA,EAAU,iHAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAF,cAAAA,CAAC6C,gBAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA;AAEhC,KAAA,EACJ;AAAA,GAAA,EACJ,CAAA;AAER;AAlESxD,wBAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AChVF,SAAS,mBAAA,GAAsB;AAClC,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAe,cAAA,KAAmBU,sCAAA,EAAqB;AACtE,EAAA,MAAM,KAAK,KAAA,CAAM,gBAAA;AACjB,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,gBAAA,CAAiB,KAAA,CAAM,gBAAgB,EAAE,CAAA;AAE3D,EAAA,MAAM,QAAA,GACF,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,UAAU,EAAE,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,WAAA,CAAY,MAAA,GAAS,CAAA;AAE3E,EAAA,MAAM,OAAA,GAAUF,mBAAY,MAAM;AAC9B,IAAA,aAAA,CAAc,EAAE,CAAA;AAChB,IAAA,cAAA,CAAe,EAAE,CAAA;AACjB,IAAA,KAAA,EAAM;AAAA,EACV,CAAA,EAAG,CAAC,aAAA,EAAe,cAAA,EAAgB,KAAK,CAAC,CAAA;AAEzC,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,QAAA,EAAU,OAAO,IAAA;AAE7B,EAAA,uBACIK,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,KAAA,EAAM,sCAAA;AAAA,MACN,SAAA,EAAWD,MAAAA;AAAA,QACP,kEAAA;AAAA,QACA;AAAA,OACJ;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC8C,qBAAA,EAAA,EAAU,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,QAAE;AAAA;AAAA;AAAA,GAEzC;AAER;AA9BgBzD,wBAAA,CAAA,mBAAA,EAAA,qBAAA,CAAA;ACYhB,SAAS,WAAA,CAAY,EAAE,KAAA,EAAO,MAAA,EAAO,EAAuC;AACxE,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAc,GAAIU,sCAAA,EAAqB;AAEtD,EAAA,SAAS,YAAA,CAAa,MAAc,KAAA,EAAe;AAC/C,IAAA,aAAA,CAAc,EAAE,GAAG,KAAA,CAAM,UAAA,EAAY,CAAC,IAAI,GAAG,OAAO,CAAA;AAAA,EACxD;AAFS,EAAAV,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAIT,EAAA,uBACIa,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,gBAAc,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACrBA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aACV,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACf,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,UAAA,CAAW,CAAA,CAAE,IAAI,CAAA,IAAK,EAAA;AAC1C,MAAA,MAAM,WAAA,GAAc,CAAA,CAAE,WAAA,IAAe,CAAA,CAAE,IAAA;AACvC,MAAA,uBACIE,eAAAA,CAAC,KAAA,EAAA,EAAiB,SAAA,EAAU,WAAA,EACxB,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACX,QAAA,EAAA;AAAA,0BAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAAA,EAA4C,YAAE,IAAA,EAAK,CAAA;AAAA,UAClE,EAAE,QAAA,oBACCA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAqD,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,0BAE1EA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EAAkD,YAAE,IAAA,EAAK;AAAA,SAAA,EAC7E,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAAC4B,gBAAAA;AAAA,UAAA;AAAA,YACG,KAAA;AAAA,YACA,QAAA,EAAU,CAAC,CAAA,KACP,YAAA,CAAa,EAAE,IAAA,EAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAEvC,WAAA;AAAA,YACA,SAAA,EAAU;AAAA;AAAA;AACd,OAAA,EAAA,EAfM,EAAE,IAgBZ,CAAA;AAAA,IAER,CAAC,CAAA,EACL;AAAA,GAAA,EACJ,CAAA;AAER;AArCSvC,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AAyCF,SAAS,YAAA,GAAe;AAC3B,EAAA,MAAM;AAAA,IACF,KAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,MACAU,sCAAA,EAAqB;AAIzB,EAAA,MAAM,aAAA,GAAkCP,cAAAA;AAAA,IACpC,MACI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAChB,OAAO,CAAA,CAAE,EAAA;AAAA,MACT,KAAA,EAAO,EAAE,IAAA,IAAQ,aAAA;AAAA;AAAA;AAAA,MAGjB,WAAA,EAAa,CAAA,CAAE,MAAA,GACT,CAAA,EAAG,CAAA,CAAE,OAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,MAAA,CAAA,GACvB;AAAA,KACV,CAAE,CAAA;AAAA,IACN,CAAC,OAAO;AAAA,GACZ;AACA,EAAA,MAAM,UAAA,GAAa,cAAc,MAAA,GAAS,CAAA;AAE1C,EAAA,MAAM,KAAK,KAAA,CAAM,gBAAA;AAGjB,EAAA,MAAM,cAAc,KAAA,CAAM,WAAA,GAAcuD,6BAAA,CAAY,KAAA,CAAM,WAAW,CAAA,GAAI,IAAA;AAEzE,EAAA,MAAM,WAAA,GAAcvD,eAAQ,MAAM;AAC9B,IAAA,IAAI,CAAC,KAAA,CAAM,UAAA,EAAY,OAAO,EAAA;AAK9B,IAAA,MAAM,WAAA,GAAcwD,iCAAA,CAAgB,KAAA,CAAM,UAAU,CAAA;AACpD,IAAA,MAAM,SAAS,KAAA,CAAM,cAAA,GAAiBC,iCAAe,OAAA,EAAS,KAAA,CAAM,cAAc,CAAA,GAAI,IAAA;AACtF,IAAA,MAAM,IAAA,GAAOC,qCAAA,CAAoB,KAAA,CAAM,cAAc,CAAA;AACrD,IAAA,IAAI,QAAQ,IAAA,CAAK,WAAW,CAAA,GAAI,MAAA,CAAO,UAAU,MAAA,CAAO,EAAA;AACxD,IAAA,IAAI,GAAA,GAAM,CAAA,QAAA,EAAW,KAAA,CAAM,aAAa,KAAK,WAAW,CAAA,CAAA,CAAA;AACxD,IAAA,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AAAE,MAAA,GAAA,IAAO,CAAA;AAAA,MAAA,EAAc,CAAC,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,IAAK,CAAC,CAAA;AAC7E,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,aAAA,KAAkB,SAAS,WAAA,EAAa;AACnE,MAAA,GAAA,IAAO,CAAA;AAAA,MAAA,EAAc,MAAM,WAAW,CAAA,CAAA,CAAA;AAAA,IAC1C;AACA,IAAA,OAAO,GAAA;AAAA,EACX,CAAA,EAAG,CAAC,KAAA,EAAO,OAAA,EAAS,WAAW,CAAC,CAAA;AAEhC,EAAA,MAAM,UAAA,GAAa1D,cAAAA;AAAA,IACf,MAAM,EAAA,EAAI,UAAA,EAAY,MAAA,CAAO,CAAC,CAAA,KAAM,EAAA,CAAG,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAC,KAAK,EAAC;AAAA,IACzE,CAAC,EAAE;AAAA,GACP;AACA,EAAA,MAAM,WAAA,GAAcA,cAAAA;AAAA,IAChB,MAAM,EAAA,EAAI,UAAA,EAAY,MAAA,CAAO,CAAC,MAAM,CAAC,EAAA,CAAG,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAC,KAAK,EAAC;AAAA,IAC1E,CAAC,EAAE;AAAA,GACP;AAGA,EAAuB,KAAA,CAAM,OAAA,IAAW,CAAC,KAAA,CAAM,cAAc,CAAC;AAG9D,EAAA,MAAM,aAAiBwD,iCAAA,CAAgB,KAAA,CAAM,UAAA,IAAc,EAAA,EAAI,QAAQ,EAAE,CAAA;AACzE,EAAA,MAAM,OAAA,GAAiB,IAAI,MAAA,KAAW,KAAA;AACtC,EAAA,MAAM,QAAA,GAAiB,EAAA,EAAI,WAAA,EAAa,IAAA,IAAQ,EAAA;AAChD,EAAA,MAAM,aAAA,GAAiB,WAAW,MAAA,GAAS,CAAA;AAC3C,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAA,GAAS,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAiB,QAAQ,WAAW,CAAA;AAC1C,EAAA,MAAM,MAAA,GAAiB,EAAA,GAAK3C,8BAAA,CAAa,EAAA,CAAG,IAAI,CAAA,GAAI,EAAA;AAIpD,EAAA,MAAM,UAAA,GAAiB,UAAA,KAAe,EAAA,IAAM,UAAA,KAAe,MAAA;AAG3D,EAAA,IAAI,CAAC,EAAA,EAAI;AACL,IAAA,uBAAOL,cAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAMmD,gBAAA,EAAM,MAAK,uCAAA,EAAwC,CAAA;AAAA,EAChF;AAGA,EAAA,uBACIjD,gBAAAkD,mBAAA,EAAA,EAQM,QAAA,EAAA;AAAA,IAAA,CAAA,UAAA,IAAc,EAAA,qBACZlD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8EAAA,EACV,QAAA,EAAA;AAAA,MAAA,UAAA,mBACGF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+FAAA,EACX,QAAA,EAAA,UAAA,EACL,CAAA,mBAEAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBAE7BA,eAAC,mBAAA,EAAA,EAAoB;AAAA,KAAA,EACzB,CAAA;AAAA,oBAIJE,eAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,qBAAA,EAEjB,QAAA,EAAA;AAAA,MAAA,aAAA,oBAAkBF,cAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAM,iBAAA,EAAmB,QAAQ,UAAA,EAAY,CAAA;AAAA,MAC5E,kCAAkBA,cAAAA,CAAC,eAAY,KAAA,EAAM,kBAAA,EAAmB,QAAQ,WAAA,EAAa,CAAA;AAAA,MAG7E,2BACGA,cAAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACG,MAAA,EAAQ,GAAG,WAAA,EAAa,MAAA;AAAA,UACxB,QAAA;AAAA,UACA,eAAA,EAAiB,GAAG,WAAA,EAAa,WAAA;AAAA,UACjC,OAAO,KAAA,CAAM,WAAA;AAAA,UACb,QAAA,EAAU,cAAA;AAAA,UACV;AAAA;AAAA,OACJ;AAAA,sBAIJA,cAAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACG,KAAA,kBACIE,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gCAAA,EACZ,QAAA,EAAA;AAAA,4BAAAF,cAAAA,CAACqD,eAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,YAAE;AAAA,WAAA,EAEnC,CAAA;AAAA,UAGJ,QAAA,kBAAAnD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACX,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACX,QAAA,EAAA;AAAA,8BAAAF,cAAAA,CAAC,gBAAa,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,8BACrBA,cAAAA;AAAA,gBAAC0B,mBAAAA;AAAA,gBAAA;AAAA,kBACG,OAAA,EAAS,aAAA;AAAA,kBACT,KAAA,EAAO,MAAM,cAAA,IAAkB,EAAA;AAAA,kBAC/B,aAAA,EAAe,CAAC,CAAA,KAAM,iBAAA,CAAkB,KAAK,IAAI,CAAA;AAAA,kBACjD,WAAA,EACI,cAAA,GACM,oBAAA,GACA,UAAA,GACI,mBAAA,GACA,iBAAA;AAAA,kBAEd,iBAAA,EAAkB,mBAAA;AAAA,kBAClB,SAAA,EAAU,iBAAA;AAAA,kBACV,QAAA,EAAU,kBAAkB,CAAC,UAAA;AAAA,kBAC7B,SAAA,EAAU;AAAA;AAAA,eACd;AAAA,8BACAxB,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mCAAA,EAAoC,QAAA,EAAA;AAAA,gBAAA,wBAAA;AAAA,gBACtB,GAAA;AAAA,gCACvBF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAY,QAAA,EAAA,WAAA,EAAS,CAAA;AAAA,gBAAO;AAAA,eAAA,EAChD;AAAA,aAAA,EACJ,CAAA;AAAA,4BACAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACX,QAAA,EAAA;AAAA,8BAAAF,cAAAA,CAAC,gBAAa,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,8BAC1BA,cAAAA;AAAA,gBAAC4B,gBAAAA;AAAA,gBAAA;AAAA,kBACG,IAAA,EAAK,UAAA;AAAA,kBACL,WAAA,EAAY,0CAAA;AAAA,kBACZ,OAAO,KAAA,CAAM,cAAA;AAAA,kBACb,UAAU,CAAC,CAAA,KAAM,iBAAA,CAAkB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBACjD,SAAA,EAAU;AAAA;AAAA;AACd,aAAA,EACJ,CAAA;AAAA,4BACA1B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EACX,QAAA,EAAA;AAAA,8BAAAF,cAAAA,CAAC,gBAAa,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,8BACrBA,cAAAA;AAAA,gBAAC2C,mBAAAA;AAAA,gBAAA;AAAA,kBACG,OAAO,KAAA,CAAM,cAAA;AAAA,kBACb,UAAU,CAAC,CAAA,KAAM,iBAAA,CAAkB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,kBACjD,SAAA,EAAU,6CAAA;AAAA,kBACV,IAAA,EAAM;AAAA;AAAA;AACV,aAAA,EACJ;AAAA,WAAA,EACJ;AAAA;AAAA,OACJ;AAAA,MAIC,2BACG3C,cAAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACG,KAAA,kBACIE,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,gCAAA,EACZ,QAAA,EAAA;AAAA,4BAAAF,cAAAA,CAACsD,oBAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,YAAE;AAAA,WAAA,EAExC,CAAA;AAAA,UAGJ,QAAA,kBAAAtD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QACX,QAAA,kBAAAA,cAAAA;AAAA,YAACuD,oCAAA;AAAA,YAAA;AAAA,cACG,IAAA,EAAM,WAAA;AAAA,cACN,QAAA,EAAS,MAAA;AAAA,cACT,SAAA,EAAS,IAAA;AAAA,cACT,QAAA,EAAU;AAAA;AAAA,WACd,EACJ;AAAA;AAAA,OACJ;AAAA,sBAOJvD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EAAM;AAAA,KAAA,EACzB;AAAA,GAAA,EACJ,CAAA;AAER;AAhNgBX,wBAAA,CAAA,YAAA,EAAA,cAAA,CAAA;AAkOhB,SAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,QAAA,EAAU,iBAAiB,KAAA,EAAO,QAAA,EAAU,aAAY,EAAqB;AAGxG,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,MAAA;AACpB,EAAA,MAAM,CAAC,MAAM,OAAO,CAAA,GAAIc,wBAAM,QAAA,CAAuB,SAAA,GAAY,SAAS,MAAM,CAAA;AAKhF,EAAA,MAAM,MAAA,GAASA,uBAAAA,CAAM,OAAA,CAAQ,MAAM;AAC/B,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,IAAI;AAAE,MAAA,OAAO,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,IAAG,CAAA,CAAA,MAAQ;AAAE,MAAA,OAAO,IAAA;AAAA,IAAM;AAAA,EAC3D,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,gBAAA,GAAmBN,kBAAAA;AAAA,IACrB,CAAC,IAAA,KAAkB;AACf,MAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,CAAC,QAAQ;AAAA,GACb;AAEA,EAAA,uBACIK,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mDAAA,EACX,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACX,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAAC,gBAAa,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,QACjB,4BACGA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kDAAkD,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,QAE9E,mCACGA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iDAAiD,QAAA,EAAA,eAAA,EAAgB;AAAA,OAAA,EAEzF,CAAA;AAAA,MACC,SAAA,oBACGE,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2DAAA,EACX,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAQ,IAAA,KAAS,MAAA,EAAQ,SAAS,MAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBACzEA,cAAAA,CAAC,UAAA,EAAA,EAAW,MAAA,EAAQ,IAAA,KAAS,MAAA,EAAQ,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAM,CAAA,EAAG,QAAA,EAAA,MAAA,EAAI;AAAA,OAAA,EAC7E,CAAA;AAAA,MAEH,IAAA,KAAS,MAAA,IAAU,WAAA,IAAe,KAAA,oBAC/BE,eAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACG,IAAA,EAAK,QAAA;AAAA,UACL,SAAS,MAAM;AACX,YAAA,IAAI;AAAE,cAAA,QAAA,CAAS,IAAA,CAAK,UAAU,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,YAAG,CAAA,CAAA,MAAQ;AAAA,YAAa;AAAA,UACrF,CAAA;AAAA,UACA,SAAA,EAAU,0GAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAF,cAAAA,CAACkB,oBAAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,YAAE;AAAA;AAAA;AAAA;AAExC,KAAA,EAER,CAAA;AAAA,IAEC,IAAA,KAAS,MAAA,IAAU,SAAA,mBAChBlB,cAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACG,MAAA;AAAA,QACA,KAAA,EAAO,MAAA;AAAA,QACP,QAAA,EAAU;AAAA;AAAA,KACd,mBAEAE,eAAAA,CAAAkD,mBAAA,EAAA,EACI,QAAA,EAAA;AAAA,sBAAApD,cAAAA;AAAA,QAAC2C,mBAAAA;AAAA,QAAA;AAAA,UACG,WAAA,EAAa,wBAAA;AAAA,UACb,KAAA;AAAA,UACA,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,UACxC,SAAA,EAAW1C,MAAAA;AAAA,YACP,6CAAA;AAAA,YACA,CAAC,WAAA,IAAe;AAAA,WACpB;AAAA,UACA,IAAA,EAAM;AAAA;AAAA,OACV;AAAA,MACC,CAAC,WAAA,oBAAeD,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gCAA+B,QAAA,EAAA,cAAA,EAAY;AAAA,KAAA,EAC7E;AAAA,GAAA,EAER,CAAA;AAER;AA5ESX,wBAAA,CAAA,WAAA,EAAA,aAAA,CAAA;AA8ET,SAAS,UAAA,CAAW;AAAA,EAChB,MAAA;AAAA,EAAQ,OAAA;AAAA,EAAS;AACrB,CAAA,EAIG;AACC,EAAA,uBACIW,cAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACG,IAAA,EAAK,QAAA;AAAA,MACL,OAAA;AAAA,MACA,SAAA,EAAWC,MAAAA;AAAA,QACP,2CAAA;AAAA,QACA,SACM,+BAAA,GACA;AAAA,OACV;AAAA,MAEC;AAAA;AAAA,GACL;AAER;AArBSZ,wBAAA,CAAA,UAAA,EAAA,YAAA,CAAA;AC3WT,IAAM,gBAAA,GAAmB;AAAA,EACrB,kBAAA,EAAoB,CAAA;AAAA,EACpB,uBAAA,EAAyB,EAAA;AAAA,EACzB,uBAAA,EAAyB,CAAA;AAAA,EACzB,eAAA,EAAiB,GAAA;AAAA,EACjB,eAAA,EAAiB,EAAA;AAAA,EACjB,kBAAA,EAAoB,IAAA;AAAA,EACpB,kBAAA,EAAoB,IAAA;AAAA,EACpB,iBAAA,EAAmB,KAAA;AAAA,EACnB,gBAAA,EAAkB,IAAA;AAAA,EAClB,SAAA,EAAW;AACf,CAAA;AAIO,SAAS,aAAA,GAAgB;AAC5B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIU,sCAAA,EAAqB;AACvC,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAS,gBAAA,EAAiB,GAAI,KAAA;AAKhD,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAIP,eAAQ,MAAM;AACxC,IAAA,MAAM,IAAI,QAAA,EAAU,IAAA;AACpB,IAAA,IAAI,KAAK,IAAA,EAAM,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,SAAS,EAAA,EAAG;AAEpD,IAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACvB,MAAA,IAAI;AACA,QAAA,OAAO,EAAE,QAAA,EAAU,IAAA,CAAK,MAAM,CAAC,CAAA,EAAG,SAAS,CAAA,EAAE;AAAA,MACjD,CAAA,CAAA,MAAQ;AACJ,QAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,CAAA,EAAE;AAAA,MACxC;AAAA,IACJ;AAEA,IAAA,OAAO,EAAE,UAAU,CAAA,EAAG,OAAA,EAAS,KAAK,SAAA,CAAU,CAAA,EAAG,IAAA,EAAM,CAAC,CAAA,EAAE;AAAA,EAC9D,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAGnB,EAAA,MAAM,MAAA,GAAa,UAAU,CAAA,EAAA,CAAI,OAAA,CAAQ,SAAS,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA,GAAQ,EAAA;AAC1E,EAAA,MAAM,WAAa,QAAA,EAAU,QAAA,IAAY,OAAO,CAAA,EAAG,QAAA,CAAS,QAAQ,CAAA,EAAA,CAAA,GAAO,EAAA;AAC3E,EAAA,MAAM,QAAA,GAAa,OAAA,CAAQ,QAAA,EAAU,KAAK,CAAA;AAC1C,EAAA,MAAM,SAAA,GAAa,UAAU,MAAA,IAAU,IAAA;AACvC,EAAA,MAAM,OAAA,GAAa,QAAQ,OAAO,CAAA;AAGlC,EAAA,IAAI,OAAA,EAAS;AACT,IAAA,uBACIU,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAACwD,mBAAA,EAAA,EAAQ,SAAA,EAAU,4CAAA,EAA6C,CAAA;AAAA,sBAChExD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAgC,QAAA,EAAA,eAAA,EAAQ;AAAA,KAAA,EAC5D,CAAA;AAAA,EAER;AAEA,EAAA,IAAI,CAAC,kBAAkB,uBAAOA,eAAC,UAAA,EAAA,EAAW,IAAA,EAAMsD,oBAAAA,EAAU,IAAA,EAAK,2BAAA,EAA4B,CAAA;AAC3F,EAAA,IAAI,CAAC,UAAkB,uBAAOtD,eAAC,UAAA,EAAA,EAAW,IAAA,EAAMmD,gBAAAA,EAAM,IAAA,EAAK,0CAAA,EAA2C,CAAA;AAGtG,EAAA,IAAI,QAAA,IAAY,CAAC,SAAA,EAAW;AACxB,IAAA,uBACInD,cAAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACG,IAAA,EAAMyD,mBAAA;AAAA,QACN,MAAM,QAAA,CAAS,KAAA;AAAA,QACf,SAAA,EAAU;AAAA;AAAA,KACd;AAAA,EAER;AAGA,EAAA,uBACIvD,eAAAA,CAAAkD,mBAAAA,EAAA,EAEI,QAAA,EAAA;AAAA,oBAAAlD,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iFAAA,EACX,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EACV,QAAA,EAAA;AAAA,QAAA,SAAA,oBAAaF,cAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,SAAS,MAAA,EAAS,CAAA;AAAA,QACpD,QAAA,CAAS,8BACNA,cAAAA,CAAC,UAAK,SAAA,EAAU,wCAAA,EAA0C,mBAAS,UAAA,EAAW,CAAA;AAAA,QAEjF,0BACGA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8DAA8D,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,QAExF,4BACGA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,8DAA8D,QAAA,EAAA,QAAA,EAAS;AAAA,OAAA,EAE/F,CAAA;AAAA,MACC,OAAA,oBACGA,cAAAA,CAACqC,qBAAAA,EAAA,EAAW,KAAA,EAAO,OAAA,EAAS,OAAA,EAAQ,OAAA,EAAQ,IAAA,EAAK,IAAA,EAAK,SAAA,EAAU,uDAAsD,QAAA,EAAA,MAAA,EAEtH;AAAA,KAAA,EAER,CAAA;AAAA,IAGC,QAAA,oBACGrC,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oFAAA,EACX,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0BAAA,EAA4B,QAAA,EAAA,QAAA,CAAS,OAAM,CAAA,EAC5D,CAAA;AAAA,oBAIJA,cAAAA,CAAC,UAAA,EAAA,EACI,QAAA,EAAA,QAAA,IAAY,IAAA,mBACTA,cAAAA,CAAC0D,kCAAA,EAAA,EAAS,KAAA,EAAM,eAAA,EAAgB,IAAA,EAAM,QAAA,EAAU,MAAA,EAAQ,gBAAA,EAAkB,CAAA,GAC1E,OAAA,mBACA1D,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4FAAA,EACV,QAAA,EAAA,OAAA,EACL,CAAA,mBAEAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDAAA,EAAkD,iCAAmB,CAAA,EAE5F;AAAA,GAAA,EACJ,CAAA;AAER;AAlGgBX,wBAAA,CAAA,aAAA,EAAA,eAAA,CAAA;ACAT,SAAS,UAAA,CAAW,EAAE,SAAA,EAAU,EAAoB;AACvD,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAIU,sCAAA,EAAqB;AAEpD,EAAA,MAAM,KAAK,KAAA,CAAM,gBAAA;AAIjB,EAAA,MAAM,OAAA,GAAUP,cAAAA;AAAA,IACZ,MAAO,EAAA,GAAK,IAAImE,6BAAW,EAAA,EAAI,KAAA,CAAM,UAAU,CAAA,GAAI,IAAA;AAAA,IACnD,CAAC,EAAA,EAAI,KAAA,CAAM,UAAU;AAAA,GACzB;AACA,EAAA,MAAM,eAAA,GAAkB,OAAA,EAAS,eAAA,EAAgB,IAAK,EAAC;AACvD,EAAA,MAAM,aAAA,GAAgB,OAAA,EAAS,oBAAA,EAAqB,IAAK,EAAC;AAE1D,EAAA,MAAM,cAAc,KAAA,CAAM,WAAA,GAAcZ,6BAAA,CAAY,KAAA,CAAM,WAAW,CAAA,GAAI,IAAA;AAEzE,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC5B,IAAA,QAAA,CAAS,IAAA;AAAA,MACL,CAAA,uBAAA,EAA0B,eAAA,CAAgB,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAA,EAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAClG;AAAA,EACJ,CAAA,MAAA,IAAW,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AACjC,IAAA,QAAA,CAAS,KAAK,CAAA,kCAAA,EAAqC,aAAA,CAAc,SAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,EAAA,EAAK,aAAA,CAAc,IAAI,CAAC,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA,CAAG,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9I;AACA,EAAA,IAAI,CAAC,WAAA,EAAa,QAAA,CAAS,IAAA,CAAK,gCAAgC,CAAA;AAEhE,EAAA,MAAM,WACF,KAAA,CAAM,OAAA,IACN,CAAC,KAAA,CAAM,UAAA,IACP,SAAS,MAAA,GAAS,CAAA;AAEtB,EAAA,MAAM,UAAU,QAAA,CAAS,MAAA,GAAS,IAAI,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,GAAI,MAAA;AAE5D,EAAA,uBACI7C,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAWD,MAAAA,CAAG,WAAA,EAAa,SAAS,CAAA,EACpC,QAAA,EAAA;AAAA,IAAA,QAAA,CAAS,SAAS,CAAA,oBACfC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2IAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC4D,uBAAA,EAAA,EAAY,SAAA,EAAU,4BAAA,EAA6B,CAAA;AAAA,sBACpD5D,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,cAAA,EAAgB,QAAA,EAAA,QAAA,CAAS,CAAC,CAAA,EAAE;AAAA,KAAA,EAChD,CAAA;AAAA,oBAEJA,cAAAA;AAAA,MAACiB,iBAAAA;AAAA,MAAA;AAAA,QACG,OAAA,EAAS,WAAA;AAAA,QACT,QAAA;AAAA,QACA,IAAA,EAAK,IAAA;AAAA,QACL,KAAA,EAAO,OAAA;AAAA,QACP,SAAA,EAAU,kBAAA;AAAA,QAET,QAAA,EAAA,KAAA,CAAM,OAAA,mBACHf,eAAAA,CAAAkD,qBAAA,EACI,QAAA,EAAA;AAAA,0BAAApD,cAAAA,CAACwD,mBAAAA,EAAA,EAAQ,SAAA,EAAU,0BAAA,EAA2B,CAAA;AAAA,UAAE;AAAA,SAAA,EAEpD,CAAA,mBAEAtD,eAAAA,CAAAkD,mBAAAA,EAAA,EACI,QAAA,EAAA;AAAA,0BAAApD,cAAAA,CAACmD,gBAAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc,CAAA;AAAA,UAAE;AAAA,SAAA,EAEpC;AAAA;AAAA;AAER,GAAA,EACJ,CAAA;AAER;AA9DgB9D,wBAAA,CAAA,UAAA,EAAA,YAAA,CAAA;ACIhB,IAAM,YAAA,GAAe,2BAAA;AACrB,IAAM,UAAA,GAAa,4BAAA;AAgBZ,SAAS,iBAAA,CAAkB,EAAE,IAAA,EAAM,OAAA,EAAQ,EAA2B;AACzE,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIU,sCAAA,EAAqB;AACvC,EAAA,MAAM,KAAK,KAAA,CAAM,gBAAA;AACjB,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,QAAA,KAAa,IAAA,IAAQ,KAAA,CAAM,OAAA;AACtD,EAAA,MAAM,KAAA,GAAQ,eAAe,UAAA,GAAa,YAAA;AAE1C,EAAA,uBACIC,eAAC6D,oBAAA,EAAA,EAAU,IAAA,EAAY,cAAc,CAAC,CAAA,KAAM,CAAC,CAAA,IAAK,OAAA,IAAW,IAAA,EAAK,OAAA,EAC9D,0BAAA3D,eAAAA,CAAC2D,oBAAA,CAAU,SAAV,EAAkB,KAAA,EAAc,WAAU,cAAA,EACvC,QAAA,EAAA;AAAA,oBAAA3D,eAAAA,CAAC2D,oBAAA,CAAU,MAAA,EAAV,EACG,QAAA,EAAA;AAAA,sBAAA7D,cAAAA,CAAC6D,oBAAA,CAAU,KAAA,EAAV,EAAgB,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,MAC1B,EAAA,oBACG3D,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wCAAA,EACX,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAAC,WAAA,EAAA,EAAY,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAA;AAAA,wBAChCA,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wDACX,QAAA,EAAAK,8BAAA,CAAa,EAAA,CAAG,IAAI,CAAA,EACzB;AAAA,OAAA,EACJ,CAAA;AAAA,sBAEJL,cAAAA,CAAC6D,oBAAA,CAAU,KAAA,EAAV,EAAgB,WAAU,SAAA,EAAU;AAAA,KAAA,EACzC,CAAA;AAAA,oBAKA3D,eAAAA;AAAA,MAAC2D,oBAAA,CAAU,IAAA;AAAA,MAAV;AAAA,QACG,SAAA,EAAW5D,MAAAA;AAAA,UACP,+EAAA;AAAA,UACA,eACM,yCAAA,GACA;AAAA,SACV;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAAC,KAAA,EAAA,EACG,QAAA,kBAAAA,cAAAA,CAAC,gBAAa,CAAA,EAClB,CAAA;AAAA,UACC,gCACGA,cAAAA,CAAC,SACG,QAAA,kBAAAA,cAAAA,CAAC,iBAAc,CAAA,EACnB;AAAA;AAAA;AAAA,KAER;AAAA,IAEC,EAAA,oBACGA,cAAAA,CAAC6D,oBAAA,CAAU,MAAA,EAAV,EAAiB,SAAA,EAAU,WAAA,EACxB,QAAA,kBAAA7D,cAAAA,CAAC,UAAA,EAAA,EAAW,CAAA,EAChB;AAAA,GAAA,EAER,CAAA,EACJ,CAAA;AAER;AAnDgBX,wBAAA,CAAA,iBAAA,EAAA,mBAAA,CAAA;ACrBT,SAAS,UAAA,CAAW,EAAE,IAAA,EAAM,YAAA,EAAa,EAAoB;AAChE,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIU,sCAAA,EAAqB;AACvC,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,QAAA,KAAa,IAAA,IAAQ,KAAA,CAAM,OAAA;AAEtD,EAAA,uBACIC,eAAC8D,0BAAA,EAAA,EAAgB,IAAA,EAAY,cACzB,QAAA,kBAAA5D,eAAAA,CAAC6D,iCAAA,EAAA,EAAuB,SAAA,EAAU,sCAAA,EAC9B,QAAA,EAAA;AAAA,oBAAA/D,cAAAA,CAACgE,gCAAA,EAAA,EAAsB,SAAA,EAAU,6BAAA,EAC7B,QAAA,kBAAAhE,eAACiE,+BAAA,EAAA,EAAqB,SAAA,EAAU,SAAA,EAAU,QAAA,EAAA,YAAA,EAAU,CAAA,EACxD,CAAA;AAAA,oBACA/D,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC,SAAI,SAAA,EAAW,YAAA,GAAe,iCAAiC,8BAAA,EAC5D,QAAA,kBAAAA,cAAAA,CAAC,YAAA,EAAA,EAAa,CAAA,EAClB,CAAA;AAAA,MACC,YAAA,oBACGA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACX,QAAA,kBAAAA,cAAAA,CAAC,aAAA,EAAA,EAAc,CAAA,EACnB;AAAA,KAAA,EAER,CAAA;AAAA,IACC,KAAA,CAAM,gBAAA,oBACHA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,+DAAA,EACX,QAAA,kBAAAA,cAAAA,CAAC,UAAA,EAAA,EAAW,CAAA,EAChB;AAAA,GAAA,EAER,CAAA,EACJ,CAAA;AAER;AA5BgBX,wBAAA,CAAA,UAAA,EAAA,YAAA,CAAA;ACPT,IAAM,6BAAuBA,wBAAA,CAAA,MAAM;AACtC,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,mBAAA,KAAwBU,sCAAA,EAAqB;AAKpE,EAAA,MAAM,SAAA,GAAYmE,oBAAc,qBAAqB,CAAA;AACrD,EAAA,MAAM,WAAW,CAAC,SAAA;AAElB,EAAA,MAAM,QAAA,GAAW,OAAO,cAAA,IAAkB,UAAA;AAC1C,EAAA,MAAM,aAAa,QAAA,KAAa,UAAA;AAChC,EAAA,MAAM,cAAA,GACF,OAAO,MAAA,CAAO,OAAA,KAAY,SAAA,GAAY,OAAO,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA;AAE1F,EAAA,MAAM;AAAA,IACF,SAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,eAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,MACA,gBAAA,CAAiB;AAAA,IACjB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,iBAAiB,MAAA,CAAO,eAAA;AAAA,IACxB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB;AAAA,GACH,CAAA;AAED,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI3E,gBAAwB,IAAI,CAAA;AACpE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,gBAAwB,IAAI,CAAA;AACxE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAChD,EAAA,MAAM,OAAA,GAAUO,cAA8B,IAAI,CAAA;AAKlD,EAAA,MAAM,SAAA,GAAY,CAAC,QAAA,IAAY,KAAA,CAAM,gBAAA,KAAqB,IAAA;AAK1D,EAAA,MAAM,iBAAA,GAAoBN,eAAuC,MAAM;AACnE,IAAA,IAAI,QAAA,KAAa,UAAA,EAAY,OAAO,EAAC;AACrC,IAAA,MAAM,OAAO2E,cAAA,CAAM,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,EAAE,CAAA;AAClD,IAAA,MAAM,MAAqC,EAAC;AAC5C,IAAA,KAAA,MAAW,GAAA,IAAO,OAAA,EAAS,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG,SAAA,IAAa,EAAC;AACrE,IAAA,OAAO,GAAA;AAAA,EACX,CAAA,EAAG,CAAC,QAAA,EAAU,WAAA,EAAa,OAAO,CAAC,CAAA;AAEnC,EAAA,MAAM,SAAA,GAAYtE,kBAAAA;AAAA,IACd,CAAC,EAAA,KAAoB;AACjB,MAAA,mBAAA,CAAoB,EAAE,CAAA;AACtB,MAAA,IAAI,QAAA,eAAuB,IAAI,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,CAAC,UAAU,mBAAmB;AAAA,GAClC;AAEA,EAAA,MAAM,gBAAA,GAAmBA,mBAAY,MAAM;AACvC,IAAA,mBAAA,CAAoB,IAAI,CAAA;AAAA,EAC5B,CAAA,EAAG,CAAC,mBAAmB,CAAC,CAAA;AAExB,EAAA,MAAM,cAAA,GAAiBA,kBAAAA;AAAA,IACnB,CAAC,QAAgB,QAAA,KAA6B;AAI1C,MAAA,IAAI,QAAA,IAAY,QAAA,KAAa,aAAA,EAAe,EAAA,IAAM,aAAa,UAAA,EAAY;AACvE,QAAA,gBAAA,CAAiB,QAAQ,CAAA;AACzB,QAAA,qBAAA,CAAsB,MAAM;AACxB,UAAA,OAAA,CAAQ,OAAA,EAAS,eAAe,MAAM,CAAA;AAAA,QAC1C,CAAC,CAAA;AACD,QAAA;AAAA,MACJ;AACA,MAAA,OAAA,CAAQ,OAAA,EAAS,eAAe,MAAM,CAAA;AAAA,IAC1C,CAAA;AAAA,IACA,CAAC,aAAA,EAAe,EAAA,EAAI,QAAA,EAAU,gBAAgB;AAAA,GAClD;AAEA,EAAA,MAAM,kBAAA,GAAqBA,kBAAAA,CAAY,CAAC,MAAA,EAAuB,QAAA,KAA4B;AACvF,IAAA,eAAA,CAAgB,MAAM,CAAA;AACtB,IAAA,iBAAA,CAAkB,QAAQ,CAAA;AAAA,EAC9B,CAAA,EAAG,EAAE,CAAA;AAML,EAAA,MAAM,iBAAA,GAAoB,QAAA,KAAa,UAAA,GAAa,cAAA,GAAiB,eAAe,EAAA,IAAM,IAAA;AAE1F,EAAA,MAAM,gBAAA,GAAmBA,kBAAAA;AAAA,IACrB,CAAC,MAAA,KAAuB;AACpB,MAAA,IAAI,CAAC,MAAA,CAAO,QAAA,IAAY,CAAC,OAAO,MAAA,EAAQ;AAKxC,MAAA,MAAM,UAAU,MAAA,CAAO,QAAA,GACjB,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,MAAA,CAAO,YAAY,eAAA,CAAgB,CAAA,CAAE,EAAE,CAAA,KAAM,MAAA,CAAO,QAAQ,CAAA,GACzF,IAAA;AAEN,MAAA,MAAM,oBACF,OAAA,IAAW,QAAA,KAAa,UAAA,IAAc,OAAA,CAAQ,OAAO,aAAA,EAAe,EAAA;AAExE,MAAA,IAAI,iBAAA,EAAmB;AACnB,QAAA,gBAAA,CAAiB,QAAQ,EAAE,CAAA;AAAA,MAC/B;AAEA,MAAA,IAAI,OAAO,MAAA,EAAQ;AACf,QAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,QAAA,IAAI,iBAAA,EAAmB;AACnB,UAAA,qBAAA,CAAsB,MAAM;AACxB,YAAA,OAAA,CAAQ,OAAA,EAAS,eAAe,MAAM,CAAA;AAAA,UAC1C,CAAC,CAAA;AAAA,QACL,CAAA,MAAO;AACH,UAAA,OAAA,CAAQ,OAAA,EAAS,eAAe,MAAM,CAAA;AAAA,QAC1C;AAAA,MACJ;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,QAAA,EAAU,aAAA,EAAe,IAAI,gBAAgB;AAAA,GAC3D;AAEA,EAAA,cAAA,CAAe;AAAA,IACX,OAAA,EAAS,cAAA;AAAA,IACT,eAAA,EAAiB,iBAAA;AAAA,IACjB,YAAA;AAAA,IACA,YAAA,EAAc;AAAA,GACjB,CAAA;AAID,EAAA,IAAI,OAAA,EAAS;AACT,IAAA,uBACIK,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACG,SAAA,EAAU,iFAAA;AAAA,UACV,KAAA,EAAO,EAAE,MAAA,EAAQ,2CAAA,EAA4C;AAAA,UAE5D,gBAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,sBAChCA,cAAAA,CAACoE,uBAAiB,SAAA,EAAU,oBAAA,EAAA,EAAb,CAAkC,CACpD;AAAA;AAAA,OACL;AAAA,sBACAlE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACX,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAACoE,mBAAA,EAAA,EAAS,SAAA,EAAU,WAAA,EAAY,CAAA;AAAA,wBAChCpE,cAAAA,CAACoE,mBAAA,EAAA,EAAS,SAAA,EAAU,YAAA,EAAa,CAAA;AAAA,wBACjCpE,cAAAA,CAACoE,mBAAA,EAAA,EAAS,SAAA,EAAU,WAAA,EAAY,CAAA;AAAA,wBAChCpE,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACV,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAC/BE,eAAAA,CAAC,KAAA,EAAA,EAAY,WAAU,WAAA,EACnB,QAAA,EAAA;AAAA,0BAAAF,cAAAA,CAACoE,mBAAA,EAAA,EAAS,SAAA,EAAU,WAAA,EAAY,CAAA;AAAA,0BAChCpE,cAAAA,CAACoE,mBAAA,EAAA,EAAS,SAAA,EAAU,aAAA,EAAc;AAAA,SAAA,EAAA,EAF5B,CAGV,CACH,CAAA,EACL;AAAA,OAAA,EACJ;AAAA,KAAA,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,IAAI,KAAA,EAAO;AACP,IAAA,uBACIpE,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAU,sCAAA;AAAA,QACV,KAAA,EAAO,EAAE,MAAA,EAAQ,2CAAA,EAA4C;AAAA,QAE7D,QAAA,kBAAAE,eAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0BAAA,EAA2B,QAAA,EAAA;AAAA,UAAA,yBAAA;AAAA,UAAwB;AAAA,SAAA,EAAM;AAAA;AAAA,KAC1E;AAAA,EAER;AAIA,EAAA,IAAI,QAAA,EAAU;AACV,IAAA,uBACIA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC,iBAAA,EAAA,EAAkB,QAAA,EAAU,aAAA,EAAe,MAAM,IAAA,EAAM,CAAA;AAAA,MACvD,QAAA,KAAa,6BACVA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACG,GAAA,EAAK,OAAA;AAAA,UACL,QAAA,EAAS,UAAA;AAAA,UACT,WAAA;AAAA,UACA,iBAAiB,KAAA,CAAM,eAAA;AAAA,UACvB,gBAAgB,KAAA,CAAM,gBAAA;AAAA,UACtB,aAAA,EAAe,SAAA;AAAA,UACf,cAAA,EAAgB;AAAA;AAAA,0BAGpBA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACG,GAAA,EAAK,OAAA;AAAA,UACL,IAAA,EAAM,UAAA;AAAA,UACN,SAAA;AAAA,UACA,eAAA;AAAA,UACA,SAAA;AAAA,UACA,iBAAiB,KAAA,CAAM,eAAA;AAAA,UACvB,gBAAgB,KAAA,CAAM,gBAAA;AAAA,UACtB,aAAA,EAAe,SAAA;AAAA,UACf,cAAA,EAAgB;AAAA;AAAA,OACpB;AAAA,sBAEJA,cAAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAM,SAAA,EAAW,cAAc,YAAA,EAAc;AAAA,KAAA,EAC7D,CAAA;AAAA,EAER;AAIA,EAAA,uBACIA,eAACqE,0BAAA,EAAA,EAAgB,aAAA,EAAe,KAC5B,QAAA,kBAAAnE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kDAAA,EACX,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,iBAAA,EAAA,EAAkB,QAAA,EAAU,aAAA,EAAe,MAAM,IAAA,EAAM,CAAA;AAAA,oBACxDA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACG,SAAA,EAAU,wCAAA;AAAA,QACV,KAAA,EAAO,EAAE,MAAA,EAAQ,2CAAA,EAA4C;AAAA,QAE7D,QAAA,kBAAAA,cAAAA;AAAA,UAAC,WAAA;AAAA,UAAA;AAAA,YACG,IAAA,EAAM,UAAA;AAAA,YACN,SAAA;AAAA,YACA,OAAA;AAAA,YACA,eAAA,EAAiB,eAAe,EAAA,IAAM,IAAA;AAAA,YACtC,cAAA,EAAgB,gBAAA;AAAA,YAChB,gBAAA,EAAkB,YAAA;AAAA,YAClB,iBAAiB,KAAA,CAAM,eAAA;AAAA,YACvB,UAAA,EAAY,cAAA;AAAA,YACZ,QAAA;AAAA,YACA,iBAAA;AAAA,YACA,SAAA;AAAA,YACA;AAAA;AAAA;AACJ;AAAA,KACJ;AAAA,IACC,QAAA,KAAa,6BACVA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,GAAA,EAAK,OAAA;AAAA,QACL,QAAA,EAAS,UAAA;AAAA,QACT,WAAA;AAAA,QACA,iBAAiB,KAAA,CAAM,eAAA;AAAA,QACvB,gBAAgB,KAAA,CAAM,gBAAA;AAAA,QACtB,aAAA,EAAe,SAAA;AAAA,QACf,cAAA,EAAgB;AAAA;AAAA,wBAGpBA,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACG,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAM,UAAA;AAAA,QACN,SAAA;AAAA,QACA,eAAA;AAAA,QACA,SAAA;AAAA,QACA,iBAAiB,KAAA,CAAM,eAAA;AAAA,QACvB,gBAAgB,KAAA,CAAM,gBAAA;AAAA,QACtB,aAAA,EAAe,SAAA;AAAA,QACf,cAAA,EAAgB;AAAA;AAAA,KACpB;AAAA,oBAIJA,cAAAA,CAAC,iBAAA,EAAA,EAAkB,IAAA,EAAM,SAAA,EAAW,SAAS,gBAAA,EAAkB;AAAA,GAAA,EACnE,CAAA,EACJ,CAAA;AAER,CAAA,EAtQoC,YAAA","file":"DocsLayout-YDR7DSMM.cjs","sourcesContent":["'use client';\n\nimport consola from 'consola';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { ApiEndpoint, LoadedSchemaEntry, OpenApiInfo, OpenApiSchema, SchemaSource, UseOpenApiSchemaReturn } from '../types';\nimport { dereferenceSchema } from '../utils/schemaExport';\nimport { joinUrl, resolveBaseUrl } from '../utils/url';\n\n// ─── JSON Schema → example value ──────────────────────────────────────────────\n\ntype JsonSchemaNode = Record<string, unknown> & {\n type?: string;\n properties?: Record<string, JsonSchemaNode>;\n required?: string[];\n items?: JsonSchemaNode;\n enum?: unknown[];\n example?: unknown;\n default?: unknown;\n format?: string;\n};\n\n/** Walk a JSON Schema and build a realistic-looking example value. */\nfunction exampleFromSchema(schema: JsonSchemaNode | undefined, depth = 0): unknown {\n if (!schema || depth > 8) return null;\n\n // Respect schema-provided examples first — no need to invent a value\n // when the spec author already did the work.\n if (schema.example !== undefined) return schema.example;\n if (schema.default !== undefined) return schema.default;\n if (Array.isArray(schema.enum) && schema.enum.length > 0) return schema.enum[0];\n\n switch (schema.type) {\n case 'object': {\n const out: Record<string, unknown> = {};\n const props = schema.properties ?? {};\n for (const [k, v] of Object.entries(props)) {\n out[k] = exampleFromSchema(v, depth + 1);\n }\n return out;\n }\n case 'array':\n return [exampleFromSchema(schema.items, depth + 1)];\n case 'integer':\n case 'number':\n return 0;\n case 'boolean':\n return false;\n case 'string':\n if (schema.format === 'date-time') return new Date().toISOString();\n if (schema.format === 'date') return new Date().toISOString().slice(0, 10);\n if (schema.format === 'email') return 'user@example.com';\n if (schema.format === 'uri' || schema.format === 'url') return 'https://example.com';\n if (schema.format === 'uuid') return '00000000-0000-0000-0000-000000000000';\n return '';\n default:\n // No type (or composed schema like allOf/oneOf we don't unpack) —\n // fall back to an empty object rather than ``null`` so the resulting\n // JSON is still valid-looking.\n if (schema.properties) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(schema.properties)) {\n out[k] = exampleFromSchema(v, depth + 1);\n }\n return out;\n }\n return null;\n }\n}\n\n// HTTP methods to extract from OpenAPI schema\nconst HTTP_METHODS = ['get', 'post', 'put', 'patch', 'delete'] as const;\n\n// Extract endpoints from OpenAPI schema (all methods). ``baseUrl`` is\n// resolved by the caller via ``resolveBaseUrl`` — we just paste it onto\n// the front of each path here. ``schemaId`` is tagged onto every\n// endpoint so downstream consumers (sections-mode sidebar, anchors, URL\n// sync) can correlate endpoints back to their source schema.\nconst extractEndpoints = (schema: OpenApiSchema, baseUrl: string, schemaId?: string): ApiEndpoint[] => {\n const endpoints: ApiEndpoint[] = [];\n\n if (!schema.paths) return [];\n\n for (const [path, methods] of Object.entries(schema.paths)) {\n for (const method of HTTP_METHODS) {\n const op = (methods as any)[method];\n if (!op) continue;\n\n const methodUpper = method.toUpperCase();\n const summary = (op.summary || '').trim();\n const description = op.description || summary || `${methodUpper} ${path}`;\n const category = op.tags?.[0] || 'Other';\n\n const parameters: Array<{\n name: string;\n type: string;\n required: boolean;\n description?: string;\n }> = [];\n\n // Collect parameters (path-level + operation-level)\n const allParams = [...((methods as any).parameters || []), ...(op.parameters || [])];\n for (const param of allParams) {\n parameters.push({\n name: param.name,\n type: param.schema?.type || 'string',\n required: param.required || false,\n description: param.description,\n });\n }\n\n // Collect responses\n const responses: Array<{\n code: string;\n description: string;\n }> = [];\n\n if (op.responses) {\n for (const [code, response] of Object.entries(op.responses)) {\n responses.push({\n code,\n description: (response as any).description || `Response ${code}`,\n });\n }\n }\n\n // Extract request body info — keep the dereferenced schema so\n // downstream UI can render a fields table and generate a starter\n // example instead of showing an opaque ``object`` / ``array`` tag.\n let requestBody: ApiEndpoint['requestBody'];\n if (op.requestBody) {\n const content = op.requestBody.content;\n const mediaType = content?.['application/json'] || content?.[Object.keys(content || {})[0]];\n const rawSchema = mediaType?.schema as JsonSchemaNode | undefined;\n requestBody = {\n type: rawSchema?.type || 'object',\n description: op.requestBody.description,\n schema: rawSchema,\n example: rawSchema\n ? JSON.stringify(exampleFromSchema(rawSchema), null, 2)\n : undefined,\n };\n }\n\n const endpoint: ApiEndpoint = {\n name: path.split('/').pop() || path,\n method: methodUpper,\n path: baseUrl ? joinUrl(baseUrl, path) : path,\n summary,\n description,\n category,\n parameters: parameters.length > 0 ? parameters : undefined,\n requestBody,\n responses: responses.length > 0 ? responses : undefined,\n schemaId,\n };\n\n endpoints.push(endpoint);\n }\n }\n\n return endpoints;\n};\n\n// Get unique categories from endpoints\nconst getCategories = (endpoints: ApiEndpoint[]): string[] => {\n const categories = new Set<string>();\n endpoints.forEach((endpoint) => categories.add(endpoint.category));\n return Array.from(categories).sort();\n};\n\n// Fetch schema from URL\nconst fetchSchema = async (url: string): Promise<OpenApiSchema> => {\n const response = await fetch(url, {\n headers: {\n 'Accept': 'application/json',\n },\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch schema: ${response.statusText}`);\n }\n return response.json();\n};\n\ninterface UseOpenApiSchemaProps {\n schemas: SchemaSource[];\n defaultSchemaId?: string;\n /** Global base URL override from ``PlaygroundConfig.baseUrl``.\n * Per-schema ``SchemaSource.baseUrl`` takes precedence over this. */\n baseUrl?: string;\n /** When ``true`` the hook fetches every schema in ``schemas`` (not just\n * the active one) and exposes them via ``schemasData``. Used by the\n * ``sections`` grouping mode — the docs column concatenates endpoints\n * from every schema, so they all need to be on the client. Default\n * is ``false`` to preserve the original lazy behaviour. */\n preloadAll?: boolean;\n}\n\ninterface SchemaLoadState {\n loading: boolean;\n error: string | null;\n}\n\nexport default function useOpenApiSchema({\n schemas,\n defaultSchemaId,\n baseUrl: configBaseUrl,\n preloadAll = false,\n}: UseOpenApiSchemaProps): UseOpenApiSchemaReturn {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [currentSchemaId, setCurrentSchemaId] = useState<string>(\n defaultSchemaId || schemas[0]?.id\n );\n const [loadedSchemas, setLoadedSchemas] = useState<Map<string, OpenApiSchema>>(\n new Map()\n );\n // Per-schema loading/error state for ``preloadAll`` — each schema may\n // succeed or fail independently, and the UI wants to render partial\n // results while slow/broken ones are still resolving.\n const [loadStates, setLoadStates] = useState<Map<string, SchemaLoadState>>(new Map());\n\n const currentSchema = useMemo(\n () => schemas.find((s) => s.id === currentSchemaId) || null,\n [schemas, currentSchemaId]\n );\n\n const currentOpenApiSchema = useMemo(\n () => (currentSchemaId ? loadedSchemas.get(currentSchemaId) : null),\n [loadedSchemas, currentSchemaId]\n );\n\n // Dereference once per schema load so endpoint extraction sees fully\n // resolved ``$ref`` graphs. The raw schema is still exposed via\n // ``rawSchema`` for Copy-for-AI (juniors may want to hand the raw\n // document to an LLM and have it resolve refs itself).\n const dereferencedSchema = useMemo(\n () => (currentOpenApiSchema ? dereferenceSchema(currentOpenApiSchema) : null),\n [currentOpenApiSchema],\n );\n\n // Resolve base URL with priority chain. Centralised in ``resolveBaseUrl``\n // so the same logic is reused by the schema-export utilities.\n const resolvedBaseUrl = useMemo(\n () =>\n resolveBaseUrl({\n schemaSource: currentSchema?.baseUrl,\n config: configBaseUrl,\n fromServers: currentOpenApiSchema?.servers?.[0]?.url,\n }),\n [currentSchema?.baseUrl, configBaseUrl, currentOpenApiSchema],\n );\n\n const endpoints = useMemo(\n () =>\n dereferencedSchema\n ? extractEndpoints(dereferencedSchema, resolvedBaseUrl, currentSchemaId)\n : [],\n [dereferencedSchema, resolvedBaseUrl, currentSchemaId]\n );\n\n const categories = useMemo(() => getCategories(endpoints), [endpoints]);\n\n const schemaInfo = useMemo<OpenApiInfo | null>(() => {\n if (!currentOpenApiSchema?.info) return null;\n const { title, version, description } = currentOpenApiSchema.info;\n return {\n title,\n version,\n description,\n servers: currentOpenApiSchema.servers,\n };\n }, [currentOpenApiSchema]);\n\n // Load schema when current schema changes (single-schema mode)\n useEffect(() => {\n if (preloadAll) return;\n if (!currentSchema) return;\n\n // Skip if already loaded\n if (loadedSchemas.has(currentSchema.id)) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n fetchSchema(currentSchema.url)\n .then((schema) => {\n setLoadedSchemas((prev) => new Map(prev).set(currentSchema.id, schema));\n consola.success(`Schema loaded: ${currentSchema.name}`);\n setLoading(false);\n })\n .catch((err) => {\n consola.error(`Error loading schema from ${currentSchema.url}:`, err);\n setError(err instanceof Error ? err.message : 'Failed to load schema');\n setLoading(false);\n });\n }, [currentSchema, loadedSchemas, preloadAll]);\n\n // Preload every schema (sections-grouping mode). Each schema is fetched\n // independently — a slow or broken source doesn't block the rest.\n useEffect(() => {\n if (!preloadAll) return;\n if (schemas.length === 0) {\n setLoading(false);\n return;\n }\n\n let cancelled = false;\n const pending = schemas.filter((s) => !loadedSchemas.has(s.id));\n if (pending.length === 0) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setLoadStates((prev) => {\n const next = new Map(prev);\n for (const s of pending) next.set(s.id, { loading: true, error: null });\n return next;\n });\n\n Promise.allSettled(\n pending.map((s) =>\n fetchSchema(s.url).then((schema) => ({ id: s.id, name: s.name, schema })),\n ),\n ).then((results) => {\n if (cancelled) return;\n\n setLoadedSchemas((prev) => {\n const next = new Map(prev);\n for (const r of results) {\n if (r.status === 'fulfilled') {\n next.set(r.value.id, r.value.schema);\n consola.success(`Schema loaded: ${r.value.name}`);\n }\n }\n return next;\n });\n\n setLoadStates((prev) => {\n const next = new Map(prev);\n results.forEach((r, i) => {\n const src = pending[i]!;\n if (r.status === 'fulfilled') {\n next.set(src.id, { loading: false, error: null });\n } else {\n const msg = r.reason instanceof Error ? r.reason.message : 'Failed to load schema';\n consola.error(`Error loading schema from ${src.url}:`, r.reason);\n next.set(src.id, { loading: false, error: msg });\n }\n });\n return next;\n });\n\n setLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [preloadAll, schemas, loadedSchemas]);\n\n const schemasData = useMemo<LoadedSchemaEntry[]>(() => {\n if (!preloadAll) return [];\n return schemas.map((src) => {\n const raw = loadedSchemas.get(src.id) ?? null;\n const deref = raw ? dereferenceSchema(raw) : null;\n const resolved = resolveBaseUrl({\n schemaSource: src.baseUrl,\n config: configBaseUrl,\n fromServers: raw?.servers?.[0]?.url,\n });\n const info: OpenApiInfo | null = raw?.info\n ? {\n title: raw.info.title,\n version: raw.info.version,\n description: raw.info.description,\n servers: raw.servers,\n }\n : null;\n const eps = deref ? extractEndpoints(deref, resolved, src.id) : [];\n const state = loadStates.get(src.id) ?? { loading: !raw, error: null };\n return {\n source: src,\n info,\n rawSchema: raw,\n endpoints: eps,\n resolvedBaseUrl: resolved || undefined,\n loading: state.loading,\n error: state.error,\n };\n });\n }, [preloadAll, schemas, loadedSchemas, loadStates, configBaseUrl]);\n\n const setCurrentSchema = useCallback((schemaId: string) => {\n setCurrentSchemaId(schemaId);\n }, []);\n\n const refresh = useCallback(() => {\n if (!currentSchema) return;\n\n setLoading(true);\n setError(null);\n\n // Remove from cache to force reload\n setLoadedSchemas((prev) => {\n const next = new Map(prev);\n next.delete(currentSchema.id);\n return next;\n });\n\n fetchSchema(currentSchema.url)\n .then((schema) => {\n setLoadedSchemas((prev) => new Map(prev).set(currentSchema.id, schema));\n consola.success(`Schema refreshed: ${currentSchema.name}`);\n setLoading(false);\n })\n .catch((err) => {\n consola.error(`Error refreshing schema from ${currentSchema.url}:`, err);\n setError(err instanceof Error ? err.message : 'Failed to refresh schema');\n setLoading(false);\n });\n }, [currentSchema]);\n\n return {\n loading,\n error,\n endpoints,\n categories,\n schemas,\n currentSchema,\n schemaInfo,\n rawSchema: currentOpenApiSchema ?? null,\n // Consumers expect ``undefined`` when no base URL was resolved (for\n // conditional ``{ baseUrl?: … }`` plumbing). Turn the empty-string\n // convention from the resolver into undefined at the API boundary.\n resolvedBaseUrl: resolvedBaseUrl || undefined,\n setCurrentSchema,\n refresh,\n schemasData,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef } from 'react';\n\n/** Hash format: ``#<schemaId>/<anchor>``.\n * - ``#catalog/ep-get-users`` — specific endpoint in ``catalog`` schema\n * - ``#catalog`` — open ``catalog`` schema at its top\n * - empty — no initial target, leave viewer at its default\n *\n * We intentionally keep this opinionated and stringly-typed: the host app\n * already controls which schemas exist, so there is no room for ambiguity\n * beyond the two segments. */\nexport interface ParsedHash {\n schemaId: string | null;\n anchor: string | null;\n}\n\nexport function parseDocsHash(hash: string): ParsedHash {\n const raw = hash.startsWith('#') ? hash.slice(1) : hash;\n if (!raw) return { schemaId: null, anchor: null };\n const [schemaId = null, ...rest] = raw.split('/');\n const anchor = rest.length > 0 ? rest.join('/') : null;\n return {\n schemaId: schemaId || null,\n anchor: anchor || null,\n };\n}\n\nexport function buildDocsHash(schemaId: string | null, anchor: string | null): string {\n if (!schemaId && !anchor) return '';\n if (schemaId && anchor) return `#${schemaId}/${anchor}`;\n if (schemaId) return `#${schemaId}`;\n return anchor ? `#${anchor}` : '';\n}\n\ninterface UseDocsUrlSyncProps {\n enabled: boolean;\n currentSchemaId: string | null;\n activeAnchor: string | null;\n /** Called on mount / ``popstate`` / ``hashchange`` with the hash state.\n * The consumer is responsible for dispatching into its own handlers\n * (switching schema, scrolling to endpoint) in the right order. */\n onHashTarget: (target: ParsedHash) => void;\n}\n\n/** Two-way sync between browser hash and docs viewer state.\n *\n * - Writes use ``history.replaceState`` so scrollspy-driven updates don't\n * pollute the back/forward stack. User-initiated navigation (click on\n * sidebar row, schema switch) still lands in history because the click\n * itself already did ``pushState`` — or will, via plain anchor hrefs.\n * - Reads happen on mount (initial target) and on ``popstate`` /\n * ``hashchange`` (Back/Forward / external anchor clicks).\n * - When ``enabled`` is false, the hook is a no-op — the viewer stays\n * hash-free so you can embed it inside a larger page. */\nexport function useDocsUrlSync({\n enabled,\n currentSchemaId,\n activeAnchor,\n onHashTarget,\n}: UseDocsUrlSyncProps) {\n // Ignore the very first write — otherwise on mount we'd clobber the\n // incoming hash with the viewer's empty defaults before ``onHashTarget``\n // has a chance to apply it.\n const primedRef = useRef(false);\n const onHashTargetRef = useRef(onHashTarget);\n useEffect(() => {\n onHashTargetRef.current = onHashTarget;\n }, [onHashTarget]);\n\n // Read: mount + hashchange/popstate\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') return;\n\n const apply = () => {\n onHashTargetRef.current(parseDocsHash(window.location.hash));\n };\n apply();\n primedRef.current = true;\n\n window.addEventListener('hashchange', apply);\n window.addEventListener('popstate', apply);\n return () => {\n window.removeEventListener('hashchange', apply);\n window.removeEventListener('popstate', apply);\n };\n }, [enabled]);\n\n // Write: whenever the viewer's state changes\n useEffect(() => {\n if (!enabled || typeof window === 'undefined') return;\n if (!primedRef.current) return;\n\n const next = buildDocsHash(currentSchemaId, activeAnchor);\n const current = window.location.hash;\n if (next === current) return;\n\n // replaceState keeps Back/Forward meaningful — a single scroll-through\n // the page shouldn't create 50 history entries.\n const url = next\n ? `${window.location.pathname}${window.location.search}${next}`\n : `${window.location.pathname}${window.location.search}`;\n window.history.replaceState(window.history.state, '', url);\n }, [enabled, currentSchemaId, activeAnchor]);\n\n const pushTarget = useCallback(\n (schemaId: string | null, anchor: string | null) => {\n if (!enabled || typeof window === 'undefined') return;\n const next = buildDocsHash(schemaId, anchor);\n const url = next\n ? `${window.location.pathname}${window.location.search}${next}`\n : `${window.location.pathname}${window.location.search}`;\n window.history.pushState(window.history.state, '', url);\n },\n [enabled],\n );\n\n return { pushTarget };\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { ApiEndpoint } from '../types';\n\n/**\n * Per-endpoint draft kept in localStorage so user input survives across\n * reloads and across switching back-and-forth between endpoints.\n *\n * Scoped by ``schemaId`` + ``method`` + ``path`` — two endpoints on the\n * same path with different methods don't share drafts. Two different\n * APIs don't collide either.\n *\n * Storage shape:\n * { parameters: { [name]: string }, requestBody: string }\n *\n * Implementation note: we deliberately DO NOT build on top of\n * ``useLocalStorage`` here. That hook's ``setValue`` callback reference\n * changes whenever its internal state changes, and when EndpointDraftSync\n * mirrors context → draft, the chain\n * state change ⇒ persist call ⇒ hook state change ⇒ new callback ⇒\n * effect rerun ⇒ persist call …\n * blew up into a maximum-update-depth loop. Writing straight to\n * ``localStorage`` with a stable ref-based writer breaks the cycle.\n */\nexport interface EndpointDraft {\n parameters: Record<string, string>;\n requestBody: string;\n}\n\nconst EMPTY_DRAFT: EndpointDraft = { parameters: {}, requestBody: '' };\n\nfunction storageKey(schemaId: string | null, ep: ApiEndpoint | null): string | null {\n if (!schemaId || !ep) return null;\n return `openapi-playground:draft:${schemaId}:${ep.method}:${ep.path}`;\n}\n\nfunction readDraft(key: string | null): EndpointDraft {\n if (!key || typeof window === 'undefined') return EMPTY_DRAFT;\n try {\n const raw = window.localStorage.getItem(key);\n if (!raw) return EMPTY_DRAFT;\n const parsed = JSON.parse(raw) as Partial<EndpointDraft>;\n return {\n parameters: parsed?.parameters ?? {},\n requestBody: typeof parsed?.requestBody === 'string' ? parsed.requestBody : '',\n };\n } catch {\n return EMPTY_DRAFT;\n }\n}\n\nfunction writeDraft(key: string | null, value: EndpointDraft): void {\n if (!key || typeof window === 'undefined') return;\n try {\n // Skip writes for empty drafts — reduces storage noise and keeps\n // \"never edited\" endpoints out of storage entirely.\n if (Object.keys(value.parameters).length === 0 && !value.requestBody) {\n window.localStorage.removeItem(key);\n return;\n }\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch {\n // Quota / private mode — silently drop; UI state still works.\n }\n}\n\nexport interface UseEndpointDraftResult {\n /** Draft snapshot loaded on mount / endpoint change. Does not update\n * as the user types — the caller owns the \"live\" state (context). */\n draft: EndpointDraft;\n /** Persist the current parameters. Safe to call on every change;\n * writes skip when the endpoint has no key yet. */\n setParameters: (params: Record<string, string>) => void;\n setRequestBody: (body: string) => void;\n /** Wipe the persisted draft for the current endpoint. */\n reset: () => void;\n}\n\nexport function useEndpointDraft(\n schemaId: string | null,\n endpoint: ApiEndpoint | null,\n): UseEndpointDraftResult {\n const key = storageKey(schemaId, endpoint);\n\n // ``draft`` is reloaded from storage only when the key changes —\n // not when we write. Writes don't need to come back to us because\n // the caller keeps the live state and re-reads on key change.\n const [draft, setDraftSnapshot] = useState<EndpointDraft>(() => readDraft(key));\n\n // Track the last loaded key so we reload exactly once per endpoint.\n const loadedKeyRef = useRef<string | null>(key);\n useEffect(() => {\n if (loadedKeyRef.current === key) return;\n loadedKeyRef.current = key;\n setDraftSnapshot(readDraft(key));\n }, [key]);\n\n // Keep a ref of the current key so the writers below stay stable\n // across renders — React callback identity was the root cause of\n // the infinite render loop we had before.\n const keyRef = useRef(key);\n useEffect(() => {\n keyRef.current = key;\n }, [key]);\n\n // Same for the latest full draft value — both writers need to merge\n // their field into the last known shape before writing.\n const latestRef = useRef<EndpointDraft>(draft);\n useEffect(() => {\n latestRef.current = draft;\n }, [draft]);\n\n const setParameters = useCallback((params: Record<string, string>) => {\n const next: EndpointDraft = {\n parameters: params,\n requestBody: latestRef.current.requestBody,\n };\n latestRef.current = next;\n writeDraft(keyRef.current, next);\n }, []);\n\n const setRequestBody = useCallback((body: string) => {\n const next: EndpointDraft = {\n parameters: latestRef.current.parameters,\n requestBody: body,\n };\n latestRef.current = next;\n writeDraft(keyRef.current, next);\n }, []);\n\n const reset = useCallback(() => {\n latestRef.current = EMPTY_DRAFT;\n if (keyRef.current && typeof window !== 'undefined') {\n try { window.localStorage.removeItem(keyRef.current); } catch { /* noop */ }\n }\n setDraftSnapshot(EMPTY_DRAFT);\n }, []);\n\n return { draft, setParameters, setRequestBody, reset };\n}\n","'use client';\n\nimport React, { useEffect, useRef } from 'react';\n\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { useEndpointDraft } from '../../hooks/useEndpointDraft';\n\ninterface EndpointDraftSyncProps {\n /** Active schema id (so drafts don't bleed between different APIs).\n * When null — drafts are disabled (hook returns empty draft, writes\n * are no-ops). Pass the current schema's ``id`` from useOpenApiSchema. */\n schemaId: string | null;\n}\n\n/**\n * Headless component: keeps ``RequestPanel`` state mirrored with a\n * per-endpoint draft in localStorage.\n *\n * Flow:\n * 1. On endpoint change ⇒ read draft ⇒ push into context state.\n * 2. On context state change (user edits params/body) ⇒ write draft.\n *\n * Step 1 is gated by a ref so \"just-loaded\" drafts don't immediately\n * trigger step 2. Step 2 additionally compares against a serialised\n * snapshot of the last persisted value so a re-render without a real\n * value change doesn't touch storage.\n *\n * Had an infinite-render-loop bug here earlier: the persist callbacks\n * were driven by ``useLocalStorage`` whose setter identity changed on\n * every internal state update, so depending on them from an effect\n * created a cycle. Fixed by making ``useEndpointDraft``'s writers\n * stable (ref-based), and by gating writes with value comparison below.\n */\nexport function EndpointDraftSync({ schemaId }: EndpointDraftSyncProps) {\n const { state, setParameters, setRequestBody, setActiveSchemaId } = usePlaygroundContext();\n const ep = state.selectedEndpoint;\n\n // Mirror schemaId into context so other components (e.g. the Reset\n // button in RequestPanel) can read it without receiving props from\n // a parent they don't own.\n useEffect(() => {\n setActiveSchemaId(schemaId);\n }, [schemaId, setActiveSchemaId]);\n\n const { draft, setParameters: persistParams, setRequestBody: persistBody } =\n useEndpointDraft(schemaId, ep);\n\n const lastLoadedKeyRef = useRef<string | null>(null);\n const lastPersistedParamsRef = useRef<string>('');\n const lastPersistedBodyRef = useRef<string>('');\n const currentKey = ep ? `${ep.method}|${ep.path}` : null;\n\n // Step 1 — hydrate context from draft on endpoint switch.\n //\n // IMPORTANT: only apply fields that actually exist in the saved draft.\n // SELECT_ENDPOINT in the reducer pre-fills ``requestBody`` with an\n // auto-generated schema example, and ``parameters`` with ``{}``.\n // If we blindly overwrite those with an empty draft we wipe the\n // example before the user ever sees it. Tracked via a bug: opening\n // POST /pet showed ``{\"key\":\"value\"}`` instead of the Pet example.\n useEffect(() => {\n if (!ep || !currentKey) {\n lastLoadedKeyRef.current = null;\n return;\n }\n if (lastLoadedKeyRef.current === currentKey) return;\n lastLoadedKeyRef.current = currentKey;\n\n const hasStoredParams =\n draft.parameters && Object.keys(draft.parameters).length > 0;\n const hasStoredBody = typeof draft.requestBody === 'string' && draft.requestBody !== '';\n\n if (hasStoredParams) {\n setParameters(draft.parameters);\n lastPersistedParamsRef.current = JSON.stringify(draft.parameters);\n } else {\n // Keep whatever the reducer put there; mirror it into the\n // \"last persisted\" ref so step-2 treats it as a baseline.\n lastPersistedParamsRef.current = JSON.stringify(state.parameters);\n }\n\n if (hasStoredBody) {\n setRequestBody(draft.requestBody);\n lastPersistedBodyRef.current = draft.requestBody;\n } else {\n lastPersistedBodyRef.current = state.requestBody;\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [currentKey]);\n\n // Step 2 — persist user edits.\n useEffect(() => {\n if (!ep || lastLoadedKeyRef.current !== currentKey) return;\n const serialised = JSON.stringify(state.parameters);\n if (serialised === lastPersistedParamsRef.current) return;\n lastPersistedParamsRef.current = serialised;\n persistParams(state.parameters);\n }, [state.parameters, ep, currentKey, persistParams]);\n\n useEffect(() => {\n if (!ep || lastLoadedKeyRef.current !== currentKey) return;\n if (state.requestBody === lastPersistedBodyRef.current) return;\n lastPersistedBodyRef.current = state.requestBody;\n persistBody(state.requestBody);\n }, [state.requestBody, ep, currentKey, persistBody]);\n\n return null;\n}\n","import type { ApiEndpoint } from '../../types';\n\n/** DOM-safe anchor for a single endpoint.\n *\n * Two forms:\n * - Scoped (``schemaId`` provided) — ``ep-<schema>-<method>-<slug>``.\n * Used in ``sections`` mode where endpoints from different schemas\n * coexist on one page and would otherwise collide.\n * - Flat — ``ep-<method>-<slug>``. Used in ``selector`` mode where\n * only one schema is mounted at a time. */\nexport function endpointAnchor(\n ep: Pick<ApiEndpoint, 'method' | 'path'>,\n schemaId?: string | null,\n): string {\n const slug = ep.path\n .replace(/^https?:\\/\\/[^/]+/, '')\n .replace(/[{}]/g, '')\n .replace(/[^a-zA-Z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .toLowerCase();\n const schemaSlug = schemaId ? `${slugifySchemaId(schemaId)}-` : '';\n return `ep-${schemaSlug}${ep.method.toLowerCase()}-${slug}`;\n}\n\n/** Canonical slug for a schema id — safe for anchors and hash fragments. */\nexport function slugifySchemaId(id: string): string {\n return id.replace(/[^a-zA-Z0-9_-]+/g, '-').replace(/^-+|-+$/g, '');\n}\n","'use client';\n\n/**\n * Shared primitive UI components used by the playground panels\n * (Request, Response) in both the slide-in and mobile-sheet surfaces.\n * Keep this file free of any business logic or context reads.\n */\n\nimport { ChevronRight } from 'lucide-react';\nimport React from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\n// ─── Style helpers ────────────────────────────────────────────────────────────\n\nconst METHOD_STYLES: Record<string, string> = {\n GET: 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-500/25',\n POST: 'bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/25',\n PUT: 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/25',\n PATCH: 'bg-orange-500/10 text-orange-600 dark:text-orange-400 border-orange-500/25',\n DELETE: 'bg-red-500/10 text-red-600 dark:text-red-400 border-red-500/25',\n} as const;\n\nconst METHOD_FALLBACK = 'bg-muted text-muted-foreground border-border';\n\nexport function getMethodStyle(method: string): string {\n return METHOD_STYLES[method.toUpperCase()] ?? METHOD_FALLBACK;\n}\n\nexport function getStatusStyle(status: number): string {\n if (status >= 500) return 'bg-red-500/10 text-red-500 dark:text-red-400 border-red-500/25';\n if (status >= 400) return 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/25';\n if (status >= 300) return 'bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/25';\n return 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-500/25';\n}\n\n// ``relativePath`` lives in utils/url.ts now — re-exported here so every\n// component that used to import it from ``./ui`` keeps working.\nexport { relativePath } from '../../utils/url';\n\n// ─── Atoms ────────────────────────────────────────────────────────────────────\n\nexport function MethodBadge({ method }: { method: string }) {\n return (\n <span className={cn(\n 'inline-flex shrink-0 items-center rounded border px-1.5 py-px',\n 'font-mono text-[10px] font-bold uppercase tracking-wider leading-none',\n getMethodStyle(method),\n )}>\n {method}\n </span>\n );\n}\n\nexport function StatusBadge({ status }: { status: number }) {\n return (\n <span className={cn(\n 'inline-flex items-center rounded border px-1.5 py-px',\n 'font-mono text-[11px] font-bold leading-none',\n getStatusStyle(status),\n )}>\n {status}\n </span>\n );\n}\n\nexport function SectionLabel({ children }: { children: React.ReactNode }) {\n return (\n <p className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60 select-none\">\n {children}\n </p>\n );\n}\n\nexport function Panel({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <div className={cn('flex flex-col min-h-0 overflow-hidden', className)}>\n {children}\n </div>\n );\n}\n\nexport function ScrollArea({ children, className }: { children: React.ReactNode; className?: string }) {\n return (\n <div className={cn('flex-1 overflow-y-auto min-h-0', className)}>\n {children}\n </div>\n );\n}\n\nexport function PanelHeader({ title }: { title: string }) {\n return (\n <div className=\"shrink-0 border-b px-4 h-10 flex items-center\">\n <span className=\"text-[11px] font-semibold uppercase tracking-widest text-muted-foreground/50\">\n {title}\n </span>\n </div>\n );\n}\n\nexport function EmptyState({\n icon: Icon,\n text,\n className,\n}: {\n icon: React.ElementType;\n text: string;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n 'flex flex-col items-center justify-center h-full gap-3 px-6 text-center',\n className,\n )}\n >\n <Icon className=\"h-7 w-7 text-muted-foreground/25\" />\n <p className=\"text-xs text-muted-foreground\">{text}</p>\n </div>\n );\n}\n\nexport function CollapsibleSection({\n label,\n action,\n children,\n defaultOpen = false,\n}: {\n label: React.ReactNode;\n action?: React.ReactNode;\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) {\n const [open, setOpen] = React.useState(defaultOpen);\n return (\n <div className=\"space-y-0\">\n <div className=\"flex items-center justify-between\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"flex items-center gap-1.5 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60 hover:text-muted-foreground transition-colors py-1\"\n >\n <ChevronRight className={cn('h-3 w-3 transition-transform', open && 'rotate-90')} />\n {label}\n </button>\n {action && <div className=\"shrink-0\">{action}</div>}\n </div>\n {open && <div>{children}</div>}\n </div>\n );\n}\n","import type { ApiEndpoint } from '../../types';\n\n/**\n * Given a list of full endpoint paths, return the longest ``/``-aligned\n * prefix they all share. Used to strip the redundant group prefix\n * (``/api/v3/pet``) from sidebar labels so the meaningful tail is visible.\n *\n * Works on full URLs too — if every path begins with the same origin,\n * the origin is part of the common prefix and gets stripped.\n */\nexport function longestCommonPrefix(paths: string[]): string {\n if (paths.length === 0) return '';\n if (paths.length === 1) return '';\n\n const segments = paths.map((p) => p.split('/'));\n const minLen = Math.min(...segments.map((s) => s.length));\n\n const shared: string[] = [];\n for (let i = 0; i < minLen; i++) {\n const first = segments[0]![i];\n if (segments.every((s) => s[i] === first)) {\n shared.push(first!);\n } else {\n break;\n }\n }\n // Don't strip everything — we always want at least a leading \"/\" or\n // the method on the visible side. If the group has one endpoint,\n // the caller guards with paths.length check already.\n const joined = shared.join('/');\n // Trim trailing slash so the tail is clean (``/foo`` not ``foo``).\n return joined;\n}\n\n/**\n * Compute the label to show in the sidebar for a given endpoint.\n *\n * Priority:\n * 1. ``ep.summary`` — human-readable, from OpenAPI ``operation.summary``.\n * 2. The tail of ``ep.path`` after stripping the group's common prefix.\n * 3. Full ``ep.path`` if the group has a single endpoint (no prefix to strip).\n */\nexport function sidebarLabel(ep: ApiEndpoint, groupCommonPrefix: string): string {\n if (ep.summary) return ep.summary;\n\n if (groupCommonPrefix && ep.path.startsWith(groupCommonPrefix)) {\n const tail = ep.path.slice(groupCommonPrefix.length) || '/';\n return tail;\n }\n return relativePath(ep.path);\n}\n\nfunction relativePath(full: string): string {\n try { return new URL(full).pathname; } catch { return full; }\n}\n\n/** Tooltip text: always the definitive ``METHOD relative/path``. */\nexport function sidebarTooltip(ep: ApiEndpoint): string {\n return `${ep.method} ${relativePath(ep.path)}`;\n}\n","/**\n * Shared grouping / sort for the docs layout.\n *\n * Sidebar and the docs longread MUST use the same order — otherwise\n * scrollspy highlights jump around as the user scrolls (the sidebar's\n * ordered list doesn't match the visual order of sections in the docs).\n * This module is the single source of truth for that ordering.\n */\n\nimport { groupBy, orderBy, partition, sortBy } from 'lodash-es';\n\nimport type { ApiEndpoint, SchemaSource } from '../../types';\nimport { longestCommonPrefix } from './sidebarLabel';\n\nexport type EndpointGroup = {\n category: string;\n endpoints: ApiEndpoint[];\n /** Longest ``/``-aligned prefix shared by every endpoint in this\n * group. Used by the sidebar to strip the redundant group prefix\n * from fallback labels. */\n commonPrefix: string;\n};\n\n/** A schema's worth of categorised endpoints. The outer level of the\n * ``sections`` sidebar iterates over these. */\nexport type SchemaSection = {\n source: SchemaSource;\n groups: EndpointGroup[];\n};\n\nconst METHOD_ORDER: Record<string, number> = {\n GET: 0,\n POST: 1,\n PUT: 2,\n PATCH: 3,\n DELETE: 4,\n};\n\nconst methodRank = (ep: ApiEndpoint) => METHOD_ORDER[ep.method] ?? 99;\n\n/**\n * Stable, deterministic ordering so two different renders with the\n * same endpoint list always produce the same visual sequence.\n *\n * Groups: alphabetical by tag/category, with ``Other`` pinned to the\n * bottom (spec-less endpoints should not steal the top slot).\n *\n * Within a group: endpoints sorted by path first (so related resources\n * cluster), then by HTTP method (read → write → delete).\n */\nexport function groupEndpoints(list: ApiEndpoint[]): EndpointGroup[] {\n const byCategory = groupBy(list, 'category');\n const all: EndpointGroup[] = Object.entries(byCategory).map(([category, endpoints]) => ({\n category,\n endpoints: orderBy(endpoints, ['path', methodRank], ['asc', 'asc']),\n commonPrefix: longestCommonPrefix(endpoints.map((e) => e.path)),\n }));\n // \"Other\" sinks to the bottom regardless of alphabet.\n const [other, named] = partition(all, (g) => g.category === 'Other');\n return [...sortBy(named, (g) => g.category.toLowerCase()), ...other];\n}\n\n/** Flatten grouped endpoints back into a linear list that preserves\n * group order + within-group order. This is the canonical order for\n * both the sidebar and the docs longread. */\nexport function flattenGrouped(groups: EndpointGroup[]): ApiEndpoint[] {\n return groups.flatMap((g) => g.endpoints);\n}\n\n/** Build per-schema sections in the same order as the original\n * ``schemas`` array. Schemas with zero endpoints are kept so users see\n * an empty-state placeholder instead of \"the section silently vanished\". */\nexport function buildSchemaSections(\n sources: SchemaSource[],\n endpointsBySchema: Record<string, ApiEndpoint[]>,\n): SchemaSection[] {\n return sources.map((source) => ({\n source,\n groups: groupEndpoints(endpointsBySchema[source.id] ?? []),\n }));\n}\n\n/** Flatten schema-sections into a linear endpoint list. Used by scrollspy\n * and by the docs longread to render endpoints in the exact same order\n * as the sidebar. */\nexport function flattenSchemaSections(sections: SchemaSection[]): ApiEndpoint[] {\n return sections.flatMap((s) => flattenGrouped(s.groups));\n}\n","'use client';\n\nimport { Check, ChevronDown, Sparkles } from 'lucide-react';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport {\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@djangocfg/ui-core/components';\nimport { toast } from '@djangocfg/ui-core/hooks';\n\nimport type { ApiEndpoint, OpenApiSchema } from '../../types';\nimport {\n formatBytes,\n toCompactJson,\n toMarkdown,\n toRawJson,\n} from '../../utils/schemaExport';\n\ntype Flavour = 'markdown' | 'compact' | 'raw';\n\nconst FLAVOUR_LABELS: Record<Flavour, { title: string; hint: string }> = {\n markdown: {\n title: 'Markdown for LLM',\n hint: 'Endpoints + params as prose. Smallest.',\n },\n compact: {\n title: 'Compact JSON',\n hint: 'Dereferenced, no examples, minified.',\n },\n raw: {\n title: 'Raw JSON',\n hint: 'Full OpenAPI document with $refs.',\n },\n};\n\ninterface SchemaCopyMenuProps {\n schema: OpenApiSchema | null;\n endpoints: ApiEndpoint[];\n /** Resolved base URL that gets embedded into the copy so the AI\n * receives working URLs, not the ones originally in ``schema.servers``. */\n baseUrl?: string;\n /** Trigger appearance.\n * - ``button`` (default) — labelled pill with icon + chevron.\n * - ``icon`` — square ghost button, used in tight spots like the\n * sidebar header where there is no room for \"Copy for AI\". */\n variant?: 'button' | 'icon';\n}\n\n/**\n * Per-schema copy dropdown. Shows three flavours tuned for different LLM\n * use-cases. We compute each flavour lazily (only on click) because\n * dereferencing + stringifying a large schema can be non-trivial — sizes\n * are displayed after the first successful copy, via a tiny cache.\n */\nexport function SchemaCopyMenu({ schema, endpoints, baseUrl, variant = 'button' }: SchemaCopyMenuProps) {\n const [sizeCache, setSizeCache] = useState<Partial<Record<Flavour, string>>>({});\n const [justCopied, setJustCopied] = useState<Flavour | null>(null);\n const [open, setOpen] = useState(false);\n\n const isReady = schema !== null && endpoints.length > 0;\n\n const build = useCallback(\n (flavour: Flavour): string => {\n if (!schema) return '';\n if (flavour === 'markdown') return toMarkdown(schema, endpoints, baseUrl);\n if (flavour === 'compact') return toCompactJson(schema, baseUrl);\n return toRawJson(schema, baseUrl);\n },\n [schema, endpoints, baseUrl],\n );\n\n const handleCopy = useCallback(\n async (flavour: Flavour) => {\n if (!isReady) return;\n const text = build(flavour);\n const label = FLAVOUR_LABELS[flavour].title;\n try {\n await navigator.clipboard.writeText(text);\n const size = formatBytes(text);\n setSizeCache((prev) => ({ ...prev, [flavour]: size }));\n setJustCopied(flavour);\n setTimeout(() => setJustCopied(null), 1500);\n setOpen(false);\n toast.success(`Copied ${label}`, { description: size });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Clipboard permission denied';\n toast.error('Copy failed', { description: message });\n }\n },\n [build, isReady],\n );\n\n const flavours = useMemo<Flavour[]>(() => ['markdown', 'compact', 'raw'], []);\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n {variant === 'icon' ? (\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-7 w-7 shrink-0\"\n disabled={!isReady}\n title=\"Copy schema for AI\"\n aria-label=\"Copy schema for AI\"\n >\n <Sparkles className=\"h-3.5 w-3.5\" />\n </Button>\n ) : (\n <Button variant=\"outline\" size=\"sm\" className=\"h-8 gap-1.5 text-xs\" disabled={!isReady}>\n <Sparkles className=\"h-3 w-3\" />\n Copy for AI\n <ChevronDown className=\"h-3 w-3 opacity-60\" />\n </Button>\n )}\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-72\">\n <DropdownMenuLabel className=\"text-[10px] uppercase tracking-wider text-muted-foreground/70\">\n Copy schema\n </DropdownMenuLabel>\n <DropdownMenuSeparator />\n {flavours.map((f) => {\n const label = FLAVOUR_LABELS[f];\n const size = sizeCache[f];\n const isDone = justCopied === f;\n return (\n <DropdownMenuItem\n key={f}\n onClick={(e) => {\n e.preventDefault();\n void handleCopy(f);\n }}\n className=\"flex flex-col items-start gap-0.5 py-2 cursor-pointer\"\n >\n <div className=\"flex w-full items-center gap-2\">\n <span className=\"text-xs font-medium flex-1\">{label.title}</span>\n {isDone ? (\n <span className=\"inline-flex items-center gap-1 text-[10px] text-emerald-500\">\n <Check className=\"h-3 w-3\" /> Copied\n </span>\n ) : size ? (\n <span className=\"text-[10px] font-mono text-muted-foreground/70 tabular-nums\">\n {size}\n </span>\n ) : null}\n </div>\n <span className=\"text-[10px] text-muted-foreground/70 leading-snug\">\n {label.hint}\n </span>\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","'use client';\n\nimport { Search } from 'lucide-react';\nimport React, { useEffect, useMemo, useState } from 'react';\n\nimport {\n Combobox,\n Input,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport type { ApiEndpoint, OpenApiInfo, OpenApiSchema, SchemaSource } from '../../types';\nimport { deduplicateEndpoints } from '../../utils/versionManager';\nimport { MethodBadge, ScrollArea } from '../shared/ui';\nimport { endpointAnchor } from './anchor';\nimport { buildSchemaSections, groupEndpoints, type EndpointGroup } from './grouping';\nimport { SchemaCopyMenu } from './SchemaCopyMenu';\nimport { sidebarLabel, sidebarTooltip } from './sidebarLabel';\n\n// ─── Public props ────────────────────────────────────────────────────────────\n\nexport interface DocsSidebarProps {\n info: OpenApiInfo | null;\n /** Active-schema endpoints — used by ``selector`` mode. */\n endpoints: ApiEndpoint[];\n /** All configured schemas (used by both modes). */\n schemas: SchemaSource[];\n currentSchemaId: string | null;\n onSchemaChange: (id: string) => void;\n activeEndpointId: string | null;\n selectedVersion: string;\n onNavigate: (anchor: string, schemaId?: string | null) => void;\n /** Presentation mode. Default: ``selector`` (back-compat). */\n grouping?: 'selector' | 'sections';\n /** Required for ``sections`` mode — endpoints grouped by their source\n * schema id. The sidebar renders them as two-level sections. */\n endpointsBySchema?: Record<string, ApiEndpoint[]>;\n /** Raw active schema + resolved base URL — used by the Copy-for-AI\n * dropdown in the brand row. ``null`` disables the button. */\n rawSchema?: OpenApiSchema | null;\n resolvedBaseUrl?: string;\n}\n\n/** HTTP methods the sidebar can filter by. Reordered like the docs\n * themselves: read, then write. ``ALL`` is a sentinel for no filter. */\nconst METHOD_FILTERS = ['ALL', 'GET', 'POST', 'PUT', 'PATCH', 'DELETE'] as const;\ntype MethodFilter = (typeof METHOD_FILTERS)[number];\n\n// ─── View-model types ────────────────────────────────────────────────────────\n\ninterface EndpointRowVM {\n key: string;\n anchor: string;\n schemaId: string | null;\n label: string;\n tooltip: string;\n method: string;\n /** Summary-less endpoints get a monospace font for the path-tail label. */\n useMono: boolean;\n isActive: boolean;\n}\n\ninterface CategoryVM {\n key: string;\n category: string;\n rows: EndpointRowVM[];\n}\n\ninterface SchemaSectionVM {\n sourceId: string;\n sourceName: string;\n categories: CategoryVM[];\n}\n\ntype SidebarBodyVM =\n | { kind: 'flat'; categories: CategoryVM[]; emptyText: string }\n | { kind: 'sections'; sections: SchemaSectionVM[]; emptyText: string };\n\n// ─── Pure builders ───────────────────────────────────────────────────────────\n\nfunction filterEndpoints(\n list: ApiEndpoint[],\n query: string,\n method: MethodFilter,\n): ApiEndpoint[] {\n let out = list;\n if (method !== 'ALL') {\n out = out.filter((e) => e.method === method);\n }\n if (query) {\n const q = query.toLowerCase();\n out = out.filter(\n (e) =>\n e.summary.toLowerCase().includes(q) ||\n e.name.toLowerCase().includes(q) ||\n e.description.toLowerCase().includes(q) ||\n e.path.toLowerCase().includes(q),\n );\n }\n return out;\n}\n\nfunction buildCategory(\n group: EndpointGroup,\n activeEndpointId: string | null,\n schemaId: string | null,\n keyPrefix: string,\n): CategoryVM {\n const rows: EndpointRowVM[] = group.endpoints.map((ep) => {\n const anchor = endpointAnchor(ep, schemaId ?? ep.schemaId ?? null);\n return {\n key: `${ep.method}-${ep.path}`,\n anchor,\n schemaId: schemaId ?? ep.schemaId ?? null,\n label: sidebarLabel(ep, group.commonPrefix),\n tooltip: sidebarTooltip(ep),\n method: ep.method,\n useMono: !ep.summary,\n isActive: activeEndpointId === anchor,\n };\n });\n return {\n key: `${keyPrefix}${group.category}`,\n category: group.category,\n rows,\n };\n}\n\nconst emptyTextFor = (query: string, method: MethodFilter, defaultText: string): string => {\n if (query && method !== 'ALL') return `No ${method} endpoints match \"${query}\"`;\n if (query) return `No endpoints match \"${query}\"`;\n if (method !== 'ALL') return `No ${method} endpoints`;\n return defaultText;\n};\n\nfunction buildFlatVM(\n endpoints: ApiEndpoint[],\n selectedVersion: string,\n query: string,\n method: MethodFilter,\n activeEndpointId: string | null,\n): SidebarBodyVM {\n const filtered = filterEndpoints(deduplicateEndpoints(endpoints, selectedVersion), query, method);\n const groups = groupEndpoints(filtered);\n return {\n kind: 'flat',\n categories: groups.map((g) => buildCategory(g, activeEndpointId, null, '')),\n emptyText: emptyTextFor(query, method, 'No endpoints in this schema'),\n };\n}\n\nfunction buildSectionsVM(\n schemas: SchemaSource[],\n endpointsBySchema: Record<string, ApiEndpoint[]>,\n selectedVersion: string,\n query: string,\n method: MethodFilter,\n activeEndpointId: string | null,\n): SidebarBodyVM {\n const filteredMap: Record<string, ApiEndpoint[]> = {};\n for (const src of schemas) {\n const raw = endpointsBySchema[src.id] ?? [];\n filteredMap[src.id] = filterEndpoints(deduplicateEndpoints(raw, selectedVersion), query, method);\n }\n const rawSections = buildSchemaSections(schemas, filteredMap);\n const sections: SchemaSectionVM[] = rawSections\n .filter((s) => s.groups.length > 0)\n .map((s) => ({\n sourceId: s.source.id,\n sourceName: s.source.name,\n categories: s.groups.map((g) => buildCategory(g, activeEndpointId, s.source.id, `${s.source.id}-`)),\n }));\n return {\n kind: 'sections',\n sections,\n emptyText: emptyTextFor(query, method, 'No endpoints in any schema'),\n };\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport function DocsSidebar({\n info,\n endpoints,\n schemas,\n currentSchemaId,\n onSchemaChange,\n activeEndpointId,\n selectedVersion,\n onNavigate,\n grouping = 'selector',\n endpointsBySchema,\n rawSchema,\n resolvedBaseUrl,\n}: DocsSidebarProps) {\n const [search, setSearch] = useState('');\n const [debounced, setDebounced] = useState('');\n const [methodFilter, setMethodFilter] = useState<MethodFilter>('ALL');\n\n useEffect(() => {\n const id = setTimeout(() => setDebounced(search), 120);\n return () => clearTimeout(id);\n }, [search]);\n\n const body = useMemo<SidebarBodyVM>(() => {\n if (grouping === 'sections') {\n return buildSectionsVM(\n schemas,\n endpointsBySchema ?? {},\n selectedVersion,\n debounced,\n methodFilter,\n activeEndpointId,\n );\n }\n return buildFlatVM(endpoints, selectedVersion, debounced, methodFilter, activeEndpointId);\n }, [\n grouping,\n schemas,\n endpointsBySchema,\n endpoints,\n selectedVersion,\n debounced,\n methodFilter,\n activeEndpointId,\n ]);\n\n const schemaOptions = useMemo(\n () => schemas.map((s) => ({ value: s.id, label: s.name })),\n [schemas],\n );\n const hasMultipleSchemas = schemas.length > 1;\n const apiTitle = info?.title ?? 'API Reference';\n const showCombobox = grouping === 'selector' && hasMultipleSchemas;\n const copyReady = rawSchema !== null && rawSchema !== undefined && endpoints.length > 0;\n\n return (\n <aside className=\"flex flex-col h-full min-h-0 border-r bg-muted/10\">\n {/* Brand row */}\n <div className=\"shrink-0 border-b px-3 h-12 flex items-center gap-2\">\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <span className=\"text-[13px] font-semibold text-foreground truncate\">\n {apiTitle}\n </span>\n {info?.version && (\n <span className=\"font-mono text-[10px] text-muted-foreground/70 shrink-0\">\n v{info.version}\n </span>\n )}\n </div>\n {copyReady && (\n <SchemaCopyMenu\n schema={rawSchema ?? null}\n endpoints={endpoints}\n baseUrl={resolvedBaseUrl}\n variant=\"icon\"\n />\n )}\n </div>\n\n {/* Controls */}\n <div className=\"shrink-0 border-b px-3 py-3 space-y-2\">\n {showCombobox && (\n <Combobox\n options={schemaOptions}\n value={currentSchemaId ?? ''}\n onValueChange={(id) => id && onSchemaChange(id)}\n placeholder=\"Select API\"\n searchPlaceholder=\"Search APIs…\"\n emptyText=\"No APIs found\"\n className=\"w-full h-8 text-xs\"\n />\n )}\n <div className=\"relative\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-muted-foreground/50 pointer-events-none\" />\n <Input\n placeholder=\"Search endpoints…\"\n value={search}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearch(e.target.value)}\n className=\"pl-8 h-8 text-xs\"\n />\n </div>\n <MethodChips value={methodFilter} onChange={setMethodFilter} />\n </div>\n\n <ScrollArea>\n <SidebarBody body={body} onNavigate={onNavigate} />\n </ScrollArea>\n </aside>\n );\n}\n\nfunction MethodChips({\n value,\n onChange,\n}: {\n value: MethodFilter;\n onChange: (v: MethodFilter) => void;\n}) {\n return (\n <div className=\"flex items-center gap-1 flex-wrap\">\n {METHOD_FILTERS.map((m) => {\n const active = value === m;\n return (\n <button\n key={m}\n type=\"button\"\n onClick={() => onChange(m)}\n aria-pressed={active}\n className={cn(\n 'px-2 py-0.5 rounded font-mono text-[10px] font-semibold tracking-wide transition-colors border',\n active\n ? 'bg-primary/15 border-primary/40 text-foreground'\n : 'bg-transparent border-border/40 text-muted-foreground hover:text-foreground hover:border-border',\n )}\n >\n {m}\n </button>\n );\n })}\n </div>\n );\n}\n\n// ─── Rendering primitives ────────────────────────────────────────────────────\n\ntype NavigateFn = (anchor: string, schemaId?: string | null) => void;\n\nfunction SidebarBody({ body, onNavigate }: { body: SidebarBodyVM; onNavigate: NavigateFn }) {\n if (body.kind === 'flat') {\n if (body.categories.length === 0) {\n return (\n <div className=\"py-10 px-4 text-center text-xs text-muted-foreground\">\n {body.emptyText}\n </div>\n );\n }\n return (\n <nav className=\"py-2\">\n {body.categories.map((cat) => (\n <CategoryBlock key={cat.key} category={cat} onNavigate={onNavigate} />\n ))}\n </nav>\n );\n }\n\n if (body.sections.length === 0) {\n return (\n <div className=\"py-10 px-4 text-center text-xs text-muted-foreground\">\n {body.emptyText}\n </div>\n );\n }\n\n return (\n <nav className=\"py-2\">\n {body.sections.map((section) => (\n <div key={section.sourceId} className=\"mb-5 last:mb-2\">\n <div className=\"px-4 py-2 sticky top-0 z-[1] bg-muted/30 backdrop-blur-[2px] border-b border-border/30\">\n <span className=\"text-[11px] font-bold uppercase tracking-[0.12em] text-foreground/80\">\n {section.sourceName}\n </span>\n </div>\n {section.categories.map((cat) => (\n <CategoryBlock key={cat.key} category={cat} onNavigate={onNavigate} />\n ))}\n </div>\n ))}\n </nav>\n );\n}\n\nconst CategoryBlock = React.memo(function CategoryBlock({\n category,\n onNavigate,\n}: {\n category: CategoryVM;\n onNavigate: NavigateFn;\n}) {\n return (\n <div className=\"mb-4 last:mb-2\">\n <div className=\"px-4 py-1.5 text-[10px] font-semibold uppercase tracking-[0.14em] text-muted-foreground/50 select-none\">\n {category.category}\n </div>\n <div>\n {category.rows.map((row) => (\n <EndpointRow key={row.key} row={row} onNavigate={onNavigate} />\n ))}\n </div>\n </div>\n );\n});\n\nconst EndpointRow = React.memo(function EndpointRow({\n row,\n onNavigate,\n}: {\n row: EndpointRowVM;\n onNavigate: NavigateFn;\n}) {\n return (\n <Tooltip delayDuration={350}>\n <TooltipTrigger asChild>\n <button\n onClick={() => onNavigate(row.anchor, row.schemaId)}\n aria-current={row.isActive ? 'location' : undefined}\n className={cn(\n 'relative group w-full text-left flex items-start gap-2 pl-4 pr-3 py-1.5 transition-colors',\n row.isActive\n ? 'bg-primary/10 text-foreground'\n : 'hover:bg-muted/40 text-foreground/75 hover:text-foreground',\n )}\n >\n {row.isActive && (\n <span className=\"absolute left-0 top-1 bottom-1 w-0.5 rounded-r bg-primary\" />\n )}\n <span className=\"shrink-0 mt-[1px]\">\n <MethodBadge method={row.method} />\n </span>\n <span\n className={cn(\n 'line-clamp-2 leading-snug flex-1 min-w-0',\n row.useMono ? 'font-mono text-[11px] break-all' : 'text-[12px]',\n row.isActive && 'text-foreground font-medium',\n )}\n >\n {row.label}\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"right\" align=\"center\" className=\"font-mono text-[11px]\">\n {row.tooltip}\n </TooltipContent>\n </Tooltip>\n );\n});\n","/**\n * Find the nearest ancestor that actually scrolls vertically, or\n * ``window`` when none exists. Handles the common embed scenarios:\n *\n * - Standalone page: nothing in the chain scrolls → caller scrolls\n * ``window`` and listens to ``window.scroll``.\n * - Dev playground / modal shell: an intermediate ``overflow-auto``\n * container scrolls → caller scrolls that element and listens to\n * *its* ``scroll`` events (which do NOT bubble to window).\n *\n * A \"scrollable\" ancestor is one whose computed ``overflow-y`` is\n * ``auto`` or ``scroll`` AND whose content actually overflows. We bail\n * before ``document.body`` — ``documentElement`` is represented by\n * ``window`` in the caller's hot path, so returning the body itself\n * would double-count the scroll surface.\n */\nexport type ScrollTarget = HTMLElement | Window;\n\nexport function getScrollParent(el: HTMLElement | null): ScrollTarget {\n if (typeof window === 'undefined') return (null as unknown) as Window;\n if (!el) return window;\n\n let cur: HTMLElement | null = el.parentElement;\n while (cur && cur !== document.body && cur !== document.documentElement) {\n const style = getComputedStyle(cur);\n const overflowY = style.overflowY;\n const canScroll =\n (overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay') &&\n cur.scrollHeight > cur.clientHeight;\n if (canScroll) return cur;\n cur = cur.parentElement;\n }\n return window;\n}\n\n/** Top-relative scroll position of the target. */\nexport function getScrollTop(target: ScrollTarget): number {\n return target === window ? window.scrollY : (target as HTMLElement).scrollTop;\n}\n\n/** Visible viewport height of the target. */\nexport function getViewportHeight(target: ScrollTarget): number {\n return target === window ? window.innerHeight : (target as HTMLElement).clientHeight;\n}\n\n/** Y coordinate of the target's top edge, in viewport space. Used to\n * translate ``getBoundingClientRect().top`` into target-relative\n * coordinates. For ``window`` this is always ``0``. */\nexport function getTargetTop(target: ScrollTarget): number {\n return target === window ? 0 : (target as HTMLElement).getBoundingClientRect().top;\n}\n\n/** Scroll the target so that the given absolute Y lands at its top.\n *\n * For ``window`` we ask the browser to animate smoothly — every engine\n * honours that path. Nested ``overflow-auto`` elements are a different\n * story: some layouts (e.g. dev-playground shells with flex parents)\n * silently drop the animation, leaving the user stuck. Direct\n * ``scrollTop`` writes always work, so we use them there — loss of\n * animation beats broken navigation. Consumers who want animated\n * scrolling inside a custom shell can wrap this function themselves. */\nexport function scrollTargetTo(target: ScrollTarget, top: number) {\n if (target === window) {\n window.scrollTo({ top, behavior: 'smooth' });\n return;\n }\n (target as HTMLElement).scrollTop = top;\n}\n","'use client';\n\nimport React from 'react';\n\nimport { MarkdownMessage } from '../../../../components/markdown';\nimport type { ApiEndpoint, OpenApiInfo, OpenApiSchema } from '../../types';\nimport { SchemaCopyMenu } from './SchemaCopyMenu';\n\ninterface ApiIntroSectionProps {\n info: OpenApiInfo;\n schema: OpenApiSchema | null;\n endpoints: ApiEndpoint[];\n resolvedBaseUrl?: string;\n}\n\nexport function ApiIntroSection({ info, schema, endpoints, resolvedBaseUrl }: ApiIntroSectionProps) {\n return (\n <section className=\"pb-10 mb-10 border-b\">\n <div className=\"flex items-start justify-between gap-4 flex-wrap\">\n <div className=\"flex items-center gap-3 flex-wrap min-w-0\">\n <h1 className=\"text-3xl font-semibold tracking-tight text-foreground leading-tight\">\n {info.title}\n </h1>\n <span className=\"inline-flex items-center rounded-full bg-muted px-2 py-0.5 font-mono text-[11px] text-muted-foreground\">\n v{info.version}\n </span>\n </div>\n <SchemaCopyMenu\n schema={schema}\n endpoints={endpoints}\n baseUrl={resolvedBaseUrl}\n />\n </div>\n\n {info.description && (\n <div className=\"mt-4 text-muted-foreground\">\n <MarkdownMessage content={info.description} />\n </div>\n )}\n\n {info.servers && info.servers.length > 0 && (\n <div className=\"mt-6 space-y-2\">\n <h4 className=\"text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/60\">\n Base URL\n </h4>\n <div className=\"space-y-1.5\">\n {info.servers.map((s, i) => (\n <div key={`${s.url}-${i}`} className=\"flex items-baseline gap-2 flex-wrap\">\n <code className=\"font-mono text-xs px-2 py-1 rounded bg-muted border\">\n {s.url}\n </code>\n {s.description && (\n <span className=\"text-xs text-muted-foreground\">\n {s.description}\n </span>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n </section>\n );\n}\n","/**\n * Flatten a JSON Schema node into a flat list of (name, type, required,\n * description) rows, ready to feed into the existing parameter table.\n *\n * Rules:\n * - ``type: object`` → one row per property.\n * - ``type: array`` → recurse into items; prefix each row with ``[].``\n * so the caller sees \"[].username string\" etc.\n * - Nested objects → dot-joined path: ``category.name``. We expand\n * one level; deeper graphs get a single summary\n * row (\"category.* (object)\") to keep the table\n * readable.\n *\n * This is a presentation helper — not a full form generator. It powers\n * the read-only fields table shown in the docs longread.\n */\n\ntype JsonSchemaNode = Record<string, unknown> & {\n type?: string;\n properties?: Record<string, JsonSchemaNode>;\n required?: string[];\n items?: JsonSchemaNode;\n enum?: unknown[];\n description?: string;\n format?: string;\n};\n\nexport interface SchemaField {\n name: string;\n type: string;\n required: boolean;\n description?: string;\n}\n\nconst MAX_DEPTH = 2;\n\nfunction describeType(node: JsonSchemaNode): string {\n if (!node.type && node.properties) return 'object';\n const base = node.type || 'any';\n if (base === 'array') {\n const itemType = node.items ? describeType(node.items) : 'any';\n return `array<${itemType}>`;\n }\n if (Array.isArray(node.enum) && node.enum.length > 0) {\n return `${base} enum`;\n }\n if (node.format) return `${base} (${node.format})`;\n return base;\n}\n\nexport function schemaToFields(\n schema: JsonSchemaNode | undefined,\n prefix = '',\n depth = 0,\n): SchemaField[] {\n if (!schema || depth > MAX_DEPTH) return [];\n\n // Unwrap arrays: show the inner item's fields, prefixed with ``[]``.\n if (schema.type === 'array') {\n if (!schema.items) {\n return [{ name: prefix || '[]', type: 'array', required: false }];\n }\n const inner = schemaToFields(schema.items, prefix ? `${prefix}[]` : '[]', depth);\n if (inner.length === 0) {\n return [\n {\n name: prefix || '[]',\n type: describeType(schema),\n required: false,\n description: schema.description,\n },\n ];\n }\n return inner;\n }\n\n // Primitives and unknown — single row.\n if (schema.type !== 'object' && !schema.properties) {\n return [\n {\n name: prefix || '(body)',\n type: describeType(schema),\n required: false,\n description: schema.description,\n },\n ];\n }\n\n // Objects — one row per property, recurse for nested objects/arrays.\n const required = new Set(schema.required ?? []);\n const rows: SchemaField[] = [];\n const props = schema.properties ?? {};\n for (const [key, node] of Object.entries(props)) {\n const fullName = prefix ? `${prefix}.${key}` : key;\n const isRequired = required.has(key);\n\n const isNestedExpandable =\n (node.type === 'object' && node.properties) ||\n (node.type === 'array' && node.items);\n\n if (isNestedExpandable && depth < MAX_DEPTH) {\n // Leaf summary row for the parent itself (so the user sees\n // its description) + recurse for inner fields.\n rows.push({\n name: fullName,\n type: describeType(node),\n required: isRequired,\n description: node.description,\n });\n rows.push(...schemaToFields(node, fullName, depth + 1));\n } else {\n rows.push({\n name: fullName,\n type: describeType(node),\n required: isRequired,\n description: node.description,\n });\n }\n }\n return rows;\n}\n","'use client';\n\nimport { Check, Link2, Play } from 'lucide-react';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { Button, CopyButton } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { MarkdownMessage } from '../../../../components/markdown';\nimport type { ApiEndpoint } from '../../types';\nimport { endpointToMarkdown } from '../../utils/schemaExport';\nimport { MethodBadge, relativePath } from '../shared/ui';\nimport { endpointAnchor } from './anchor';\nimport { schemaToFields, type SchemaField } from './schemaFields';\n\ninterface EndpointDocProps {\n endpoint: ApiEndpoint;\n /** Is this endpoint currently loaded in the sticky playground? */\n isLoadedInPlayground: boolean;\n onTryIt: () => void;\n /** Scoping prefix for the anchor, so endpoints from different schemas\n * don't collide on a single page. Falls back to ``endpoint.schemaId``. */\n schemaId?: string | null;\n}\n\nexport function EndpointDoc({ endpoint, isLoadedInPlayground, onTryIt, schemaId }: EndpointDocProps) {\n const scopedSchemaId = schemaId ?? endpoint.schemaId ?? null;\n const anchor = endpointAnchor(endpoint, scopedSchemaId);\n const pathParams = endpoint.parameters?.filter((p) => endpoint.path.includes(`{${p.name}}`)) ?? [];\n const queryParams = endpoint.parameters?.filter((p) => !endpoint.path.includes(`{${p.name}}`)) ?? [];\n\n const [copied, setCopied] = useState(false);\n const copyAnchor = useCallback(() => {\n if (typeof window === 'undefined') return;\n const url = `${window.location.origin}${window.location.pathname}#${anchor}`;\n void navigator.clipboard?.writeText(url).then(() => {\n setCopied(true);\n setTimeout(() => setCopied(false), 1200);\n });\n }, [anchor]);\n\n // Markdown summary used by the Copy-for-AI button. Memoised so moving\n // the mouse over the section doesn't rebuild the same string.\n const endpointMd = useMemo(() => endpointToMarkdown(endpoint), [endpoint]);\n\n return (\n <section\n id={anchor}\n data-endpoint-anchor={anchor}\n data-schema-id={scopedSchemaId ?? ''}\n className=\"scroll-mt-24 py-10 first:pt-0\"\n >\n <header className=\"space-y-4\">\n <div className=\"flex items-start justify-between gap-3 flex-wrap\">\n <div className=\"flex items-baseline gap-2.5 min-w-0 flex-1 group/header\">\n <span className=\"shrink-0 translate-y-[2px]\">\n <MethodBadge method={endpoint.method} />\n </span>\n <code\n className=\"font-mono text-sm md:text-[15px] font-medium text-foreground leading-snug min-w-0\"\n style={{ overflowWrap: 'anywhere', wordBreak: 'break-word' }}\n >\n {relativePath(endpoint.path)}\n </code>\n <button\n type=\"button\"\n onClick={copyAnchor}\n title=\"Copy link to this section\"\n className={cn(\n 'shrink-0 p-1 rounded text-muted-foreground/40 hover:text-foreground hover:bg-muted transition-all',\n 'opacity-0 group-hover/header:opacity-100',\n copied && 'opacity-100 text-emerald-500',\n )}\n >\n {copied ? <Check className=\"h-3.5 w-3.5\" /> : <Link2 className=\"h-3.5 w-3.5\" />}\n </button>\n <CopyButton\n value={endpointMd}\n title=\"Copy endpoint as markdown (for AI)\"\n variant=\"ghost\"\n size=\"icon\"\n iconClassName=\"h-3.5 w-3.5\"\n className={cn(\n 'shrink-0 h-6 w-6 text-muted-foreground/40 hover:text-foreground',\n 'opacity-0 group-hover/header:opacity-100 focus-visible:opacity-100',\n )}\n />\n </div>\n <Button\n size=\"sm\"\n variant={isLoadedInPlayground ? 'secondary' : 'default'}\n onClick={onTryIt}\n className=\"shrink-0 h-8 text-xs gap-1.5 lg:flex hidden\"\n >\n <Play className=\"h-3 w-3\" />\n {isLoadedInPlayground ? 'Loaded' : 'Try it'}\n </Button>\n </div>\n {endpoint.description && (\n <div className=\"text-muted-foreground\">\n <MarkdownMessage content={endpoint.description} />\n </div>\n )}\n {/* Mobile/tablet: Try it sits under the description so it's always reachable */}\n <Button\n size=\"sm\"\n variant={isLoadedInPlayground ? 'secondary' : 'default'}\n onClick={onTryIt}\n className=\"lg:hidden h-8 text-xs gap-1.5\"\n >\n <Play className=\"h-3 w-3\" />\n {isLoadedInPlayground ? 'Loaded in playground' : 'Try it'}\n </Button>\n </header>\n\n {(pathParams.length > 0 || queryParams.length > 0 || endpoint.requestBody || endpoint.responses?.length) && (\n <div className=\"mt-8 space-y-8\">\n {pathParams.length > 0 && (\n <ParamTable title=\"Path parameters\" params={pathParams} />\n )}\n {queryParams.length > 0 && (\n <ParamTable title=\"Query parameters\" params={queryParams} />\n )}\n {endpoint.requestBody && (\n <RequestBodySection body={endpoint.requestBody} />\n )}\n {endpoint.responses && endpoint.responses.length > 0 && (\n <Subsection title=\"Responses\">\n <div className=\"divide-y border rounded-md overflow-hidden\">\n {endpoint.responses.map((r) => (\n <div\n key={r.code}\n className=\"grid grid-cols-[72px_minmax(0,1fr)] items-center gap-3 px-3 py-2.5 bg-background\"\n >\n <div className=\"flex justify-start\">\n <StatusTag code={r.code} />\n </div>\n <span className=\"text-sm text-muted-foreground leading-relaxed break-words\">\n {r.description}\n </span>\n </div>\n ))}\n </div>\n </Subsection>\n )}\n </div>\n )}\n </section>\n );\n}\n\nfunction RequestBodySection({ body }: { body: NonNullable<ApiEndpoint['requestBody']> }) {\n const fields = useMemo(() => schemaToFields(body.schema), [body.schema]);\n const typeLabel = body.schema\n ? body.type === 'array'\n ? `array<${(body.schema as { items?: { type?: string } }).items?.type ?? 'object'}>`\n : body.type\n : body.type;\n\n return (\n <Subsection title=\"Request body\">\n <div className=\"space-y-2\">\n <div className=\"flex items-baseline gap-2 flex-wrap\">\n <code className=\"font-mono text-[11px] text-muted-foreground/80\">{typeLabel}</code>\n {body.description && (\n <span className=\"text-xs text-muted-foreground\">{body.description}</span>\n )}\n </div>\n {fields.length > 0 && <FieldsTable fields={fields} />}\n </div>\n </Subsection>\n );\n}\n\nfunction FieldsTable({ fields }: { fields: SchemaField[] }) {\n return (\n <div className=\"divide-y border rounded-md overflow-hidden\">\n {fields.map((f) => (\n <div key={f.name} className=\"px-3 py-2.5 bg-background space-y-1\">\n <div className=\"flex items-baseline gap-2 flex-wrap\">\n <code className=\"font-mono text-xs font-medium text-foreground\">{f.name}</code>\n {f.required && (\n <span\n title=\"Required\"\n className=\"text-[9px] text-destructive font-bold leading-none\"\n >\n *\n </span>\n )}\n <code className=\"font-mono text-[11px] text-muted-foreground/70\">{f.type}</code>\n </div>\n {f.description && (\n <p className=\"text-xs text-muted-foreground leading-relaxed break-words\">\n {f.description}\n </p>\n )}\n </div>\n ))}\n </div>\n );\n}\n\nfunction Subsection({ title, children }: { title: string; children: React.ReactNode }) {\n return (\n <div className=\"space-y-2.5\">\n <h4 className=\"text-[10px] font-semibold uppercase tracking-[0.12em] text-muted-foreground/70\">\n {title}\n </h4>\n {children}\n </div>\n );\n}\n\nfunction ParamTable({\n title,\n params,\n}: {\n title: string;\n params: NonNullable<ApiEndpoint['parameters']>;\n}) {\n return (\n <Subsection title={title}>\n <div className=\"divide-y border rounded-md overflow-hidden\">\n {params.map((p) => (\n <div key={p.name} className=\"px-3 py-2.5 bg-background space-y-1\">\n <div className=\"flex items-baseline gap-2 flex-wrap\">\n <code className=\"font-mono text-xs font-medium text-foreground\">\n {p.name}\n </code>\n {p.required && (\n <span\n title=\"Required\"\n className=\"text-[9px] text-destructive font-bold leading-none\"\n >\n *\n </span>\n )}\n <code className=\"font-mono text-[11px] text-muted-foreground/70\">\n {p.type}\n </code>\n </div>\n {p.description ? (\n <p className=\"text-xs text-muted-foreground leading-relaxed break-words\">\n {p.description}\n </p>\n ) : null}\n </div>\n ))}\n </div>\n </Subsection>\n );\n}\n\nfunction StatusTag({ code }: { code: string }) {\n const numeric = Number.parseInt(code, 10);\n const cls = !Number.isFinite(numeric)\n ? 'bg-muted text-muted-foreground border-border'\n : numeric >= 500\n ? 'bg-red-500/10 text-red-600 dark:text-red-400 border-red-500/25'\n : numeric >= 400\n ? 'bg-amber-500/10 text-amber-600 dark:text-amber-400 border-amber-500/25'\n : numeric >= 300\n ? 'bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/25'\n : 'bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-500/25';\n return (\n <span className={cn(\n 'inline-flex items-center justify-center rounded border px-2 py-0.5 font-mono text-[11px] font-bold leading-none shrink-0 tabular-nums',\n cls,\n )}>\n {code}\n </span>\n );\n}\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useRef } from 'react';\n\nimport type { ApiEndpoint, LoadedSchemaEntry, OpenApiInfo, OpenApiSchema } from '../../types';\nimport {\n getScrollParent,\n getScrollTop,\n getTargetTop,\n getViewportHeight,\n scrollTargetTo,\n type ScrollTarget,\n} from '../../utils/scrollParent';\nimport { deduplicateEndpoints } from '../../utils/versionManager';\nimport { ApiIntroSection } from './ApiIntroSection';\nimport { EndpointDoc } from './EndpointDoc';\nimport { SchemaCopyMenu } from './SchemaCopyMenu';\n\nexport interface DocsViewHandle {\n scrollToAnchor: (anchor: string) => void;\n}\n\n// ─── Props ───────────────────────────────────────────────────────────────────\n\ninterface SelectorProps {\n grouping?: 'selector';\n info: OpenApiInfo | null;\n rawSchema: OpenApiSchema | null;\n resolvedBaseUrl?: string;\n endpoints: ApiEndpoint[];\n selectedVersion: string;\n loadedEndpoint: ApiEndpoint | null;\n onTryEndpoint: (ep: ApiEndpoint) => void;\n onActiveChange: (anchor: string | null, schemaId: string | null) => void;\n}\n\ninterface SectionsProps {\n grouping: 'sections';\n /** Per-schema data (info + endpoints). Rendered in order. */\n schemasData: LoadedSchemaEntry[];\n selectedVersion: string;\n loadedEndpoint: ApiEndpoint | null;\n onTryEndpoint: (ep: ApiEndpoint) => void;\n onActiveChange: (anchor: string | null, schemaId: string | null) => void;\n}\n\ntype DocsViewProps = SelectorProps | SectionsProps;\n\n// ─── View-model types ────────────────────────────────────────────────────────\n\ninterface EndpointRow {\n key: string;\n endpoint: ApiEndpoint;\n isLoaded: boolean;\n schemaId: string | null;\n}\n\ntype SectionState =\n | { kind: 'ready'; rows: EndpointRow[] }\n | { kind: 'loading' }\n | { kind: 'error'; message: string }\n | { kind: 'empty' };\n\ninterface SchemaSectionVM {\n schemaId: string;\n title: string;\n version: string | null;\n description: string | null;\n state: SectionState;\n /** Copy-for-AI payload. ``null`` when the section is still loading\n * or failed — the dropdown stays disabled. */\n rawSchema: OpenApiSchema | null;\n baseUrl: string | undefined;\n allEndpoints: ApiEndpoint[];\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/** Pixel offset from the top of the scroll container where the viewer\n * should \"park\" sections. Reads ``--navbar-height`` for back-compat\n * with pages that already set it; defaults to ``0`` for embedded /\n * no-navbar setups (the common case when hosted in a shell). */\nconst readNavbarOffset = () => {\n if (typeof document === 'undefined') return 0;\n const raw = getComputedStyle(document.documentElement).getPropertyValue('--navbar-height');\n const parsed = parseInt(raw || '', 10);\n return Number.isFinite(parsed) ? parsed : 0;\n};\n\nconst isSameEndpoint = (a: ApiEndpoint | null, b: ApiEndpoint) =>\n a !== null && a.method === b.method && a.path === b.path;\n\nfunction buildEndpointRow(\n ep: ApiEndpoint,\n loadedEndpoint: ApiEndpoint | null,\n schemaId: string | null,\n): EndpointRow {\n const keySchema = schemaId ? `${schemaId}-` : '';\n return {\n key: `${keySchema}${ep.method}-${ep.path}`,\n endpoint: ep,\n isLoaded: isSameEndpoint(loadedEndpoint, ep),\n schemaId,\n };\n}\n\nfunction buildSchemaSectionVM(\n entry: LoadedSchemaEntry,\n selectedVersion: string,\n loadedEndpoint: ApiEndpoint | null,\n): SchemaSectionVM {\n const title = entry.info?.title ?? entry.source.name;\n const version = entry.info?.version ?? null;\n const description = entry.info?.description ?? null;\n\n let state: SectionState;\n if (entry.loading) {\n state = { kind: 'loading' };\n } else if (entry.error) {\n state = { kind: 'error', message: entry.error };\n } else {\n const visible = deduplicateEndpoints(entry.endpoints, selectedVersion);\n state = visible.length === 0\n ? { kind: 'empty' }\n : {\n kind: 'ready',\n rows: visible.map((ep) => buildEndpointRow(ep, loadedEndpoint, entry.source.id)),\n };\n }\n\n return {\n schemaId: entry.source.id,\n title,\n version,\n description,\n state,\n rawSchema: entry.rawSchema,\n baseUrl: entry.resolvedBaseUrl,\n allEndpoints: entry.endpoints,\n };\n}\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\nexport const DocsView = React.forwardRef<DocsViewHandle, DocsViewProps>(function DocsView(\n props,\n ref,\n) {\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const scrollTargetRef = useRef<ScrollTarget | null>(null);\n const { onActiveChange } = props;\n\n // Resolve the real scroll container once the ref is attached. In\n // standalone pages that's ``window``; inside an ``overflow-auto``\n // shell (dev playground, modal) it's the wrapping DIV.\n const ensureScrollTarget = useCallback((): ScrollTarget | null => {\n if (scrollTargetRef.current) return scrollTargetRef.current;\n if (!scrollRef.current) return null;\n scrollTargetRef.current = getScrollParent(scrollRef.current);\n return scrollTargetRef.current;\n }, []);\n\n // Scroll a given section into view. Works against whichever ancestor\n // actually scrolls — window for standalone, the overflow-auto parent\n // for embedded layouts — so callers don't need to know the difference.\n const scrollToAnchor = useCallback(\n (anchor: string) => {\n const root = scrollRef.current;\n if (!root) return;\n const el = root.querySelector<HTMLElement>(`[data-endpoint-anchor=\"${anchor}\"]`);\n if (!el) return;\n const target = ensureScrollTarget();\n if (!target) return;\n const navbar = readNavbarOffset();\n const top =\n el.getBoundingClientRect().top -\n getTargetTop(target) +\n getScrollTop(target) -\n navbar -\n 8;\n scrollTargetTo(target, top);\n },\n [ensureScrollTarget],\n );\n\n React.useImperativeHandle(ref, () => ({ scrollToAnchor }), [scrollToAnchor]);\n\n // Scrollspy: pick the topmost endpoint section whose top is near the\n // upper quarter of the viewport. Listens on the real scroll container\n // (see ``ensureScrollTarget``) because ``scroll`` events on a nested\n // overflow:auto element do NOT bubble up to window.\n useEffect(() => {\n const root = scrollRef.current;\n if (!root) return;\n const target = ensureScrollTarget();\n if (!target) return;\n\n let rafId = 0;\n let lastActive: string | null = null;\n\n const compute = () => {\n rafId = 0;\n const sections = root.querySelectorAll<HTMLElement>('[data-endpoint-anchor]');\n if (sections.length === 0) return;\n const navbar = readNavbarOffset();\n const viewportTop = getTargetTop(target);\n const threshold = viewportTop + navbar + getViewportHeight(target) * 0.25;\n let active: HTMLElement | null = null;\n for (const s of Array.from(sections)) {\n const top = s.getBoundingClientRect().top;\n if (top <= threshold) {\n active = s;\n } else {\n break;\n }\n }\n const anchor = active?.dataset.endpointAnchor ?? null;\n if (anchor !== lastActive) {\n lastActive = anchor;\n onActiveChange(anchor, active?.dataset.schemaId || null);\n }\n };\n\n const onScroll = () => {\n if (rafId) return;\n rafId = requestAnimationFrame(compute);\n };\n\n compute();\n target.addEventListener('scroll', onScroll, { passive: true });\n // Resize always bubbles to window — listen there regardless of target.\n window.addEventListener('resize', onScroll, { passive: true });\n return () => {\n target.removeEventListener('scroll', onScroll);\n window.removeEventListener('resize', onScroll);\n if (rafId) cancelAnimationFrame(rafId);\n };\n }, [onActiveChange, ensureScrollTarget, props]);\n\n if (props.grouping === 'sections') {\n return <SectionsBody scrollRef={scrollRef} {...props} />;\n }\n\n return <SelectorBody scrollRef={scrollRef} {...props} />;\n});\n\n// ─── Selector body (single active schema) ────────────────────────────────────\n\nfunction SelectorBody({\n scrollRef,\n info,\n rawSchema,\n resolvedBaseUrl,\n endpoints,\n selectedVersion,\n loadedEndpoint,\n onTryEndpoint,\n}: SelectorProps & { scrollRef: React.RefObject<HTMLDivElement | null> }) {\n const visibleEndpoints = useMemo(\n () => deduplicateEndpoints(endpoints, selectedVersion),\n [endpoints, selectedVersion],\n );\n\n const rows = useMemo<EndpointRow[]>(\n () => visibleEndpoints.map((ep) => buildEndpointRow(ep, loadedEndpoint, ep.schemaId ?? null)),\n [visibleEndpoints, loadedEndpoint],\n );\n\n const isEmpty = rows.length === 0;\n\n return (\n <div ref={scrollRef}>\n <div className=\"mx-auto w-full max-w-[860px] px-6 md:px-10 lg:px-14 py-12\">\n {info && (\n <ApiIntroSection\n info={info}\n schema={rawSchema}\n endpoints={visibleEndpoints}\n resolvedBaseUrl={resolvedBaseUrl}\n />\n )}\n {isEmpty ? (\n <div className=\"py-16 text-center text-sm text-muted-foreground\">\n No endpoints to display.\n </div>\n ) : (\n <div className=\"divide-y divide-border/60\">\n {rows.map((row) => (\n <EndpointDoc\n key={row.key}\n endpoint={row.endpoint}\n isLoadedInPlayground={row.isLoaded}\n onTryIt={() => onTryEndpoint(row.endpoint)}\n schemaId={row.schemaId}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ─── Sections body (all schemas concatenated) ────────────────────────────────\n\nfunction SectionsBody({\n scrollRef,\n schemasData,\n selectedVersion,\n loadedEndpoint,\n onTryEndpoint,\n}: SectionsProps & { scrollRef: React.RefObject<HTMLDivElement | null> }) {\n const sections = useMemo<SchemaSectionVM[]>(\n () => schemasData.map((e) => buildSchemaSectionVM(e, selectedVersion, loadedEndpoint)),\n [schemasData, selectedVersion, loadedEndpoint],\n );\n\n return (\n <div ref={scrollRef}>\n <div className=\"mx-auto w-full max-w-[860px] px-6 md:px-10 lg:px-14 py-12 space-y-16\">\n {sections.map((section) => (\n <SchemaSectionView key={section.schemaId} section={section} onTryEndpoint={onTryEndpoint} />\n ))}\n </div>\n </div>\n );\n}\n\nconst SchemaSectionView = React.memo(function SchemaSectionView({\n section,\n onTryEndpoint,\n}: {\n section: SchemaSectionVM;\n onTryEndpoint: (ep: ApiEndpoint) => void;\n}) {\n const canCopy = section.rawSchema !== null && section.allEndpoints.length > 0;\n return (\n <section data-schema-anchor={section.schemaId} className=\"scroll-mt-20\">\n <header className=\"mb-8 pb-4 border-b\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"flex items-baseline gap-3 min-w-0\">\n <h2 className=\"text-2xl font-semibold tracking-tight\">{section.title}</h2>\n {section.version && (\n <span className=\"font-mono text-xs text-muted-foreground/70\">\n v{section.version}\n </span>\n )}\n </div>\n {canCopy && (\n <SchemaCopyMenu\n schema={section.rawSchema}\n endpoints={section.allEndpoints}\n baseUrl={section.baseUrl}\n />\n )}\n </div>\n {section.description && (\n <p className=\"mt-2 text-sm text-muted-foreground whitespace-pre-wrap\">\n {section.description}\n </p>\n )}\n </header>\n <SchemaSectionStateView section={section} onTryEndpoint={onTryEndpoint} />\n </section>\n );\n});\n\nfunction SchemaSectionStateView({\n section,\n onTryEndpoint,\n}: {\n section: SchemaSectionVM;\n onTryEndpoint: (ep: ApiEndpoint) => void;\n}) {\n switch (section.state.kind) {\n case 'loading':\n return (\n <div className=\"py-8 text-center text-sm text-muted-foreground\">\n Loading {section.title}…\n </div>\n );\n case 'error':\n return (\n <div className=\"py-8 text-center text-sm text-destructive\">\n Failed to load {section.title}: {section.state.message}\n </div>\n );\n case 'empty':\n return (\n <div className=\"py-8 text-center text-sm text-muted-foreground\">\n No endpoints in this schema.\n </div>\n );\n case 'ready':\n return (\n <div className=\"divide-y divide-border/60\">\n {section.state.rows.map((row) => (\n <EndpointDoc\n key={row.key}\n endpoint={row.endpoint}\n isLoadedInPlayground={row.isLoaded}\n onTryIt={() => onTryEndpoint(row.endpoint)}\n schemaId={row.schemaId}\n />\n ))}\n </div>\n );\n }\n}\n","'use client';\n\n/**\n * Form-based request body editor driven by JSON Schema.\n *\n * Replaces the ``{\"key\":\"value\"}`` textarea prompt with a real form:\n * one input per property, typed widgets for primitives, nested objects\n * indented, arrays with add/remove. The component is controlled — the\n * parent owns the body value (as any JSON) and persists to localStorage.\n *\n * Intentionally not a full JSON-Schema-Form: we don't cover oneOf/anyOf,\n * pattern validation, min/max — the playground just needs a usable\n * interactive shape. Users who hit a corner case can flip the ``JSON``\n * toggle in RequestPanel and edit raw.\n */\n\nimport { Minus, Plus } from 'lucide-react';\nimport React, { useCallback } from 'react';\n\nimport { Combobox, Input, Switch, Textarea } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { SectionLabel } from './ui';\n\ntype JsonSchemaNode = Record<string, unknown> & {\n type?: string;\n properties?: Record<string, JsonSchemaNode>;\n required?: string[];\n items?: JsonSchemaNode;\n enum?: unknown[];\n description?: string;\n format?: string;\n};\n\nconst MAX_DEPTH = 6;\n\n// ─── Value helpers ────────────────────────────────────────────────────────────\n\nfunction defaultForSchema(schema: JsonSchemaNode | undefined): unknown {\n if (!schema) return null;\n if (Array.isArray(schema.enum) && schema.enum.length > 0) return schema.enum[0];\n switch (schema.type) {\n case 'object': {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(schema.properties ?? {})) {\n out[k] = defaultForSchema(v);\n }\n return out;\n }\n case 'array':\n return [];\n case 'integer':\n case 'number':\n return 0;\n case 'boolean':\n return false;\n case 'string':\n return '';\n default:\n if (schema.properties) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(schema.properties)) {\n out[k] = defaultForSchema(v);\n }\n return out;\n }\n return '';\n }\n}\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\n\nexport interface BodyFormEditorProps {\n schema: JsonSchemaNode;\n value: unknown;\n onChange: (next: unknown) => void;\n}\n\nexport function BodyFormEditor({ schema, value, onChange }: BodyFormEditorProps) {\n return (\n <SchemaField\n schema={schema}\n value={value}\n onChange={onChange}\n depth={0}\n required={false}\n />\n );\n}\n\n// ─── Recursive renderer ───────────────────────────────────────────────────────\n\ninterface SchemaFieldProps {\n schema: JsonSchemaNode;\n value: unknown;\n onChange: (next: unknown) => void;\n depth: number;\n required: boolean;\n label?: string;\n}\n\nfunction SchemaField({ schema, value, onChange, depth, required, label }: SchemaFieldProps) {\n // Depth cutoff: collapse further nesting into a raw JSON textarea —\n // deeper forms get impossible to navigate and lose value for the UX\n // we're trying to offer (quick exploration).\n if (depth > MAX_DEPTH) {\n return <RawJsonField label={label} value={value} onChange={onChange} />;\n }\n\n if (Array.isArray(schema.enum) && schema.enum.length > 0) {\n return <EnumField schema={schema} value={value} onChange={onChange} label={label} required={required} />;\n }\n\n switch (schema.type) {\n case 'object':\n return <ObjectField schema={schema} value={value} onChange={onChange} depth={depth} label={label} />;\n case 'array':\n return <ArrayField schema={schema} value={value} onChange={onChange} depth={depth} label={label} required={required} />;\n case 'boolean':\n return <BooleanField value={value} onChange={onChange} label={label} schema={schema} required={required} />;\n case 'integer':\n case 'number':\n return <NumberField value={value} onChange={onChange} label={label} schema={schema} required={required} />;\n case 'string':\n default:\n // Untyped / string-ish — plain text input. Covers the\n // \"body is a free-form string\" case too (e.g. text/plain).\n if (!schema.type && schema.properties) {\n return <ObjectField schema={schema} value={value} onChange={onChange} depth={depth} label={label} />;\n }\n return <StringField value={value} onChange={onChange} label={label} schema={schema} required={required} />;\n }\n}\n\n// ─── Primitive widgets ────────────────────────────────────────────────────────\n\nfunction FieldHeader({\n label,\n type,\n required,\n description,\n}: {\n label?: string;\n type: string;\n required: boolean;\n description?: string;\n}) {\n if (!label) return null;\n return (\n <div className=\"space-y-0.5\">\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"font-mono text-[11px] text-foreground/80\">{label}</span>\n {required && <span className=\"text-[9px] text-destructive font-bold leading-none\">*</span>}\n <span className=\"font-mono text-[10px] text-muted-foreground/50\">{type}</span>\n </div>\n {description && (\n <p className=\"text-[10px] text-muted-foreground/70 leading-snug\">{description}</p>\n )}\n </div>\n );\n}\n\nfunction StringField({\n value, onChange, label, schema, required,\n}: {\n value: unknown;\n onChange: (next: string) => void;\n label?: string;\n schema: JsonSchemaNode;\n required: boolean;\n}) {\n const stringValue = typeof value === 'string' ? value : value == null ? '' : String(value);\n const placeholder = schema.format ? `${schema.type ?? 'string'} (${schema.format})` : schema.description || schema.type || 'string';\n return (\n <div className=\"space-y-1\">\n <FieldHeader label={label} type={schema.format ? `string (${schema.format})` : 'string'} required={required} description={schema.description} />\n <Input\n value={stringValue}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n className=\"h-8 text-xs font-mono\"\n />\n </div>\n );\n}\n\nfunction NumberField({\n value, onChange, label, schema, required,\n}: {\n value: unknown;\n onChange: (next: number | null) => void;\n label?: string;\n schema: JsonSchemaNode;\n required: boolean;\n}) {\n const raw = value == null ? '' : String(value);\n const type = schema.type === 'integer' ? 'integer' : 'number';\n return (\n <div className=\"space-y-1\">\n <FieldHeader label={label} type={schema.format ? `${type} (${schema.format})` : type} required={required} description={schema.description} />\n <Input\n type=\"number\"\n value={raw}\n onChange={(e) => {\n const v = e.target.value;\n if (v === '') return onChange(null);\n const n = schema.type === 'integer' ? parseInt(v, 10) : parseFloat(v);\n onChange(Number.isNaN(n) ? null : n);\n }}\n placeholder={type}\n className=\"h-8 text-xs font-mono\"\n />\n </div>\n );\n}\n\nfunction BooleanField({\n value, onChange, label, schema, required,\n}: {\n value: unknown;\n onChange: (next: boolean) => void;\n label?: string;\n schema: JsonSchemaNode;\n required: boolean;\n}) {\n const bool = value === true;\n return (\n <div className=\"flex items-start justify-between gap-3\">\n <FieldHeader label={label} type=\"boolean\" required={required} description={schema.description} />\n <Switch checked={bool} onCheckedChange={onChange} className=\"mt-0.5 shrink-0\" />\n </div>\n );\n}\n\nfunction EnumField({\n schema, value, onChange, label, required,\n}: {\n schema: JsonSchemaNode;\n value: unknown;\n onChange: (next: unknown) => void;\n label?: string;\n required: boolean;\n}) {\n const options = (schema.enum ?? []).map((v) => ({\n value: String(v),\n label: String(v),\n }));\n const strValue = value == null ? '' : String(value);\n return (\n <div className=\"space-y-1\">\n <FieldHeader label={label} type={`${schema.type ?? 'enum'} enum`} required={required} description={schema.description} />\n <Combobox\n options={options}\n value={strValue}\n onValueChange={(v) => {\n // Preserve original type if schema declares integer/number.\n if (schema.type === 'integer') onChange(parseInt(v, 10));\n else if (schema.type === 'number') onChange(parseFloat(v));\n else onChange(v);\n }}\n placeholder=\"Select…\"\n searchPlaceholder=\"Search…\"\n className=\"h-8 text-xs\"\n />\n </div>\n );\n}\n\nfunction RawJsonField({\n label, value, onChange,\n}: {\n label?: string;\n value: unknown;\n onChange: (next: unknown) => void;\n}) {\n const [text, setText] = React.useState(() => JSON.stringify(value ?? null, null, 2));\n // Resync when value changes from outside (e.g. endpoint switch).\n React.useEffect(() => {\n setText(JSON.stringify(value ?? null, null, 2));\n }, [value]);\n return (\n <div className=\"space-y-1\">\n {label && <SectionLabel>{label} (raw)</SectionLabel>}\n <Textarea\n value={text}\n onChange={(e) => {\n setText(e.target.value);\n try { onChange(JSON.parse(e.target.value)); } catch { /* keep last valid */ }\n }}\n className=\"font-mono text-[11px] min-h-[80px]\"\n rows={4}\n />\n </div>\n );\n}\n\n// ─── Composite widgets ────────────────────────────────────────────────────────\n\nfunction ObjectField({\n schema, value, onChange, depth, label,\n}: {\n schema: JsonSchemaNode;\n value: unknown;\n onChange: (next: Record<string, unknown>) => void;\n depth: number;\n label?: string;\n}) {\n const obj = (value && typeof value === 'object' && !Array.isArray(value))\n ? (value as Record<string, unknown>)\n : {};\n const required = new Set(schema.required ?? []);\n const entries = Object.entries(schema.properties ?? {});\n\n const setKey = useCallback(\n (key: string) => (next: unknown) => {\n onChange({ ...obj, [key]: next });\n },\n [obj, onChange],\n );\n\n if (entries.length === 0) {\n return <RawJsonField label={label} value={obj} onChange={onChange as (v: unknown) => void} />;\n }\n\n // Root-level object (depth === 0) renders flat; nested gets an\n // indented, bordered group so the hierarchy is visible.\n const wrapperClass = depth === 0\n ? 'space-y-3'\n : 'space-y-2 border-l-2 border-border/60 pl-3 ml-px';\n\n return (\n <div className=\"space-y-1.5\">\n {label && depth > 0 && (\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"font-mono text-[11px] text-foreground/80\">{label}</span>\n <span className=\"font-mono text-[10px] text-muted-foreground/50\">object</span>\n </div>\n )}\n <div className={cn(wrapperClass)}>\n {entries.map(([key, subSchema]) => (\n <SchemaField\n key={key}\n schema={subSchema}\n value={obj[key]}\n onChange={setKey(key)}\n depth={depth + 1}\n required={required.has(key)}\n label={key}\n />\n ))}\n </div>\n </div>\n );\n}\n\nfunction ArrayField({\n schema, value, onChange, depth, label, required,\n}: {\n schema: JsonSchemaNode;\n value: unknown;\n onChange: (next: unknown[]) => void;\n depth: number;\n label?: string;\n required: boolean;\n}) {\n const arr = Array.isArray(value) ? value : [];\n const items = schema.items ?? { type: 'string' };\n\n const addItem = () => onChange([...arr, defaultForSchema(items)]);\n const removeAt = (i: number) => onChange(arr.filter((_, idx) => idx !== i));\n const setAt = (i: number) => (next: unknown) =>\n onChange(arr.map((v, idx) => (idx === i ? next : v)));\n\n return (\n <div className=\"space-y-1.5\">\n {label && (\n <div className=\"flex items-baseline gap-1.5\">\n <span className=\"font-mono text-[11px] text-foreground/80\">{label}</span>\n {required && <span className=\"text-[9px] text-destructive font-bold leading-none\">*</span>}\n <span className=\"font-mono text-[10px] text-muted-foreground/50\">\n {`array<${items.type ?? 'any'}>`}\n </span>\n </div>\n )}\n <div className=\"space-y-2 border-l-2 border-border/60 pl-3 ml-px\">\n {arr.length === 0 && (\n <p className=\"text-[10px] text-muted-foreground/50 italic\">Empty array</p>\n )}\n {arr.map((v, i) => (\n <div key={i} className=\"flex items-start gap-2\">\n <div className=\"flex-1 min-w-0\">\n <SchemaField\n schema={items}\n value={v}\n onChange={setAt(i)}\n depth={depth + 1}\n required={false}\n label={`${label ?? ''}[${i}]`}\n />\n </div>\n <button\n type=\"button\"\n onClick={() => removeAt(i)}\n title=\"Remove item\"\n className=\"shrink-0 h-7 w-7 inline-flex items-center justify-center rounded-md text-muted-foreground hover:text-destructive hover:bg-destructive/10 transition-colors\"\n >\n <Minus className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={addItem}\n className=\"inline-flex items-center gap-1.5 text-[10px] text-muted-foreground hover:text-foreground transition-colors py-1\"\n >\n <Plus className=\"h-3 w-3\" />\n Add item\n </button>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { RotateCcw } from 'lucide-react';\nimport React, { useCallback } from 'react';\n\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { useEndpointDraft } from '../../hooks/useEndpointDraft';\n\n/**\n * \"Reset\" ghost button for the current endpoint's draft.\n *\n * Wipes both the in-memory context state (parameters + body) and the\n * persisted localStorage entry. We call reset() *after* clearing the\n * context so the EndpointDraftSync effect that mirrors state → storage\n * doesn't immediately re-create a now-empty draft with an empty object\n * (benign, but uglier in storage).\n */\nexport function EndpointResetButton() {\n const { state, setParameters, setRequestBody } = usePlaygroundContext();\n const ep = state.selectedEndpoint;\n const { reset } = useEndpointDraft(state.activeSchemaId, ep);\n\n const hasDraft =\n Object.keys(state.parameters).length > 0 || state.requestBody.length > 0;\n\n const onClick = useCallback(() => {\n setParameters({});\n setRequestBody('');\n reset();\n }, [setParameters, setRequestBody, reset]);\n\n if (!ep || !hasDraft) return null;\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title=\"Reset parameters & body (keeps auth)\"\n className={cn(\n 'inline-flex items-center gap-1 text-[10px] text-muted-foreground',\n 'hover:text-foreground transition-colors',\n )}\n >\n <RotateCcw className=\"h-2.5 w-2.5\" />\n Reset\n </button>\n );\n}\n","'use client';\n\nimport { Key, Send, Sparkles, Terminal } from 'lucide-react';\nimport React, { useCallback, useMemo } from 'react';\n\nimport {\n Combobox,\n type ComboboxOption,\n Input,\n Textarea,\n} from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport PrettyCode from '../../../PrettyCode';\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { findApiKeyById, isValidJson, parseRequestHeaders } from '../../utils';\nimport { resolveAbsolute } from '../../utils/url';\nimport { BodyFormEditor } from './BodyFormEditor';\nimport { EndpointResetButton } from './EndpointResetButton';\nimport {\n CollapsibleSection,\n EmptyState,\n ScrollArea,\n SectionLabel,\n relativePath,\n} from './ui';\n\n// ─── Param fields ─────────────────────────────────────────────────────────────\n\ntype Param = { name: string; type: string; required: boolean; description?: string };\n\nfunction ParamFields({ label, params }: { label: string; params: Param[] }) {\n const { state, setParameters } = usePlaygroundContext();\n\n function handleChange(name: string, value: string) {\n setParameters({ ...state.parameters, [name]: value });\n }\n\n return (\n <div className=\"space-y-2\">\n <SectionLabel>{label}</SectionLabel>\n <div className=\"space-y-2\">\n {params.map((p) => {\n const value = state.parameters[p.name] ?? '';\n const placeholder = p.description || p.name;\n return (\n <div key={p.name} className=\"space-y-1\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"font-mono text-[11px] text-foreground/80\">{p.name}</span>\n {p.required && (\n <span className=\"text-[9px] text-destructive font-bold leading-none\">*</span>\n )}\n <span className=\"font-mono text-[10px] text-muted-foreground/50\">{p.type}</span>\n </div>\n <Input\n value={value}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) =>\n handleChange(p.name, e.target.value)\n }\n placeholder={placeholder}\n className=\"h-8 text-xs font-mono\"\n />\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\n// ─── RequestPanel ─────────────────────────────────────────────────────────────\n\nexport function RequestPanel() {\n const {\n state,\n apiKeys,\n apiKeysLoading,\n setRequestBody,\n setRequestHeaders,\n setSelectedApiKey,\n setManualApiToken,\n sendRequest,\n } = usePlaygroundContext();\n\n // Pre-compute every per-key view-model so the JSX stays a flat\n // render — no boolean math in the markup.\n const apiKeyOptions: ComboboxOption[] = useMemo(\n () =>\n apiKeys.map((k) => ({\n value: k.id,\n label: k.name || 'Unnamed key',\n // Surface the first 8 chars of the secret so the user\n // can tell two similarly-named keys apart at a glance.\n description: k.secret\n ? `${k.secret.slice(0, 8)}…`\n : undefined,\n })),\n [apiKeys],\n );\n const hasApiKeys = apiKeyOptions.length > 0;\n\n const ep = state.selectedEndpoint;\n\n // ── Data (hooks must not be conditional) ─────────────────────────────────\n const isJsonValid = state.requestBody ? isValidJson(state.requestBody) : true;\n\n const curlCommand = useMemo(() => {\n if (!state.requestUrl) return '';\n // Resolve to an absolute URL so the snippet is runnable from a\n // shell. The live ``fetch`` inside the playground resolves the\n // relative form itself via the browser; copy-pasting to curl\n // doesn't get that treatment.\n const absoluteUrl = resolveAbsolute(state.requestUrl);\n const apiKey = state.selectedApiKey ? findApiKeyById(apiKeys, state.selectedApiKey) : null;\n const hdrs = parseRequestHeaders(state.requestHeaders);\n if (apiKey) hdrs['X-API-Key'] = apiKey.secret || apiKey.id;\n let cmd = `curl -X ${state.requestMethod} \"${absoluteUrl}\"`;\n Object.entries(hdrs).forEach(([k, v]) => { cmd += ` \\\\\\n -H \"${k}: ${v}\"`; });\n if (state.requestBody && state.requestMethod !== 'GET' && isJsonValid) {\n cmd += ` \\\\\\n -d '${state.requestBody}'`;\n }\n return cmd;\n }, [state, apiKeys, isJsonValid]);\n\n const pathParams = useMemo(\n () => ep?.parameters?.filter((p) => ep.path.includes(`{${p.name}}`)) ?? [],\n [ep],\n );\n const queryParams = useMemo(\n () => ep?.parameters?.filter((p) => !ep.path.includes(`{${p.name}}`)) ?? [],\n [ep],\n );\n\n // ── Derived ───────────────────────────────────────────────────────────────\n const isSendDisabled = state.loading || !state.requestUrl || !isJsonValid;\n // Show the absolute URL in the meta row so the user sees exactly\n // what will go over the wire — same rewrite we do for cURL.\n const displayUrl = resolveAbsolute(state.requestUrl || ep?.path || '');\n const hasBody = ep?.method !== 'GET';\n const bodyType = ep?.requestBody?.type ?? '';\n const hasPathParams = pathParams.length > 0;\n const hasQueryParams = queryParams.length > 0;\n const hasCurl = Boolean(curlCommand);\n const epPath = ep ? relativePath(ep.path) : '';\n // Show the URL meta row only when it differs from the endpoint's\n // template shape — i.e. the user has substituted path params or the\n // URL host is worth showing explicitly.\n const urlChanged = displayUrl !== '' && displayUrl !== epPath;\n\n // ── Early return ──────────────────────────────────────────────────────────\n if (!ep) {\n return <EmptyState icon={Send} text=\"Select an endpoint to build a request\" />;\n }\n\n // ── Render ────────────────────────────────────────────────────────────────\n return (\n <>\n {/* Inline meta row — shows the effective URL when it differs\n from the endpoint's path template (e.g. after substituting\n path parameters), plus the Reset action. We dropped the\n full endpoint header because the containing surface (SidePanel\n in docs layout, column header in classic layout) already\n shows the method + path, and duplicating the Send button\n next to a full-width Send at the bottom read as confusing. */}\n {(urlChanged || ep) && (\n <div className=\"shrink-0 border-b px-4 py-2 bg-muted/10 flex items-center gap-2 min-h-[28px]\">\n {urlChanged ? (\n <span className=\"font-mono text-[10px] text-muted-foreground/60 break-all leading-snug truncate min-w-0 flex-1\">\n {displayUrl}\n </span>\n ) : (\n <span className=\"flex-1\" />\n )}\n <EndpointResetButton />\n </div>\n )}\n\n {/* Scrollable fields */}\n <ScrollArea className=\"px-4 py-3 space-y-3\">\n\n {hasPathParams && <ParamFields label=\"Path Parameters\" params={pathParams} />}\n {hasQueryParams && <ParamFields label=\"Query Parameters\" params={queryParams} />}\n\n {/* Body */}\n {hasBody && (\n <BodySection\n schema={ep.requestBody?.schema}\n bodyType={bodyType}\n bodyDescription={ep.requestBody?.description}\n value={state.requestBody}\n onChange={setRequestBody}\n isJsonValid={isJsonValid}\n />\n )}\n\n {/* Auth & Headers — collapsed by default */}\n <CollapsibleSection\n label={\n <span className=\"inline-flex items-center gap-1\">\n <Key className=\"h-2.5 w-2.5\" />\n Auth &amp; Headers\n </span>\n }\n >\n <div className=\"space-y-3 pt-2\">\n <div className=\"space-y-1.5\">\n <SectionLabel>API Key</SectionLabel>\n <Combobox\n options={apiKeyOptions}\n value={state.selectedApiKey ?? ''}\n onValueChange={(v) => setSelectedApiKey(v || null)}\n placeholder={\n apiKeysLoading\n ? 'Loading keys…'\n : hasApiKeys\n ? 'Select an API key'\n : 'No API keys yet'\n }\n searchPlaceholder=\"Search keys…\"\n emptyText=\"No matching key\"\n disabled={apiKeysLoading || !hasApiKeys}\n className=\"h-8\"\n />\n <p className=\"text-[10px] text-muted-foreground\">\n Picks are sent via the{' '}\n <span className=\"font-mono\">X-API-Key</span> header.\n </p>\n </div>\n <div className=\"space-y-1.5\">\n <SectionLabel>Bearer Token</SectionLabel>\n <Input\n type=\"password\"\n placeholder=\"Leave empty to use JWT from localStorage\"\n value={state.manualApiToken}\n onChange={(e) => setManualApiToken(e.target.value)}\n className=\"font-mono text-xs h-8\"\n />\n </div>\n <div className=\"space-y-1.5\">\n <SectionLabel>Headers</SectionLabel>\n <Textarea\n value={state.requestHeaders}\n onChange={(e) => setRequestHeaders(e.target.value)}\n className=\"font-mono text-[11px] min-h-[60px] resize-y\"\n rows={3}\n />\n </div>\n </div>\n </CollapsibleSection>\n\n {/* cURL — collapsed by default. PrettyCode has its own\n hover-toolbar with Copy, so no duplicate action here. */}\n {hasCurl && (\n <CollapsibleSection\n label={\n <span className=\"inline-flex items-center gap-1\">\n <Terminal className=\"h-2.5 w-2.5\" />\n cURL\n </span>\n }\n >\n <div className=\"mt-2\">\n <PrettyCode\n data={curlCommand}\n language=\"bash\"\n isCompact\n maxLines={50}\n />\n </div>\n </CollapsibleSection>\n )}\n\n {/* Bottom breathing room — the Send footer lives outside\n this component (in SlideInPlayground / TryItSheet),\n so we just leave a little space so the last section\n doesn't crash against the container edge. */}\n <div className=\"h-4\" />\n </ScrollArea>\n </>\n );\n}\n\n// ─── Body section ─────────────────────────────────────────────────────────────\n\ninterface BodySectionProps {\n schema: Record<string, unknown> | undefined;\n bodyType: string;\n bodyDescription?: string;\n /** JSON-serialised body kept in context. Form edits are re-serialised\n * before being written back so one source of truth survives across\n * the two view modes. */\n value: string;\n onChange: (raw: string) => void;\n isJsonValid: boolean;\n}\n\ntype BodyViewMode = 'form' | 'json';\n\nfunction BodySection({ schema, bodyType, bodyDescription, value, onChange, isJsonValid }: BodySectionProps) {\n // Default to form view when we have a schema to drive it. Fall back\n // to raw JSON for schemaless endpoints (or binary bodies, etc.).\n const hasSchema = !!schema;\n const [mode, setMode] = React.useState<BodyViewMode>(hasSchema ? 'form' : 'json');\n\n // Parse the context's JSON string once per value change so the form\n // sees a structured object. Invalid JSON is tolerated — the form\n // simply shows empty fields until the user fixes it.\n const parsed = React.useMemo(() => {\n if (!value) return null;\n try { return JSON.parse(value); } catch { return null; }\n }, [value]);\n\n const handleFormChange = useCallback(\n (next: unknown) => {\n onChange(JSON.stringify(next, null, 2));\n },\n [onChange],\n );\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-2 flex-wrap\">\n <div className=\"flex items-baseline gap-2 min-w-0\">\n <SectionLabel>Body</SectionLabel>\n {bodyType && (\n <span className=\"text-[10px] text-muted-foreground/40 font-mono\">{bodyType}</span>\n )}\n {bodyDescription && (\n <span className=\"text-[10px] text-muted-foreground/60 truncate\">{bodyDescription}</span>\n )}\n </div>\n {hasSchema && (\n <div className=\"inline-flex rounded-md border overflow-hidden text-[10px]\">\n <ModeButton active={mode === 'form'} onClick={() => setMode('form')}>Form</ModeButton>\n <ModeButton active={mode === 'json'} onClick={() => setMode('json')}>JSON</ModeButton>\n </div>\n )}\n {mode === 'json' && isJsonValid && value && (\n <button\n type=\"button\"\n onClick={() => {\n try { onChange(JSON.stringify(JSON.parse(value), null, 2)); } catch { /* noop */ }\n }}\n className=\"inline-flex items-center gap-1 text-[10px] text-muted-foreground hover:text-foreground transition-colors\"\n >\n <Sparkles className=\"h-2.5 w-2.5\" />\n Format\n </button>\n )}\n </div>\n\n {mode === 'form' && hasSchema ? (\n <BodyFormEditor\n schema={schema as Record<string, unknown>}\n value={parsed}\n onChange={handleFormChange}\n />\n ) : (\n <>\n <Textarea\n placeholder={'{\\n \"key\": \"value\"\\n}'}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className={cn(\n 'font-mono text-[11px] min-h-[90px] resize-y',\n !isJsonValid && 'border-destructive focus-visible:ring-destructive/30',\n )}\n rows={4}\n />\n {!isJsonValid && <p className=\"text-[10px] text-destructive\">Invalid JSON</p>}\n </>\n )}\n </div>\n );\n}\n\nfunction ModeButton({\n active, onClick, children,\n}: {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n 'px-2 py-0.5 font-medium transition-colors',\n active\n ? 'bg-primary/10 text-foreground'\n : 'text-muted-foreground hover:text-foreground',\n )}\n >\n {children}\n </button>\n );\n}\n","'use client';\n\nimport { Loader2, Send, Terminal, WifiOff } from 'lucide-react';\nimport { useMemo } from 'react';\n\nimport { CopyButton } from '@djangocfg/ui-core/components';\n\nimport JsonTree from '../../../JsonTree';\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { EmptyState, ScrollArea, StatusBadge } from './ui';\n\n// ─── JsonTree config (static, no re-creation on render) ──────────────────────\n\nconst JSON_TREE_CONFIG = {\n maxAutoExpandDepth: 2,\n maxAutoExpandArrayItems: 10,\n maxAutoExpandObjectKeys: 5,\n maxStringLength: 200,\n collectionLimit: 50,\n showCollectionInfo: true,\n showExpandControls: true,\n showActionButtons: false,\n preserveKeyOrder: true,\n className: 'border-0 rounded-none',\n} as const;\n\n// ─── ResponsePanel ────────────────────────────────────────────────────────────\n\nexport function ResponsePanel() {\n const { state } = usePlaygroundContext();\n const { response, loading, selectedEndpoint } = state;\n\n // ── Normalise response data ───────────────────────────────────────────────\n // Always try to parse as JSON first so JsonTree gets an object, not a string.\n // Falls back to raw text for non-JSON responses (HTML errors, plain text, etc.)\n const { treeData, rawText } = useMemo(() => {\n const d = response?.data;\n if (d == null) return { treeData: null, rawText: '' };\n\n if (typeof d === 'string') {\n try {\n return { treeData: JSON.parse(d), rawText: d };\n } catch {\n return { treeData: null, rawText: d };\n }\n }\n\n return { treeData: d, rawText: JSON.stringify(d, null, 2) };\n }, [response?.data]);\n\n // ── Derived ───────────────────────────────────────────────────────────────\n const sizeKb = rawText ? `${(rawText.length / 1024).toFixed(1)} KB` : '';\n const duration = response?.duration != null ? `${response.duration}ms` : '';\n const hasError = Boolean(response?.error);\n const hasStatus = response?.status != null;\n const hasCopy = Boolean(rawText);\n\n // ── Early returns ─────────────────────────────────────────────────────────\n if (loading) {\n return (\n <div className=\"flex items-center justify-center h-full gap-2\">\n <Loader2 className=\"h-4 w-4 animate-spin text-muted-foreground\" />\n <span className=\"text-xs text-muted-foreground\">Sending…</span>\n </div>\n );\n }\n\n if (!selectedEndpoint) return <EmptyState icon={Terminal} text=\"Response will appear here\" />;\n if (!response) return <EmptyState icon={Send} text='Press \"Send Request\" to see the response' />;\n\n // Pure network error (no HTTP response at all — CORS, offline, timeout)\n if (hasError && !hasStatus) {\n return (\n <EmptyState\n icon={WifiOff}\n text={response.error!}\n className=\"text-destructive [&_svg]:text-destructive\"\n />\n );\n }\n\n // ── Render ────────────────────────────────────────────────────────────────\n return (\n <>\n {/* Status bar */}\n <div className=\"shrink-0 border-b px-4 py-2 flex items-center justify-between gap-3 bg-muted/20\">\n <div className=\"flex items-center gap-2 min-w-0\">\n {hasStatus && <StatusBadge status={response.status!} />}\n {response.statusText && (\n <span className=\"text-xs text-muted-foreground truncate\">{response.statusText}</span>\n )}\n {sizeKb && (\n <span className=\"text-[10px] text-muted-foreground/50 tabular-nums shrink-0\">{sizeKb}</span>\n )}\n {duration && (\n <span className=\"text-[10px] text-muted-foreground/50 tabular-nums shrink-0\">{duration}</span>\n )}\n </div>\n {hasCopy && (\n <CopyButton value={rawText} variant=\"ghost\" size=\"sm\" className=\"h-6 px-2 text-[10px] text-muted-foreground shrink-0\">\n Copy\n </CopyButton>\n )}\n </div>\n\n {/* HTTP-level error body (4xx/5xx — has status but also error flag) */}\n {hasError && (\n <div className=\"shrink-0 mx-4 mt-3 rounded border border-destructive/20 bg-destructive/5 px-3 py-2\">\n <p className=\"text-xs text-destructive\">{response.error}</p>\n </div>\n )}\n\n {/* Body */}\n <ScrollArea>\n {treeData != null ? (\n <JsonTree title=\"Response Body\" data={treeData} config={JSON_TREE_CONFIG} />\n ) : rawText ? (\n <pre className=\"p-4 text-[11px] font-mono text-foreground/70 whitespace-pre-wrap break-all leading-relaxed\">\n {rawText}\n </pre>\n ) : (\n <div className=\"py-10 text-center text-xs text-muted-foreground\">Empty response body</div>\n )}\n </ScrollArea>\n </>\n );\n}\n","'use client';\n\nimport { AlertCircle, Loader2, Send } from 'lucide-react';\nimport React, { useMemo } from 'react';\n\nimport { Button } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { isValidJson } from '../../utils';\nimport { UrlBuilder } from '../../utils/url';\n\ninterface SendButtonProps {\n className?: string;\n}\n\n/**\n * Standalone Send button that reads from and acts on the playground\n * context. Disabled + explainer-banner when required inputs are missing.\n *\n * Validation rules (in order — first failure wins the banner text):\n * 1. Required path/query parameters must be non-empty.\n * 2. Path template must be fully substituted (no leftover ``{name}``).\n * 3. Request body, when present, must be valid JSON.\n *\n * We validate on the client so the user isn't punished with a 404 from\n * the server for a trivially detectable mistake (e.g. empty ``{petId}``).\n */\nexport function SendButton({ className }: SendButtonProps) {\n const { state, sendRequest } = usePlaygroundContext();\n\n const ep = state.selectedEndpoint;\n\n // Single source of truth for URL-level validation lives in UrlBuilder.\n // Recomputing every render is cheap (pure string work).\n const builder = useMemo(\n () => (ep ? new UrlBuilder(ep, state.parameters) : null),\n [ep, state.parameters],\n );\n const missingRequired = builder?.missingRequired() ?? [];\n const unsubstituted = builder?.unfilledPlaceholders() ?? [];\n\n const isJsonValid = state.requestBody ? isValidJson(state.requestBody) : true;\n\n const blockers: string[] = [];\n if (missingRequired.length > 0) {\n blockers.push(\n `Fill required parameter${missingRequired.length > 1 ? 's' : ''}: ${missingRequired.join(', ')}`,\n );\n } else if (unsubstituted.length > 0) {\n blockers.push(`URL still has unfilled placeholder${unsubstituted.length > 1 ? 's' : ''}: ${unsubstituted.map((n) => `{${n}}`).join(', ')}`);\n }\n if (!isJsonValid) blockers.push('Request body is not valid JSON');\n\n const disabled =\n state.loading ||\n !state.requestUrl ||\n blockers.length > 0;\n\n const tooltip = blockers.length > 0 ? blockers.join('\\n') : undefined;\n\n return (\n <div className={cn('space-y-2', className)}>\n {blockers.length > 0 && (\n <div className=\"flex items-start gap-2 rounded-md border border-amber-500/25 bg-amber-500/[0.06] px-3 py-2 text-[11px] text-amber-600 dark:text-amber-400\">\n <AlertCircle className=\"h-3.5 w-3.5 shrink-0 mt-px\" />\n <span className=\"leading-snug\">{blockers[0]}</span>\n </div>\n )}\n <Button\n onClick={sendRequest}\n disabled={disabled}\n size=\"sm\"\n title={tooltip}\n className=\"w-full gap-2 h-9\"\n >\n {state.loading ? (\n <>\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n Sending…\n </>\n ) : (\n <>\n <Send className=\"h-3.5 w-3.5\" />\n Send Request\n </>\n )}\n </Button>\n </div>\n );\n}\n","'use client';\n\nimport React from 'react';\n\nimport { SidePanel } from '@djangocfg/ui-core/components';\nimport { cn } from '@djangocfg/ui-core/lib';\n\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { RequestPanel } from '../shared/RequestPanel';\nimport { ResponsePanel } from '../shared/ResponsePanel';\nimport { SendButton } from '../shared/SendButton';\nimport { MethodBadge, Panel, relativePath } from '../shared/ui';\n\ninterface SlideInPlaygroundProps {\n open: boolean;\n onClose: () => void;\n}\n\n// Width when only Request is visible vs. when Response is also rendered.\n// ``clamp(min, preferred, max)`` lets the panel scale with the viewport\n// instead of sitting at a fixed size that looks tiny on ultra-wide or\n// cramped on laptops.\n//\n// Narrow (Request only) — form content, no need to ever exceed ~480px.\n// 1280 viewport → 384 | 1440 → 432 | 1920 → 480 (cap) | 2560 → 480 (cap)\n//\n// Wide (Request + Response) — response can be huge JSON/HTML; give it room.\n// 1280 → 768 | 1440 → 864 | 1920 → 1152 | 2560 → 1280 (cap) | 3840 → 1280 (cap)\n//\n// Transition between the two values is animated by SidePanel.Content\n// (both ``transform`` and ``width`` listed there). clamp() interpolates\n// smoothly during that transition, no extra plumbing needed.\nconst WIDTH_NARROW = 'clamp(380px, 30vw, 480px)';\nconst WIDTH_WIDE = 'clamp(720px, 60vw, 1280px)';\n\n/**\n * Right-side slide-in playground. Two-column layout appears once the\n * user has a response in hand — before that, only the Request form is\n * shown and the panel stays narrow so docs have room to breathe.\n *\n * State transitions:\n * - no endpoint ⇒ panel not rendered\n * - endpoint, no resp ⇒ narrow (Request only)\n * - endpoint + loading ⇒ wide (Request + Response spinner)\n * - endpoint + resp ⇒ wide (Request + Response)\n *\n * Selecting a different endpoint clears ``response`` in the reducer,\n * so the panel smoothly collapses back to narrow.\n */\nexport function SlideInPlayground({ open, onClose }: SlideInPlaygroundProps) {\n const { state } = usePlaygroundContext();\n const ep = state.selectedEndpoint;\n const showResponse = state.response !== null || state.loading;\n const width = showResponse ? WIDTH_WIDE : WIDTH_NARROW;\n\n return (\n <SidePanel open={open} onOpenChange={(v) => !v && onClose()} side=\"right\">\n <SidePanel.Content width={width} className=\"max-w-[95vw]\">\n <SidePanel.Header>\n <SidePanel.Title>Playground</SidePanel.Title>\n {ep && (\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <MethodBadge method={ep.method} />\n <code className=\"font-mono text-[11px] text-muted-foreground truncate\">\n {relativePath(ep.path)}\n </code>\n </div>\n )}\n <SidePanel.Close className=\"ml-auto\" />\n </SidePanel.Header>\n\n {/* Body: 1 or 2 columns depending on whether we have a\n response to show. ``divide-x`` gives a 1px seam\n between the panes so they read as distinct surfaces. */}\n <SidePanel.Body\n className={cn(\n 'overflow-hidden grid divide-x transition-[grid-template-columns] duration-250',\n showResponse\n ? 'grid-cols-[minmax(0,1fr)_minmax(0,1fr)]'\n : 'grid-cols-1',\n )}\n >\n <Panel>\n <RequestPanel />\n </Panel>\n {showResponse && (\n <Panel>\n <ResponsePanel />\n </Panel>\n )}\n </SidePanel.Body>\n\n {ep && (\n <SidePanel.Footer className=\"px-4 py-3\">\n <SendButton />\n </SidePanel.Footer>\n )}\n </SidePanel.Content>\n </SidePanel>\n );\n}\n","'use client';\n\nimport React from 'react';\n\nimport {\n ResponsiveSheet,\n ResponsiveSheetContent,\n ResponsiveSheetHeader,\n ResponsiveSheetTitle,\n} from '@djangocfg/ui-core/components';\n\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport { RequestPanel } from '../shared/RequestPanel';\nimport { ResponsePanel } from '../shared/ResponsePanel';\nimport { SendButton } from '../shared/SendButton';\n\ninterface TryItSheetProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\n/**\n * Mobile/tablet fallback: the slide-in playground doesn't fit, so we\n * open Request + Response inside a ResponsiveSheet (bottom drawer on\n * mobile, side sheet on desktop). Response stays hidden until a\n * request has been sent — matching the desktop ``SlideInPlayground``\n * behaviour.\n */\nexport function TryItSheet({ open, onOpenChange }: TryItSheetProps) {\n const { state } = usePlaygroundContext();\n const showResponse = state.response !== null || state.loading;\n\n return (\n <ResponsiveSheet open={open} onOpenChange={onOpenChange}>\n <ResponsiveSheetContent className=\"sm:max-w-xl flex flex-col h-full p-0\">\n <ResponsiveSheetHeader className=\"px-4 py-3 border-b shrink-0\">\n <ResponsiveSheetTitle className=\"text-sm\">Playground</ResponsiveSheetTitle>\n </ResponsiveSheetHeader>\n <div className=\"flex-1 min-h-0 flex flex-col divide-y\">\n <div className={showResponse ? 'flex-1 min-h-0 flex flex-col' : 'flex-1 min-h-0 flex flex-col'}>\n <RequestPanel />\n </div>\n {showResponse && (\n <div className=\"flex-1 min-h-0 flex flex-col\">\n <ResponsePanel />\n </div>\n )}\n </div>\n {state.selectedEndpoint && (\n <div className=\"shrink-0 border-t px-4 py-3 bg-background/95 backdrop-blur-sm\">\n <SendButton />\n </div>\n )}\n </ResponsiveSheetContent>\n </ResponsiveSheet>\n );\n}\n","'use client';\n\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { keyBy } from 'lodash-es';\n\nimport { Skeleton, TooltipProvider } from '@djangocfg/ui-core/components';\nimport { useMediaQuery } from '@djangocfg/ui-core/hooks';\n\nimport useOpenApiSchema from '../../hooks/useOpenApiSchema';\nimport { useDocsUrlSync, type ParsedHash } from '../../hooks/useDocsUrlSync';\nimport { usePlaygroundContext } from '../../context/PlaygroundContext';\nimport type { ApiEndpoint } from '../../types';\nimport { EndpointDraftSync } from '../shared/EndpointDraftSync';\nimport { slugifySchemaId } from './anchor';\nimport { DocsSidebar } from './Sidebar';\nimport { DocsView, type DocsViewHandle } from './DocsView';\nimport { SlideInPlayground } from './SlideInPlayground';\nimport { TryItSheet } from './TryItSheet';\n\n// ─── Root ─────────────────────────────────────────────────────────────────────\n\nexport const DocsLayout: React.FC = () => {\n const { state, config, setSelectedEndpoint } = usePlaygroundContext();\n // The docs layout has a sidebar + docs column that already eat ~260px\n // before the slide-in opens. Below 1024px the slide-in (min 720 wide)\n // leaves docs with <250px — unreadable — so we fall back to the\n // mobile-style ``TryItSheet`` on those viewports.\n const isDesktop = useMediaQuery('(min-width: 1024px)');\n const isMobile = !isDesktop;\n\n const grouping = config.schemaGrouping ?? 'selector';\n const preloadAll = grouping === 'sections';\n const urlSyncEnabled =\n typeof config.urlSync === 'boolean' ? config.urlSync : Boolean(config.urlSync?.enabled);\n\n const {\n endpoints,\n schemaInfo,\n rawSchema,\n resolvedBaseUrl,\n loading,\n error,\n schemas,\n currentSchema,\n setCurrentSchema,\n schemasData,\n } = useOpenApiSchema({\n schemas: config.schemas,\n defaultSchemaId: config.defaultSchemaId,\n baseUrl: config.baseUrl,\n preloadAll,\n });\n\n const [activeAnchor, setActiveAnchor] = useState<string | null>(null);\n const [activeSchemaId, setActiveSchemaId] = useState<string | null>(null);\n const [sheetOpen, setSheetOpen] = useState(false);\n const docsRef = useRef<DocsViewHandle | null>(null);\n\n // Desktop slide-in is driven directly by ``selectedEndpoint``. Keeping a\n // separate open-state would mean two sources of truth for the same\n // semantic — \"which endpoint is loaded into the playground\".\n const slideOpen = !isMobile && state.selectedEndpoint !== null;\n\n // Per-schema endpoint map for the sections sidebar. ``keyBy`` makes the\n // lookup O(1) at render time instead of scanning schemasData in each\n // CategoryBlock — a win for 10+ schemas.\n const endpointsBySchema = useMemo<Record<string, ApiEndpoint[]>>(() => {\n if (grouping !== 'sections') return {};\n const byId = keyBy(schemasData, (e) => e.source.id);\n const out: Record<string, ApiEndpoint[]> = {};\n for (const src of schemas) out[src.id] = byId[src.id]?.endpoints ?? [];\n return out;\n }, [grouping, schemasData, schemas]);\n\n const handleTry = useCallback(\n (ep: ApiEndpoint) => {\n setSelectedEndpoint(ep);\n if (isMobile) setSheetOpen(true);\n },\n [isMobile, setSelectedEndpoint],\n );\n\n const handleCloseSlide = useCallback(() => {\n setSelectedEndpoint(null);\n }, [setSelectedEndpoint]);\n\n const handleNavigate = useCallback(\n (anchor: string, schemaId?: string | null) => {\n // In selector mode a schema switch may be required before the\n // anchor exists in the DOM — defer the scroll until the next\n // paint so ``useOpenApiSchema`` has a chance to swap endpoints.\n if (schemaId && schemaId !== currentSchema?.id && grouping === 'selector') {\n setCurrentSchema(schemaId);\n requestAnimationFrame(() => {\n docsRef.current?.scrollToAnchor(anchor);\n });\n return;\n }\n docsRef.current?.scrollToAnchor(anchor);\n },\n [currentSchema?.id, grouping, setCurrentSchema],\n );\n\n const handleActiveChange = useCallback((anchor: string | null, schemaId: string | null) => {\n setActiveAnchor(anchor);\n setActiveSchemaId(schemaId);\n }, []);\n\n // URL sync: read hash on mount / popstate → apply; write hash when\n // scrollspy updates. Only the *effective* active schema goes into the\n // hash — in ``selector`` mode it's the combobox value, in ``sections``\n // mode it's whichever schema the scrollspy is currently inside.\n const effectiveSchemaId = grouping === 'sections' ? activeSchemaId : currentSchema?.id ?? null;\n\n const handleHashTarget = useCallback(\n (target: ParsedHash) => {\n if (!target.schemaId && !target.anchor) return;\n\n // Schema-id segment may be either the raw id or a slug — match\n // both so copy-pasted URLs survive id changes that don't affect\n // the slug. First match wins.\n const matched = target.schemaId\n ? schemas.find((s) => s.id === target.schemaId || slugifySchemaId(s.id) === target.schemaId)\n : null;\n\n const needsSchemaSwitch =\n matched && grouping === 'selector' && matched.id !== currentSchema?.id;\n\n if (needsSchemaSwitch) {\n setCurrentSchema(matched.id);\n }\n\n if (target.anchor) {\n const anchor = target.anchor;\n // Wait one frame when a switch happened so the new DOM exists.\n if (needsSchemaSwitch) {\n requestAnimationFrame(() => {\n docsRef.current?.scrollToAnchor(anchor);\n });\n } else {\n docsRef.current?.scrollToAnchor(anchor);\n }\n }\n },\n [schemas, grouping, currentSchema?.id, setCurrentSchema],\n );\n\n useDocsUrlSync({\n enabled: urlSyncEnabled,\n currentSchemaId: effectiveSchemaId,\n activeAnchor,\n onHashTarget: handleHashTarget,\n });\n\n // ─── Loading / error branches ─────────────────────────────────────────\n\n if (loading) {\n return (\n <div className=\"grid grid-cols-[260px_1fr] items-start\">\n <div\n className=\"sticky top-[var(--navbar-height,64px)] border-r p-3 space-y-1.5 overflow-y-auto\"\n style={{ height: 'calc(100dvh - var(--navbar-height, 64px))' }}\n >\n {Array.from({ length: 12 }).map((_, i) => (\n <Skeleton key={i} className=\"h-8 w-full rounded\" />\n ))}\n </div>\n <div className=\"p-8 space-y-4\">\n <Skeleton className=\"h-8 w-1/2\" />\n <Skeleton className=\"h-4 w-full\" />\n <Skeleton className=\"h-4 w-3/4\" />\n <div className=\"mt-8 space-y-6\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div key={i} className=\"space-y-3\">\n <Skeleton className=\"h-6 w-1/3\" />\n <Skeleton className=\"h-20 w-full\" />\n </div>\n ))}\n </div>\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n className=\"flex items-center justify-center p-8\"\n style={{ height: 'calc(100dvh - var(--navbar-height, 64px))' }}\n >\n <p className=\"text-sm text-destructive\">Failed to load schema: {error}</p>\n </div>\n );\n }\n\n // ─── Mobile: sidebar + docs only, playground opens in sheet ───────────\n\n if (isMobile) {\n return (\n <div className=\"flex flex-col\">\n <EndpointDraftSync schemaId={currentSchema?.id ?? null} />\n {grouping === 'sections' ? (\n <DocsView\n ref={docsRef}\n grouping=\"sections\"\n schemasData={schemasData}\n selectedVersion={state.selectedVersion}\n loadedEndpoint={state.selectedEndpoint}\n onTryEndpoint={handleTry}\n onActiveChange={handleActiveChange}\n />\n ) : (\n <DocsView\n ref={docsRef}\n info={schemaInfo}\n rawSchema={rawSchema}\n resolvedBaseUrl={resolvedBaseUrl}\n endpoints={endpoints}\n selectedVersion={state.selectedVersion}\n loadedEndpoint={state.selectedEndpoint}\n onTryEndpoint={handleTry}\n onActiveChange={handleActiveChange}\n />\n )}\n <TryItSheet open={sheetOpen} onOpenChange={setSheetOpen} />\n </div>\n );\n }\n\n // ─── Desktop ──────────────────────────────────────────────────────────\n\n return (\n <TooltipProvider delayDuration={350}>\n <div className=\"grid grid-cols-[260px_minmax(0,1fr)] items-start\">\n <EndpointDraftSync schemaId={currentSchema?.id ?? null} />\n <div\n className=\"sticky top-[var(--navbar-height,64px)]\"\n style={{ height: 'calc(100dvh - var(--navbar-height, 64px))' }}\n >\n <DocsSidebar\n info={schemaInfo}\n endpoints={endpoints}\n schemas={schemas}\n currentSchemaId={currentSchema?.id ?? null}\n onSchemaChange={setCurrentSchema}\n activeEndpointId={activeAnchor}\n selectedVersion={state.selectedVersion}\n onNavigate={handleNavigate}\n grouping={grouping}\n endpointsBySchema={endpointsBySchema}\n rawSchema={rawSchema}\n resolvedBaseUrl={resolvedBaseUrl}\n />\n </div>\n {grouping === 'sections' ? (\n <DocsView\n ref={docsRef}\n grouping=\"sections\"\n schemasData={schemasData}\n selectedVersion={state.selectedVersion}\n loadedEndpoint={state.selectedEndpoint}\n onTryEndpoint={handleTry}\n onActiveChange={handleActiveChange}\n />\n ) : (\n <DocsView\n ref={docsRef}\n info={schemaInfo}\n rawSchema={rawSchema}\n resolvedBaseUrl={resolvedBaseUrl}\n endpoints={endpoints}\n selectedVersion={state.selectedVersion}\n loadedEndpoint={state.selectedEndpoint}\n onTryEndpoint={handleTry}\n onActiveChange={handleActiveChange}\n />\n )}\n {/* SidePanel renders into <body> via portal, so it floats\n above the whole layout (sidebar + navbar included). */}\n <SlideInPlayground open={slideOpen} onClose={handleCloseSlide} />\n </div>\n </TooltipProvider>\n );\n};\n"]}