@djangocfg/ui-tools 2.1.196 → 2.1.198
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{PlaygroundLayout-YH77POI4.mjs → PlaygroundLayout-DWRNA2QM.mjs} +173 -207
- package/dist/PlaygroundLayout-DWRNA2QM.mjs.map +1 -0
- package/dist/{PlaygroundLayout-LICYATAF.cjs → PlaygroundLayout-XYMJBNT4.cjs} +186 -220
- package/dist/PlaygroundLayout-XYMJBNT4.cjs.map +1 -0
- package/dist/{chunk-UX2MCSN5.mjs → chunk-FXFTJW2Y.mjs} +4 -17
- package/dist/chunk-FXFTJW2Y.mjs.map +1 -0
- package/dist/{chunk-GX62WYEV.cjs → chunk-QP6QAK3F.cjs} +3 -19
- package/dist/chunk-QP6QAK3F.cjs.map +1 -0
- package/dist/index.cjs +7 -7
- package/dist/index.mjs +4 -4
- package/package.json +6 -6
- package/src/tools/OpenapiViewer/OpenapiViewer.story.tsx +238 -0
- package/src/tools/OpenapiViewer/components/EndpointsLibrary.tsx +144 -129
- package/src/tools/OpenapiViewer/components/PlaygroundLayout.tsx +35 -69
- package/src/tools/OpenapiViewer/components/PlaygroundStepper.tsx +1 -1
- package/src/tools/OpenapiViewer/context/PlaygroundContext.tsx +1 -3
- package/src/tools/OpenapiViewer/hooks/useOpenApiSchema.ts +61 -48
- package/dist/PlaygroundLayout-LICYATAF.cjs.map +0 -1
- package/dist/PlaygroundLayout-YH77POI4.mjs.map +0 -1
- package/dist/chunk-GX62WYEV.cjs.map +0 -1
- package/dist/chunk-UX2MCSN5.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/OpenapiViewer/hooks/useMobile.ts","../src/tools/OpenapiViewer/hooks/useOpenApiSchema.ts","../src/tools/OpenapiViewer/components/EndpointsLibrary.tsx","../src/tools/OpenapiViewer/components/PlaygroundStepper.tsx","../src/tools/OpenapiViewer/components/EndpointInfo.tsx","../src/tools/OpenapiViewer/components/RequestParametersForm.tsx","../src/tools/OpenapiViewer/components/RequestBuilder.tsx","../src/tools/OpenapiViewer/components/ResponseViewer.tsx","../src/tools/OpenapiViewer/components/PlaygroundLayout.tsx"],"names":["__name","useIsMobile","useState","useMemo","useEffect","consola","useCallback","usePlaygroundContext","React","deduplicateEndpoints","jsx","Badge","jsxs","Skeleton","Card","CardContent","Combobox","Search","Input","Select","SelectTrigger","Filter","SelectValue","SelectContent","SelectItem","Button","List","Grid3X3","DownloadButton","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","CardHeader","CardTitle","Code","Send","FileText","Check","ChevronLeft","ChevronRight","getMethodColor","CopyButton","Collapsible","CollapsibleTrigger","Database","ChevronDown","CollapsibleContent","AlertCircle","getStatusColor","Label","TooltipProvider","Tooltip","TooltipTrigger","HelpCircle","TooltipContent","Tabs","TabsList","TabsTrigger","TabsContent","Accordion","AccordionItem","AccordionTrigger","AccordionContent","Textarea","isValidJson","findApiKeyById","parseRequestHeaders","Key","Fragment","Loader2","PrettyCode_default","Download","XCircle","JsonTree_default","Sheet","SheetTrigger","Menu","SheetContent","X"],"mappings":";;;;;;;;;;;;;;;;;AAEO,IAAM,4BAAYA,wBAAA,CAAA,MAAM;AAC7B,EAAA,MAAM,WAAWC,iBAAA,EAAY;AAE7B,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA,WAAW,CAAC;AAAA,GACd;AACF,CAAA,EAPyB,WAAA,CAAA;ACMzB,IAAM,eAAe,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,SAAS,QAAQ,CAAA;AAG7D,IAAM,gBAAA,6CAAoB,MAAA,KAAyC;AACjE,EAAA,MAAM,YAA2B,EAAC;AAElC,EAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,OAAO,EAAC;AAG3B,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,GAAA,GAAM,EAAA;AAEtF,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,WAAA,GAAc,GAAG,WAAA,IAAe,EAAA,CAAG,WAAW,CAAA,EAAG,WAAW,IAAI,IAAI,CAAA,CAAA;AAC1E,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;AAGA,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,WAAA,GAAc;AAAA,UACZ,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAA,IAAQ,QAAA;AAAA,UACjC,WAAA,EAAa,GAAG,WAAA,CAAY;AAAA,SAC9B;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,MAAM,OAAA,GAAU,IAAA;AAAA,QAChB,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;AAAA,OAChD;AAEA,MAAA,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,IACzB;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT,CAAA,EA7EyB,kBAAA,CAAA;AAgFzB,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;AAiBL,SAAR,gBAAA,CAAkC;AAAA,EACvC,OAAA;AAAA,EACA;AACF,CAAA,EAAkD;AAChD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAS,IAAI,CAAA;AAC3C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIA,eAAwB,IAAI,CAAA;AACtD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,cAAA;AAAA,IAC5C,eAAA,IAAmB,OAAA,CAAQ,CAAC,CAAA,EAAG;AAAA,GACjC;AACA,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,cAAA;AAAA,wBACpC,GAAA;AAAI,GACV;AAEA,EAAA,MAAM,aAAA,GAAgBC,aAAA;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,aAAA;AAAA,IAC3B,MAAO,eAAA,GAAkB,aAAA,CAAc,GAAA,CAAI,eAAe,CAAA,GAAI,IAAA;AAAA,IAC9D,CAAC,eAAe,eAAe;AAAA,GACjC;AAEA,EAAA,MAAM,SAAA,GAAYA,aAAA;AAAA,IAChB,MAAO,oBAAA,GAAuB,gBAAA,CAAiB,oBAAoB,IAAI,EAAC;AAAA,IACxE,CAAC,oBAAoB;AAAA,GACvB;AAEA,EAAA,MAAM,UAAA,GAAaA,cAAQ,MAAM,aAAA,CAAc,SAAS,CAAA,EAAG,CAAC,SAAS,CAAC,CAAA;AAGtE,EAAAC,eAAA,CAAU,MAAM;AACd,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,CAAC,CAAA;AAEjC,EAAA,MAAM,gBAAA,GAAmBC,iBAAA,CAAY,CAAC,QAAA,KAAqB;AACzD,IAAA,kBAAA,CAAmB,QAAQ,CAAA;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,kBAAY,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,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AAhGwBL,wBAAA,CAAA,gBAAA,EAAA,kBAAA,CAAA;AC/FxB,IAAM,qBAAA,GAAgD;AAAA,EAClD,GAAA,EAAK,gFAAA;AAAA,EACL,IAAA,EAAM,oEAAA;AAAA,EACN,GAAA,EAAK,wEAAA;AAAA,EACL,KAAA,EAAO,4EAAA;AAAA,EACP,MAAA,EAAQ;AACZ,CAAA;AAEO,IAAM,mCAA6BA,wBAAA,CAAA,MAAM;AAC5C,EAAA,MAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,qBAAqB,mBAAA,EAAqB,aAAA,KAAkBO,sCAAA,EAAqB;AACxG,EAAA,MAAM,EAAE,WAAW,UAAA,EAAY,OAAA,EAAS,OAAO,OAAA,EAAS,aAAA,EAAe,gBAAA,EAAiB,GAAI,gBAAA,CAAiB;AAAA,IACzG,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,iBAAiB,MAAA,CAAO;AAAA,GAC3B,CAAA;AACD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,sBAAA,CAAM,SAA2B,OAAO,CAAA;AAExE,EAAA,MAAM,eAAA,6CAAmB,QAAA,KAA6B;AAClD,IAAA,IAAI;AACA,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,QAAQ,CAAA;AAC5B,MAAA,OAAO,GAAA,CAAI,QAAA;AAAA,IACf,CAAA,CAAA,MAAQ;AACJ,MAAA,OAAO,QAAA;AAAA,IACX;AAAA,EACJ,CAAA,EAPwB,iBAAA,CAAA;AASxB,EAAA,MAAM,iBAAA,GAAoBL,cAAQ,MAAM;AACpC,IAAA,IAAI,QAAA,GAAWM,sCAAA,CAAqB,SAAA,EAAW,KAAA,CAAM,eAAe,CAAA;AAEpE,IAAA,IAAI,KAAA,CAAM,gBAAA,IAAoB,KAAA,CAAM,gBAAA,KAAqB,KAAA,EAAO;AAC5D,MAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAC,aAAa,QAAA,CAAS,QAAA,KAAa,MAAM,gBAAgB,CAAA;AAAA,IACzF;AAEA,IAAA,IAAI,MAAM,UAAA,EAAY;AAClB,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,UAAA,CAAW,WAAA,EAAY;AACjD,MAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,QAChB,CAAC,aACG,QAAA,CAAS,IAAA,CAAK,aAAY,CAAE,QAAA,CAAS,WAAW,CAAA,IAChD,QAAA,CAAS,YAAY,WAAA,EAAY,CAAE,SAAS,WAAW,CAAA,IACvD,SAAS,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,WAAW;AAAA,OACxD;AAAA,IACJ;AAEA,IAAA,OAAO,QAAA;AAAA,EACX,CAAA,EAAG,CAAC,SAAA,EAAW,KAAA,CAAM,kBAAkB,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,eAAe,CAAC,CAAA;AAE/E,EAAA,MAAM,aAAA,GAAgBN,aAAAA;AAAA,IAAQ,MAC1B,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,CAAE,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,IAAA,EAAK,CAAE,CAAA;AAAA,IACnD,CAAC,OAAO;AAAA,GACZ;AAEA,EAAA,MAAM,cAAA,6CAAkB,MAAA,qBACpBO,cAAA;AAAA,IAACC,gBAAA;AAAA,IAAA;AAAA,MAEG,OAAA,EAAQ,SAAA;AAAA,MACR,WAAW,CAAA,gCAAA,EAAmC,qBAAA,CAAsB,OAAO,WAAA,EAAa,KAAK,EAAE,CAAA,CAAA;AAAA,MAE9F,QAAA,EAAA;AAAA,KAAA;AAAA,IAJI;AAAA,GAKT,EAPmB,gBAAA,CAAA;AAUvB,EAAA,IAAI,OAAA,EAAS;AACT,IAAA,uBACIC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,sBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,yBAAA,EACX,QAAA,EAAA;AAAA,wBAAAF,cAAA,CAACG,mBAAA,EAAA,EAAS,WAAU,UAAA,EAAW,CAAA;AAAA,wBAC/BH,cAAA,CAACG,mBAAA,EAAA,EAAS,SAAA,EAAU,qBAAA,EAAsB,CAAA;AAAA,wBAC1CH,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,wBACxBA,cAAA,CAACG,mBAAA,EAAA,EAAS,SAAA,EAAU,UAAA,EAAW;AAAA,OAAA,EACnC,CAAA;AAAA,sBACAH,cAAA,CAAC,SAAI,SAAA,EAAU,WAAA,EACV,gBAAM,IAAA,CAAK,EAAE,QAAQ,CAAA,EAAG,EAAE,GAAA,CAAI,CAAC,GAAG,CAAA,qBAC/BA,cAAA,CAACG,uBAAiB,SAAA,EAAU,aAAA,EAAA,EAAb,CAA2B,CAC7C,CAAA,EACL;AAAA,KAAA,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,IAAI,KAAA,EAAO;AACP,IAAA,uBACIH,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,yCAACI,eAAA,EAAA,EAAK,SAAA,EAAU,yCAAA,EACZ,QAAA,kBAAAJ,cAAA,CAACK,0BAAY,SAAA,EAAU,KAAA,EACnB,QAAA,kBAAAH,eAAA,CAAC,GAAA,EAAA,EAAE,WAAU,0BAAA,EAA2B,QAAA,EAAA;AAAA,MAAA,yBAAA;AAAA,MAAwB;AAAA,KAAA,EAAM,CAAA,EAC1E,GACJ,CAAA,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,uBACIA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEX,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EAEV,QAAA,EAAA;AAAA,MAAA,OAAA,CAAQ,SAAS,CAAA,oBACdF,cAAA;AAAA,QAACM,mBAAA;AAAA,QAAA;AAAA,UACG,OAAA,EAAS,aAAA;AAAA,UACT,KAAA,EAAO,eAAe,EAAA,IAAM,EAAA;AAAA,UAC5B,aAAA,EAAe,CAAC,EAAA,KAAO,EAAA,IAAM,iBAAiB,EAAE,CAAA;AAAA,UAChD,WAAA,EAAY,YAAA;AAAA,UACZ,iBAAA,EAAkB,gBAAA;AAAA,UAClB,SAAA,EAAU,eAAA;AAAA,UACV,SAAA,EAAU;AAAA;AAAA,OACd;AAAA,sBAIJJ,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0BAAA,EACX,QAAA,EAAA;AAAA,wBAAAF,cAAA,CAACO,kBAAA,EAAA,EAAO,WAAU,8EAAA,EAA+E,CAAA;AAAA,wBACjGP,cAAA;AAAA,UAACQ,gBAAA;AAAA,UAAA;AAAA,YACG,WAAA,EAAY,WAAA;AAAA,YACZ,OAAO,KAAA,CAAM,UAAA;AAAA,YACb,UAAU,CAAC,CAAA,KAA2C,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAClF,SAAA,EAAU;AAAA;AAAA;AACd,OAAA,EACJ,CAAA;AAAA,sCAGCC,iBAAA,EAAA,EAAO,KAAA,EAAO,KAAA,CAAM,gBAAA,EAAkB,eAAe,mBAAA,EAClD,QAAA,EAAA;AAAA,wBAAAP,eAAA,CAACQ,wBAAA,EAAA,EAAc,WAAU,oBAAA,EACrB,QAAA,EAAA;AAAA,0BAAAV,cAAA,CAACW,kBAAA,EAAA,EAAO,WAAU,aAAA,EAAc,CAAA;AAAA,yCAC/BC,sBAAA,EAAA,EAAY;AAAA,SAAA,EACjB,CAAA;AAAA,wCACCC,wBAAA,EAAA,EACG,QAAA,EAAA;AAAA,0BAAAb,cAAA,CAACc,qBAAA,EAAA,EAAW,KAAA,EAAM,KAAA,EAAM,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,UAC1B,UAAA,CAAW,GAAA,CAAI,CAAC,QAAA,qBACbd,cAAA,CAACc,yBAA0B,KAAA,EAAO,QAAA,EAC7B,QAAA,EAAA,QAAA,EAAA,EADY,QAEjB,CACH;AAAA,SAAA,EACL;AAAA,OAAA,EACJ,CAAA;AAAA,sBAGAd,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EAAS,CAAA;AAAA,sBAGxBE,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6DAAA,EACX,QAAA,EAAA;AAAA,QAAA,iBAAA,CAAkB,MAAA;AAAA,QAAO,WAAA;AAAA,QAAU,iBAAA,CAAkB,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM;AAAA,OAAA,EAC/E,CAAA;AAAA,sBAEAA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACX,QAAA,EAAA;AAAA,wBAAAF,cAAA;AAAA,UAACe,iBAAA;AAAA,UAAA;AAAA,YACG,OAAA,EAAS,QAAA,KAAa,OAAA,GAAU,SAAA,GAAY,OAAA;AAAA,YAC5C,IAAA,EAAK,MAAA;AAAA,YACL,SAAA,EAAU,wBAAA;AAAA,YACV,OAAA,EAAS,MAAM,WAAA,CAAY,OAAO,CAAA;AAAA,YAElC,QAAA,kBAAAf,cAAA,CAACgB,gBAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA,SAClC;AAAA,wBACAhB,cAAA;AAAA,UAACe,iBAAA;AAAA,UAAA;AAAA,YACG,OAAA,EAAS,QAAA,KAAa,MAAA,GAAS,SAAA,GAAY,OAAA;AAAA,YAC3C,IAAA,EAAK,MAAA;AAAA,YACL,SAAA,EAAU,wBAAA;AAAA,YACV,OAAA,EAAS,MAAM,WAAA,CAAY,MAAM,CAAA;AAAA,YAEjC,QAAA,kBAAAf,cAAA,CAACiB,mBAAA,EAAA,EAAQ,SAAA,EAAU,aAAA,EAAc;AAAA;AAAA;AACrC,OAAA,EACJ,CAAA;AAAA,MAEC,aAAA,oBACGjB,cAAA;AAAA,QAACkB,yBAAA;AAAA,QAAA;AAAA,UACG,KAAK,aAAA,CAAc,GAAA;AAAA,UACnB,QAAA,EAAU,CAAA,EAAG,aAAA,CAAc,EAAE,CAAA,aAAA,CAAA;AAAA,UAC7B,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,SAAA,EAAU,KAAA;AAAA,UAEV,QAAA,kBAAAlB,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,QAAA,EAAA,QAAA,EAAM;AAAA;AAAA;AAC7C,KAAA,EAER,CAAA;AAAA,IAGC,QAAA,KAAa,OAAA,mBACVA,cAAA,CAACI,eAAA,EAAA,EACG,0CAACe,gBAAA,EAAA,EACG,QAAA,EAAA;AAAA,sBAAAnB,cAAA,CAACoB,sBAAA,EAAA,EACG,0CAACC,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,wBAAArB,cAAA,CAACsB,oBAAA,EAAA,EAAU,SAAA,EAAU,sBAAA,EAAuB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,wBAClDtB,cAAA,CAACsB,oBAAA,EAAA,EAAU,SAAA,EAAU,iBAAA,EAAkB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,wBAC3CtB,cAAA,CAACsB,oBAAA,EAAA,EAAU,SAAA,EAAU,sCAAA,EAAuC,QAAA,EAAA,aAAA,EAAW;AAAA,OAAA,EAC3E,CAAA,EACJ,CAAA;AAAA,qCACCC,oBAAA,EAAA,EACI,QAAA,EAAA,iBAAA,CAAkB,WAAW,CAAA,mBAC1BvB,cAAA,CAACqB,uBACG,QAAA,kBAAArB,cAAA,CAACwB,oBAAA,EAAA,EAAU,SAAS,CAAA,EAAG,SAAA,EAAU,2CAA0C,QAAA,EAAA,oBAAA,EAE3E,CAAA,EACJ,IAEA,iBAAA,CAAkB,GAAA,CAAI,CAAC,QAAA,qBACnBtB,eAAA;AAAA,QAACmB,mBAAA;AAAA,QAAA;AAAA,UAEG,SAAA,EAAW,CAAA,mDAAA,EACP,KAAA,CAAM,gBAAA,EAAkB,IAAA,KAAS,QAAA,CAAS,IAAA,IAC1C,KAAA,CAAM,gBAAA,EAAkB,MAAA,KAAW,QAAA,CAAS,MAAA,GACtC,iBACA,EACV,CAAA,CAAA;AAAA,UACA,OAAA,EAAS,MAAM,mBAAA,CAAoB,QAAQ,CAAA;AAAA,UAE3C,QAAA,EAAA;AAAA,4BAAArB,cAAA,CAACwB,wBAAU,SAAA,EAAU,QAAA,EAChB,QAAA,EAAA,cAAA,CAAe,QAAA,CAAS,MAAM,CAAA,EACnC,CAAA;AAAA,2CACCA,oBAAA,EAAA,EAAU,SAAA,EAAU,kDAChB,QAAA,EAAA,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAA,EAClC,CAAA;AAAA,4BACAxB,cAAA,CAACwB,oBAAA,EAAA,EAAU,SAAA,EAAU,6EAAA,EAChB,mBAAS,WAAA,EACd;AAAA;AAAA,SAAA;AAAA,QAjBK,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,IAAI,CAAA;AAAA,OAmB/C,CAAA,EAET;AAAA,KAAA,EACJ,GACJ,CAAA,mBAEAxB,cAAA,CAAC,SAAI,SAAA,EAAU,sDAAA,EACV,4BAAkB,MAAA,KAAW,CAAA,mBAC1BA,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uDAAA,EAAwD,QAAA,EAAA,oBAAA,EAEvE,IAEA,iBAAA,CAAkB,GAAA,CAAI,CAAC,QAAA,qBACnBE,eAAA;AAAA,MAACE,eAAA;AAAA,MAAA;AAAA,QAEG,SAAA,EAAW,CAAA,8CAAA,EACP,KAAA,CAAM,gBAAA,EAAkB,IAAA,KAAS,QAAA,CAAS,IAAA,IAC1C,KAAA,CAAM,gBAAA,EAAkB,MAAA,KAAW,QAAA,CAAS,MAAA,GACtC,wBACA,EACV,CAAA,CAAA;AAAA,QACA,OAAA,EAAS,MAAM,mBAAA,CAAoB,QAAQ,CAAA;AAAA,QAE3C,QAAA,EAAA;AAAA,0BAAAJ,cAAA,CAACyB,yBAAW,SAAA,EAAU,gBAAA,EAClB,QAAA,kBAAAvB,eAAA,CAACwB,oBAAA,EAAA,EAAU,WAAU,2CAAA,EACjB,QAAA,EAAA;AAAA,4BAAA1B,cAAA,CAAC,UAAK,SAAA,EAAU,kDAAA,EACX,QAAA,EAAA,eAAA,CAAgB,QAAA,CAAS,IAAI,CAAA,EAClC,CAAA;AAAA,YACC,cAAA,CAAe,SAAS,MAAM;AAAA,WAAA,EACnC,CAAA,EACJ,CAAA;AAAA,0BACAA,cAAA,CAACK,sBAAA,EAAA,EAAY,SAAA,EAAU,gBAAA,EACnB,QAAA,kBAAAL,cAAA,CAAC,OAAE,SAAA,EAAU,4CAAA,EACR,QAAA,EAAA,QAAA,CAAS,WAAA,EACd,CAAA,EACJ;AAAA;AAAA,OAAA;AAAA,MArBK,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,CAAA,EAAI,SAAS,IAAI,CAAA;AAAA,KAuB/C,CAAA,EAET;AAAA,GAAA,EAER,CAAA;AAER,CAAA,EAzP0C,kBAAA,CAAA;AClB1C,IAAM,UAAA,GAAa;AAAA,EACjB,SAAA,EAAW;AAAA,IACT,KAAA,EAAO,WAAA;AAAA,IACP,IAAA,EAAM2B,gBAAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,OAAA,EAAS;AAAA,IACP,KAAA,EAAO,SAAA;AAAA,IACP,IAAA,EAAMC,gBAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,QAAA,EAAU;AAAA,IACR,KAAA,EAAO,UAAA;AAAA,IACP,IAAA,EAAMC,oBAAA;AAAA,IACN,WAAA,EAAa;AAAA;AAEjB,CAAA;AAEO,IAAM,oCAA8BvC,wBAAA,CAAA,MAAM;AAC/C,EAAA,MAAM,EAAE,KAAA,EAAO,cAAA,EAAgB,YAAA,EAAc,gBAAA,KAAqBO,sCAAA,EAAqB;AACvF,EAAA,MAAM,EAAE,WAAA,EAAa,KAAA,EAAM,GAAI,KAAA;AAE/B,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AAC9C,EAAA,MAAM,SAAA,GAAY,YAAA,GAAe,KAAA,CAAM,MAAA,GAAS,CAAA;AAChD,EAAA,MAAM,gBAAgB,YAAA,GAAe,CAAA;AAErC,EAAA,uBACEK,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,0CAAA,EAEb,QAAA,EAAA;AAAA,oBAAAF,cAAAA,CAAC,SAAI,SAAA,EAAU,6BAAA,EACZ,gBAAM,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AAC1B,MAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,MAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AACpB,MAAA,MAAM,WAAW,IAAA,KAAS,WAAA;AAC1B,MAAA,MAAM,cAAc,KAAA,GAAQ,YAAA;AAC5B,MAAA,MAAM,WAAA,GAAc,SAAS,YAAA,GAAe,CAAA;AAE5C,MAAA,uBACEE,eAAAA,CAAC,KAAA,EAAA,EAAe,SAAA,EAAU,6BAAA,EACxB,QAAA,EAAA;AAAA,wBAAAA,eAAAA;AAAA,UAACa,iBAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,WAAW,SAAA,GAAY,OAAA;AAAA,YAChC,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,MAAM,WAAA,IAAe,cAAA,CAAe,IAAI,CAAA;AAAA,YACjD,SAAA,EAAW,CAAA,4BAAA,EAA+B,WAAA,GAAc,gBAAA,GAAmB,+BACzE,CAAA,CAAA;AAAA,YACF,UAAU,CAAC,WAAA;AAAA,YAEV,QAAA,EAAA;AAAA,cAAA,WAAA,mBACCf,cAAAA,CAAC8B,iBAAA,EAAA,EAAM,SAAA,EAAU,SAAA,EAAU,oBAE3B9B,cAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,8BAE5BA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAoB,iBAAO,KAAA,EAAM;AAAA;AAAA;AAAA,SACnD;AAAA,QAEC,KAAA,GAAQ,MAAM,MAAA,GAAS,CAAA,oBACtBA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oBAAA,EAAqB;AAAA,OAAA,EAAA,EAlB9B,IAoBV,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,oBAGAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA;AAAA,QAACa,iBAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAS,gBAAA;AAAA,UACT,UAAU,CAAC,aAAA;AAAA,UACX,SAAA,EAAU,6BAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAf,cAAAA,CAAC+B,uBAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,4BACjC/B,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,QAAA,EAAA,UAAA,EAAQ;AAAA;AAAA;AAAA,OAC7C;AAAA,sBAEAE,eAAAA;AAAA,QAACa,iBAAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,OAAA,EAAS,YAAA;AAAA,UACT,UAAU,CAAC,SAAA;AAAA,UACX,SAAA,EAAU,6BAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAf,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,kBAAA,EAAmB,QAAA,EAAA,MAAA,EAAI,CAAA;AAAA,4BACvCA,cAAAA,CAACgC,wBAAA,EAAA,EAAa,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AAAA;AACpC,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA,EAvE2C,mBAAA,CAAA;ACfpC,IAAM,+BAAyB1C,wBAAA,CAAA,MAAM;AAC1C,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIO,sCAAA,EAAqB;AACvC,EAAA,MAAM,EAAE,kBAAiB,GAAI,KAAA;AAG7B,EAAA,MAAM,YAAA,GAAeJ,cAAQ,MAAM;AACjC,IAAA,IAAI,CAAC,kBAAkB,OAAO,EAAA;AAC9B,IAAA,OAAO,KAAK,SAAA,CAAU;AAAA,MACpB,MAAM,gBAAA,CAAiB,IAAA;AAAA,MACvB,QAAQ,gBAAA,CAAiB,MAAA;AAAA,MACzB,MAAM,gBAAA,CAAiB,IAAA;AAAA,MACvB,aAAa,gBAAA,CAAiB,WAAA;AAAA,MAC9B,YAAY,gBAAA,CAAiB,UAAA;AAAA,MAC7B,aAAa,gBAAA,CAAiB,WAAA;AAAA,MAC9B,WAAW,gBAAA,CAAiB;AAAA,KAC9B,EAAG,MAAM,CAAC,CAAA;AAAA,EACZ,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAA,6CAAmB,OAAA,KAAoB;AAC3C,IAAA,OAAO,OAAA,CAAQ,MAAM,IAAI,CAAA,CAAE,IAAI,CAAC,MAAA,qBAC9BO,cAAAA,CAACC,gBAAAA,EAAA,EAAmB,SAASgC,gCAAA,CAAe,MAAM,MAAM,SAAA,GAAY,SAAA,GAAY,aAAa,SAAA,EAAU,SAAA,EACpG,QAAA,EAAA,MAAA,EAAA,EADS,MAEZ,CACD,CAAA;AAAA,EACH,CAAA,EANwB,iBAAA,CAAA;AAQxB,EAAA,uBACE/B,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAwC,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,sBACvEA,eAACkC,qBAAA,EAAA,EAAW,KAAA,EAAO,cAAc,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,QAAA,EAAA,MAAA,EAE7D;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAhC,eAAAA,CAACE,eAAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAJ,cAAAA,CAACyB,uBAAA,EACC,QAAA,kBAAAvB,gBAACwB,oBAAAA,EAAA,EAAU,WAAU,2DAAA,EACnB,QAAA,EAAA;AAAA,wBAAAxB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,0BAAAF,cAAAA,CAAC2B,gBAAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,0BAC1B3B,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,aAAA,EAAe,2BAAiB,IAAA,EAAK;AAAA,SAAA,EACvD,CAAA;AAAA,wBACAA,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAkB,QAAA,EAAA,eAAA,CAAgB,gBAAA,CAAiB,MAAM,CAAA,EAAE;AAAA,OAAA,EAC5E,CAAA,EACF,CAAA;AAAA,sBACAE,eAAAA,CAACG,sBAAAA,EAAA,EAAY,WAAU,WAAA,EACrB,QAAA,EAAA;AAAA,wBAAAH,gBAAC,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAF,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mDAAA,EACV,2BAAiB,IAAA,EACpB,CAAA;AAAA,0BACAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EACV,2BAAiB,WAAA,EACpB;AAAA,SAAA,EACF,CAAA;AAAA,QAGC,gBAAA,CAAiB,cAAc,gBAAA,CAAiB,UAAA,CAAW,SAAS,CAAA,oBACnEE,gBAACiC,sBAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAjC,eAAAA,CAACkC,6BAAA,EAAA,EAAmB,SAAA,EAAU,iEAAA,EAC5B,QAAA,EAAA;AAAA,4BAAApC,cAAAA,CAACqC,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,4BAC9BnC,gBAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,cAAA;AAAA,cAAa,iBAAiB,UAAA,CAAW,MAAA;AAAA,cAAO;AAAA,aAAA,EAAC,CAAA;AAAA,4BACvDF,cAAAA,CAACsC,uBAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA,WAAA,EACnC,CAAA;AAAA,0BACAtC,cAAAA,CAACuC,6BAAA,EAAA,EAAmB,SAAA,EAAU,kBAC3B,QAAA,EAAA,gBAAA,CAAiB,UAAA,CAAW,GAAA,CAAI,CAAC,OAAO,KAAA,qBACvCrC,eAAAA,CAAC,KAAA,EAAA,EAAgB,WAAU,qCAAA,EACzB,QAAA,EAAA;AAAA,4BAAAF,cAAAA,CAACC,gBAAAA,EAAA,EAAM,OAAA,EAAS,KAAA,CAAM,QAAA,GAAW,aAAA,GAAgB,WAAA,EAAa,SAAA,EAAU,SAAA,EACrE,QAAA,EAAA,KAAA,CAAM,QAAA,GAAW,aAAa,UAAA,EACjC,CAAA;AAAA,4BACAC,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAA,EACb,QAAA,EAAA;AAAA,cAAA,KAAA,CAAM,IAAA;AAAA,cAAK,IAAA;AAAA,cAAG,KAAA,CAAM;AAAA,aAAA,EACvB,CAAA;AAAA,YACC,MAAM,WAAA,oBACLA,eAAAA,CAAC,MAAA,EAAA,EAAK,WAAU,uBAAA,EAAwB,QAAA,EAAA;AAAA,cAAA,IAAA;AAAA,cAAG,KAAA,CAAM;AAAA,aAAA,EAAY;AAAA,WAAA,EAAA,EARvD,KAUV,CACD,CAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,QAID,gBAAA,CAAiB,WAAA,oBAChBA,eAAAA,CAACiC,sBAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAjC,eAAAA,CAACkC,6BAAA,EAAA,EAAmB,SAAA,EAAU,iEAAA,EAC5B,QAAA,EAAA;AAAA,4BAAApC,cAAAA,CAAC6B,oBAAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,4BAC9B7B,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,4BAClBA,cAAAA,CAACsC,uBAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA,WAAA,EACnC,CAAA;AAAA,0BACAtC,eAACuC,6BAAA,EAAA,EAAmB,SAAA,EAAU,QAC5B,QAAA,kBAAArC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,gBAAC,GAAA,EAAA,EAAE,QAAA,EAAA;AAAA,cAAA,QAAA;AAAA,cAAO,iBAAiB,WAAA,CAAY;AAAA,aAAA,EAAK,CAAA;AAAA,YAC3C,gBAAA,CAAiB,WAAA,CAAY,WAAA,oBAC5BF,cAAAA,CAAC,OAAE,SAAA,EAAU,MAAA,EAAQ,QAAA,EAAA,gBAAA,CAAiB,WAAA,CAAY,WAAA,EAAY;AAAA,WAAA,EAElE,CAAA,EACF;AAAA,SAAA,EACF,CAAA;AAAA,QAID,gBAAA,CAAiB,aAAa,gBAAA,CAAiB,SAAA,CAAU,SAAS,CAAA,oBACjEE,gBAACiC,sBAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAAjC,eAAAA,CAACkC,6BAAA,EAAA,EAAmB,SAAA,EAAU,iEAAA,EAC5B,QAAA,EAAA;AAAA,4BAAApC,cAAAA,CAACwC,uBAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,4BACjCtC,gBAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,aAAA;AAAA,cAAY,iBAAiB,SAAA,CAAU,MAAA;AAAA,cAAO;AAAA,aAAA,EAAC,CAAA;AAAA,4BACrDF,cAAAA,CAACsC,uBAAA,EAAA,EAAY,SAAA,EAAU,SAAA,EAAU;AAAA,WAAA,EACnC,CAAA;AAAA,0BACAtC,cAAAA,CAACuC,6BAAA,EAAA,EAAmB,SAAA,EAAU,gBAAA,EAC3B,2BAAiB,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,EAAU,KAAA,KAAU;AACnD,YAAA,MAAM,WAAA,GAAcE,gCAAA,CAAe,QAAA,CAAS,QAAA,CAAS,IAAI,CAAC,CAAA;AAC1D,YAAA,MAAM,eAAe,WAAA,KAAgB,SAAA,GAAY,SAAA,GAC7B,WAAA,KAAgB,UAAU,aAAA,GAAgB,WAAA;AAC9D,YAAA,uBACEvC,eAAAA,CAAC,KAAA,EAAA,EAAgB,SAAA,EAAU,qCAAA,EACzB,QAAA,EAAA;AAAA,8BAAAF,cAAAA,CAACC,kBAAA,EAAM,OAAA,EAAS,cAAc,SAAA,EAAU,SAAA,EACrC,mBAAS,IAAA,EACZ,CAAA;AAAA,8BACAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACb,mBAAS,WAAA,EACZ;AAAA,aAAA,EAAA,EANQ,KAOV,CAAA;AAAA,UAEJ,CAAC,CAAA,EACH;AAAA,SAAA,EACF;AAAA,OAAA,EAEJ;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA,EAvIsC,cAAA,CAAA;ACO/B,IAAM,wCAAkCV,wBAAA,CAAA,MAAM;AACnD,EAAA,MAAM,EAAE,KAAA,EAAO,aAAA,EAAc,GAAIO,sCAAA,EAAqB;AACtD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIL,cAAAA,CAAiC,EAAE,CAAA;AACnE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,UAAU,CAAA;AAGrD,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,KAAA,CAAM,kBAAkB,UAAA,EAAY;AACtC,MAAA,MAAM,cAAsC,EAAC;AAC7C,MAAA,KAAA,CAAM,gBAAA,CAAiB,UAAA,CAAW,OAAA,CAAQ,CAAA,KAAA,KAAS;AACjD,QAAA,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA,GAAI,EAAA;AAAA,MAC5B,CAAC,CAAA;AACD,MAAA,WAAA,CAAY,WAAW,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,CAAM,gBAAA,EAAkB,MAAM,KAAA,CAAM,gBAAA,EAAkB,UAAU,CAAC,CAAA;AAErE,EAAA,MAAM,iBAAA,mBAAoBJ,wBAAA,CAAA,CAAC,IAAA,EAAc,KAAA,KAAkB;AACzD,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAG,QAAA;AAAA,MACH,CAAC,IAAI,GAAG;AAAA,KACV;AACA,IAAA,WAAA,CAAY,WAAW,CAAA;AAGvB,IAAA,aAAA,CAAc,WAAW,CAAA;AAAA,EAC3B,CAAA,EAT0B,mBAAA,CAAA;AAW1B,EAAA,MAAM,kCAAkBA,wBAAA,CAAA,MAAM;AAC5B,IAAA,WAAA,CAAY,EAAE,CAAA;AACd,IAAA,aAAA,CAAc,EAAE,CAAA;AAAA,EAClB,CAAA,EAHwB,iBAAA,CAAA;AAKxB,EAAA,MAAM,qCAAqBA,wBAAA,CAAA,MAAM;AAC/B,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAA,KAAA,KAAS,KAAA,KAAU,EAAA,IAAM,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAS,CAAA;AAC3G,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AACnD,MAAA,SAAA,CAAU,SAAA,CAAU,UAAU,UAAU,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA,EAN2B,oBAAA,CAAA;AAQ3B,EAAA,IAAI,CAAC,KAAA,CAAM,gBAAA,EAAkB,OAAO,IAAA;AAEpC,EAAA,MAAM,cAAA,GAAiB,MAAM,gBAAA,CAAiB,UAAA,EAAY,OAAO,CAAA,KAAA,KAAS,KAAA,CAAM,QAAQ,CAAA,IAAK,EAAC;AAC9F,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,gBAAA,CAAiB,UAAA,EAAY,MAAA,CAAO,WAAS,CAAC,KAAA,CAAM,QAAQ,CAAA,IAAK,EAAC;AAC/F,EAAA,MAAM,aAAA,GAAA,CAAiB,KAAA,CAAM,gBAAA,CAAiB,UAAA,EAAY,UAAU,CAAA,IAAK,CAAA;AAEzE,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAA,KAAA,KAAS,KAAA,KAAU,EAAA,IAAM,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAS,CAAA;AAG/G,EAAA,MAAM,cAAA,6CAAkB,EAAE,KAAA,uBACxBY,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,gBAACwC,gBAAA,EAAA,EAAM,OAAA,EAAS,KAAA,CAAM,IAAA,EAAM,WAAU,qCAAA,EACnC,QAAA,EAAA;AAAA,QAAA,KAAA,CAAM,IAAA;AAAA,QACN,MAAM,QAAA,oBAAY1C,eAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yBAAwB,QAAA,EAAA,GAAA,EAAC;AAAA,OAAA,EAC9D,CAAA;AAAA,MACC,MAAM,WAAA,oBACLA,eAAC2C,0BAAA,EAAA,EACC,QAAA,kBAAAzC,gBAAC0C,kBAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA5C,cAAAA,CAAC6C,6BAAe,OAAA,EAAO,IAAA,EACrB,0BAAA7C,cAAAA,CAAC8C,sBAAA,EAAA,EAAW,SAAA,EAAU,iEAAA,EAAkE,CAAA,EAC1F,CAAA;AAAA,wBACA9C,cAAAA,CAAC+C,yBAAA,EAAA,EAAe,IAAA,EAAK,OAAM,SAAA,EAAU,UAAA,EACnC,QAAA,kBAAA/C,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,KAAA,CAAM,aAAY,CAAA,EAC5C;AAAA,OAAA,EACF,CAAA,EACF;AAAA,KAAA,EAEJ,CAAA;AAAA,oBACAA,cAAAA;AAAA,MAACQ,gBAAAA;AAAA,MAAA;AAAA,QACC,IAAI,KAAA,CAAM,IAAA;AAAA,QACV,KAAA,EAAO,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,IAAK,EAAA;AAAA,QAC/B,QAAA,EAAU,CAAC,CAAA,KAA2C,iBAAA,CAAkB,MAAM,IAAA,EAAM,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,QAClG,WAAA,EAAa,SAAS,KAAA,CAAM,IAAI,GAAG,KAAA,CAAM,QAAA,GAAW,KAAK,aAAa,CAAA,CAAA;AAAA,QACtE,SAAA,EAAU;AAAA;AAAA;AACZ,GAAA,EACF,CAAA,EA3BqB,gBAAA,CAAA;AA+BvB,EAAA,MAAM,iCAAiBlB,wBAAA,CAAA,CAAC,EAAE,MAAA,EAAQ,KAAA,EAAO,cAAa,KAIhD;AACJ,IAAA,IAAI,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEhC,IAAA,uBACEY,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC,SAAI,SAAA,EAAU,mCAAA,EACb,0BAAAE,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EACb,QAAA,EAAA;AAAA,wBAAAF,eAACC,gBAAAA,EAAA,EAAM,SAAS,YAAA,EAAc,SAAA,EAAU,WAAW,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACzDC,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,UAAA,MAAA,CAAO,MAAA;AAAA,UAAO,YAAA;AAAA,UAAW,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM;AAAA,SAAA,EACxD;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBACAF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDAAA,EACZ,iBAAO,GAAA,CAAI,CAAC,KAAA,qBACXA,eAAC,cAAA,EAAA,EAAgC,KAAA,EAAA,EAAZ,KAAA,CAAM,IAAoB,CAChD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ,CAAA,EAxBuB,gBAAA,CAAA;AA0BvB,EAAA,uBACEA,cAAAA,CAAC2C,0BAAA,EAAA,EACC,QAAA,kBAAAzC,eAAAA,CAACE,iBAAA,EACC,QAAA,EAAA;AAAA,oBAAAJ,cAAAA,CAACyB,uBAAA,EAAW,SAAA,EAAU,QACpB,QAAA,kBAAAvB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC0B,oBAAAA,EAAA,EAAU,SAAA,EAAU,2BAA0B,QAAA,EAAA,oBAAA,EAAkB,CAAA;AAAA,sBACjExB,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA;AAAA,QAAA,WAAA,oBACCF,cAAAA;AAAA,UAACe,iBAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,kBAAA;AAAA,YACT,SAAA,EAAU,SAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA,SAED;AAAA,wBAEFf,cAAAA;AAAA,UAACe,iBAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,eAAA;AAAA,YACT,SAAA,EAAU,SAAA;AAAA,YACX,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF;AAAA,KAAA,EACF,CAAA,EACF,CAAA;AAAA,oBAEAb,eAAAA,CAACG,sBAAAA,EAAA,EAAY,WAAU,WAAA,EAEnB,QAAA,EAAA;AAAA,MAAA,cAAA,CAAe,MAAA,GAAS,cAAA,CAAe,MAAA,GAAU,EAAA,mBACjDH,gBAAC8C,eAAA,EAAA,EAAK,KAAA,EAAO,SAAA,EAAW,aAAA,EAAe,YAAA,EACrC,QAAA,EAAA;AAAA,wBAAA9C,eAAAA,CAAC+C,mBAAA,EAAA,EAAS,SAAA,EAAU,yBAAA,EAClB,QAAA,EAAA;AAAA,0BAAA/C,eAAAA,CAACgD,sBAAA,EAAA,EAAY,KAAA,EAAM,UAAA,EAAW,WAAU,SAAA,EAAU,QAAA,EAAA;AAAA,YAAA,YAAA;AAAA,YACrC,cAAA,CAAe,MAAA;AAAA,YAAO;AAAA,WAAA,EACnC,CAAA;AAAA,0BACAhD,eAAAA,CAACgD,sBAAA,EAAA,EAAY,KAAA,EAAM,UAAA,EAAW,WAAU,SAAA,EAAU,QAAA,EAAA;AAAA,YAAA,YAAA;AAAA,YACrC,cAAA,CAAe,MAAA;AAAA,YAAO;AAAA,WAAA,EACnC;AAAA,SAAA,EACF,CAAA;AAAA,wBAEAlD,cAAAA,CAACmD,sBAAA,EAAA,EAAY,OAAM,UAAA,EAAW,SAAA,EAAU,aACtC,QAAA,kBAAAnD,cAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,cAAA;AAAA,YACR,KAAA,EAAM,UAAA;AAAA,YACN,YAAA,EAAa;AAAA;AAAA,SACf,EACF,CAAA;AAAA,wBAEAA,cAAAA,CAACmD,sBAAA,EAAA,EAAY,OAAM,UAAA,EAAW,SAAA,EAAU,aACtC,QAAA,kBAAAnD,cAAAA;AAAA,UAAC,cAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,cAAA;AAAA,YACR,KAAA,EAAM,UAAA;AAAA,YACN,YAAA,EAAa;AAAA;AAAA,SACf,EACF;AAAA,OAAA,EACF,CAAA;AAAA;AAAA,wBAGAE,eAAAA,CAACkD,oBAAA,EAAA,EAAU,IAAA,EAAK,YAAW,YAAA,EAAc,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,CAAC,UAAU,CAAA,GAAI,CAAC,UAAU,CAAA,EAC5F,QAAA,EAAA;AAAA,UAAA,cAAA,CAAe,SAAS,CAAA,oBACvBlD,eAAAA,CAACmD,wBAAA,EAAA,EAAc,OAAM,UAAA,EACnB,QAAA,EAAA;AAAA,4BAAArD,cAAAA,CAACsD,+BAAiB,SAAA,EAAU,yBAAA,EAC1B,0BAAApD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EACb,QAAA,EAAA;AAAA,8BAAAF,eAACC,gBAAAA,EAAA,EAAM,SAAQ,aAAA,EAAc,SAAA,EAAU,WAAU,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,8BACzDC,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,gBAAA,cAAA,CAAe,MAAA;AAAA,gBAAO,YAAA;AAAA,gBAAW,cAAA,CAAe,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM;AAAA,eAAA,EACxE;AAAA,aAAA,EACF,CAAA,EACF,CAAA;AAAA,4BACAF,eAACuD,2BAAA,EAAA,EACC,QAAA,kBAAAvD,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DACZ,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,KAAA,qBACnBA,eAAC,cAAA,EAAA,EAAgC,KAAA,EAAA,EAAZ,MAAM,IAAoB,CAChD,GACH,CAAA,EACF;AAAA,WAAA,EACF,CAAA;AAAA,UAGD,eAAe,MAAA,GAAS,CAAA,oBACvBE,eAAAA,CAACmD,wBAAA,EAAA,EAAc,OAAM,UAAA,EACnB,QAAA,EAAA;AAAA,4BAAArD,cAAAA,CAACsD,+BAAiB,SAAA,EAAU,yBAAA,EAC1B,0BAAApD,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,6BAAA,EACb,QAAA,EAAA;AAAA,8BAAAF,eAACC,gBAAAA,EAAA,EAAM,SAAQ,WAAA,EAAY,SAAA,EAAU,WAAU,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,8BACvDC,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EACb,QAAA,EAAA;AAAA,gBAAA,cAAA,CAAe,MAAA;AAAA,gBAAO,YAAA;AAAA,gBAAW,cAAA,CAAe,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM;AAAA,eAAA,EACxE;AAAA,aAAA,EACF,CAAA,EACF,CAAA;AAAA,4BACAF,eAACuD,2BAAA,EAAA,EACC,QAAA,kBAAAvD,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6DACZ,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,KAAA,qBACnBA,eAAC,cAAA,EAAA,EAAgC,KAAA,EAAA,EAAZ,MAAM,IAAoB,CAChD,GACH,CAAA,EACF;AAAA,WAAA,EACF;AAAA,SAAA,EAEJ;AAAA,OAAA;AAAA,MAID,WAAA,oBACCE,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACb,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAAC0C,gBAAA,EAAA,EAAM,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,wBACzD1C,cAAAA;AAAA,UAACwD,mBAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,YACvC,QAAA,EAAQ,IAAA;AAAA,YACR,SAAA,EAAU,mBAAA;AAAA,YACV,IAAA,EAAM;AAAA;AAAA,SACR;AAAA,wBACAxD,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,+FAAA,EAE7C;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA,EACF,CAAA;AAEJ,CAAA,EAxO+C,uBAAA,CAAA;ACLxC,IAAM,iCAA2BV,wBAAA,CAAA,MAAM;AAC5C,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,MACEO,sCAAA,EAAqB;AAEzB,EAAA,MAAM,cAAc,KAAA,CAAM,WAAA,GAAc4D,6BAAA,CAAY,KAAA,CAAM,WAAW,CAAA,GAAI,IAAA;AAGzE,EAAA,MAAM,sCAAsBnE,wBAAA,CAAA,MAAM;AAChC,IAAA,IAAI,CAAC,KAAA,CAAM,UAAA,EAAY,OAAO,EAAA;AAE9B,IAAA,MAAM,SAAS,KAAA,CAAM,cAAA,GAAiBoE,iCAAe,OAAA,EAAS,KAAA,CAAM,cAAc,CAAA,GAAI,IAAA;AACtF,IAAA,MAAM,OAAA,GAAUC,qCAAA,CAAoB,KAAA,CAAM,cAAc,CAAA;AAExD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,CAAQ,WAAW,CAAA,GAAI,MAAA,CAAO,EAAA,IAAM,EAAA;AAAA,IACtC;AAEA,IAAA,IAAI,OAAO,CAAA,QAAA,EAAW,KAAA,CAAM,aAAa,CAAA,EAAA,EAAK,MAAM,UAAU,CAAA,CAAA,CAAA;AAG9D,IAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,MAAA,IAAA,IAAQ,CAAA;AAAA,MAAA,EAAc,GAAG,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,IACrC,CAAC,CAAA;AAGD,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,aAAA,KAAkB,SAAS,WAAA,EAAa;AACrE,MAAA,IAAA,IAAQ,CAAA;AAAA,MAAA,EAAc,MAAM,WAAW,CAAA,CAAA,CAAA;AAAA,IACzC;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAvB4B,qBAAA,CAAA;AAyB5B,EAAA,MAAM,cAAc,mBAAA,EAAoB;AAExC,EAAA,MAAM,iBAAA,GAAoB/D,kBAAY,YAAY;AAChD,IAAA,MAAM,WAAA,EAAY;AAAA,EACpB,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,uBACEM,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAEZ,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,gBAAA,oBAAoBF,cAAAA,CAAC,YAAA,EAAA,EAAa,CAAA;AAAA,IAGxC,KAAA,CAAM,gBAAA,oBACLA,cAAAA,CAAC,qBAAA,EAAA,EAAsB,CAAA;AAAA,IAIxB,KAAA,CAAM,kBAAkB,KAAA,oBACvBE,gBAACE,eAAAA,EAAA,EAAK,WAAU,EAAA,EACd,QAAA,EAAA;AAAA,sBAAAJ,cAAAA,CAACyB,qBAAAA,EAAA,EACC,QAAA,kBAAAzB,cAAAA,CAAC0B,sBAAA,EAAU,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,cAAA,EAAY,CAAA,EAC7D,CAAA;AAAA,sBACAxB,eAAAA,CAACG,sBAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAL,cAAAA;AAAA,UAACwD,mBAAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAY,0BAAA;AAAA,YACZ,OAAO,KAAA,CAAM,WAAA;AAAA,YACb,UAAU,CAAC,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YAC9C,SAAA,EAAW,CAAA,mBAAA,EACT,CAAC,WAAA,GAAc,uBAAuB,EACxC,CAAA,CAAA;AAAA,YACA,IAAA,EAAM;AAAA;AAAA,SACR;AAAA,QACC,CAAC,WAAA,oBACAxD,eAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iCAAgC,QAAA,EAAA,qBAAA,EAAmB;AAAA,OAAA,EAEpE;AAAA,KAAA,EACF,CAAA;AAAA,oBAIFE,eAAAA,CAACE,eAAAA,EAAA,EAAK,WAAU,EAAA,EACd,QAAA,EAAA;AAAA,sBAAAJ,cAAAA,CAACyB,uBAAA,EACC,QAAA,kBAAAvB,gBAACwB,oBAAAA,EAAA,EAAU,WAAU,qDAAA,EACnB,QAAA,EAAA;AAAA,wBAAA1B,cAAAA,CAAC4D,eAAA,EAAA,EAAI,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,wBACzB5D,cAAAA,CAAC,MAAA,EAAA,EAAK,QAAA,EAAA,cAAA,EAAY;AAAA,OAAA,EACpB,CAAA,EACF,CAAA;AAAA,sBACAA,eAACK,sBAAAA,EAAA,EACC,0BAAAH,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iDAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,QAAA,EACb,QAAA,EAAA;AAAA,0BAAAF,cAAAA;AAAA,YAACQ,gBAAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,WAAA,EAAY,kDAAA;AAAA,cACZ,OAAO,KAAA,CAAM,cAAA;AAAA,cACb,UAAU,CAAC,CAAA,KAAM,iBAAA,CAAkB,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,cACjD,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BACAR,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCAAqC,QAAA,EAAA,gDAAA,EAElD;AAAA,SAAA,EACF,CAAA;AAAA,wBACAA,cAAAA;AAAA,UAACe,iBAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,iBAAA;AAAA,YACT,UAAU,KAAA,CAAM,OAAA,IAAW,CAAC,KAAA,CAAM,cAAc,CAAC,WAAA;AAAA,YACjD,SAAA,EAAU,gFAAA;AAAA,YAET,QAAA,EAAA,KAAA,CAAM,OAAA,mBACLb,eAAAA,CAAA2D,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAA7D,cAAAA,CAAC8D,mBAAA,EAAA,EAAQ,SAAA,EAAU,sBAAA,EAAuB,CAAA;AAAA,8BAC1C9D,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,QAAA,EAAA,YAAA,EAAU;AAAA,aAAA,EAC/C,CAAA,mBAEAE,eAAAA,CAAA2D,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,8BAAA7D,cAAAA,CAAC4B,gBAAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,8BAC1B5B,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,QAAA,EAAA,cAAA,EAAY;AAAA,aAAA,EACjD;AAAA;AAAA;AAEJ,OAAA,EACF,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,IAGC,WAAA,oBACCE,eAAAA,CAACE,eAAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAJ,eAACyB,qBAAAA,EAAA,EACC,0BAAAvB,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACb,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAAC0B,oBAAAA,EAAA,EAAU,SAAA,EAAU,2BAA0B,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,wBAC3D1B,cAAAA;AAAA,UAACkC,qBAAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,WAAA;AAAA,YACP,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACN,QAAA,EAAA;AAAA;AAAA;AAED,OAAA,EACF,CAAA,EACF,CAAA;AAAA,sBACAlC,cAAAA,CAACK,sBAAAA,EAAA,EACG,QAAA,kBAAAL,cAAAA,CAAC+D,oCAAA,EAAA,EAAW,IAAA,EAAM,WAAA,EAAa,QAAA,EAAS,MAAA,EAAO,CAAA,EACnD;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAA,EA7IwC,gBAAA,CAAA;ACFjC,IAAM,iCAA2BzE,wBAAA,CAAA,MAAM;AAC1C,EAAA,MAAM,EAAE,KAAA,EAAM,GAAIO,sCAAA,EAAqB;AACvC,EAAA,MAAM,EAAE,UAAS,GAAI,KAAA;AAGrB,EAAA,MAAM,YAAA,GAAeJ,cAAQ,MAAM;AAC/B,IAAA,IAAI,CAAC,QAAA,EAAU,IAAA,EAAM,OAAO,EAAA;AAC5B,IAAA,OAAO,OAAO,QAAA,CAAS,IAAA,KAAS,QAAA,GAAW,QAAA,CAAS,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAAA,EACpG,CAAA,EAAG,CAAC,QAAA,EAAU,IAAI,CAAC,CAAA;AAEnB,EAAA,MAAM,sBAAA,GAAyBG,kBAAY,MAAM;AAC7C,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,YAAY,CAAA,EAAG,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAA;AAClE,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AACpC,IAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,IAAA,CAAA,CAAE,IAAA,GAAO,GAAA;AACT,IAAA,CAAA,CAAE,QAAA,GAAW,eAAA;AACb,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,CAAA,CAAE,KAAA,EAAM;AACR,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,IAAI,CAAC,QAAA,EAAU;AACX,IAAA,uBACIM,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACX,QAAA,kBAAAA,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAwC,QAAA,EAAA,UAAA,EAAQ,CAAA,EAClE,CAAA;AAAA,sBACAA,cAAAA,CAACI,eAAAA,EAAA,EACG,QAAA,kBAAAJ,eAACK,sBAAAA,EAAA,EAAY,SAAA,EAAU,uCAAA,EACnB,0BAAAL,cAAAA,CAAC,GAAA,EAAA,EAAE,WAAU,+BAAA,EAAgC,QAAA,EAAA,2DAAA,EAAyD,GAC1G,CAAA,EACJ;AAAA,KAAA,EACJ,CAAA;AAAA,EAER;AAEA,EAAA,uBACIE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACX,QAAA,EAAA;AAAA,sBAAAF,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAwC,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,sBAC9DE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACX,QAAA,EAAA;AAAA,wBAAAF,cAAAA,CAACkC,uBAAA,EAAW,KAAA,EAAO,cAAc,OAAA,EAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,QAAA,EAAA,MAAA,EAE7D,CAAA;AAAA,wBACAhC,gBAACa,iBAAAA,EAAA,EAAO,SAAQ,SAAA,EAAU,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,sBAAA,EACzC,QAAA,EAAA;AAAA,0BAAAf,cAAAA,CAACgE,oBAAA,EAAA,EAAS,SAAA,EAAU,SAAA,EAAU,CAAA;AAAA,0BAC9BhE,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oBAAmB,QAAA,EAAA,UAAA,EAAQ;AAAA,SAAA,EAC/C;AAAA,OAAA,EACJ;AAAA,KAAA,EACJ,CAAA;AAAA,oBAGAE,eAAAA,CAACE,eAAAA,EAAA,EACG,QAAA,EAAA;AAAA,sBAAAJ,cAAAA,CAACyB,qBAAAA,EAAA,EACG,QAAA,kBAAAzB,cAAAA,CAAC0B,sBAAA,EAAU,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,sBAAA,EAAoB,CAAA,EACvE,CAAA;AAAA,sBACAxB,eAAAA,CAACG,sBAAAA,EAAA,EAAY,WAAU,WAAA,EACnB,QAAA,EAAA;AAAA,wBAAAH,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uCAAA,EACX,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACX,QAAA,EAAA;AAAA,8BAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,8BAClEA,cAAAA;AAAA,gBAACC,gBAAAA;AAAA,gBAAA;AAAA,kBACG,OAAA,EAASwC,gCAAA,CAAe,QAAA,CAAS,MAAA,IAAU,CAAC,CAAA,KAAM,SAAA,GAAY,SAAA,GAC1DA,gCAAA,CAAe,QAAA,CAAS,MAAA,IAAU,CAAC,CAAA,KAAM,UAAU,aAAA,GAAgB,WAAA;AAAA,kBACvE,SAAA,EAAU,SAAA;AAAA,kBAET,QAAA,EAAA,QAAA,CAAS;AAAA;AAAA;AACd,aAAA,EACJ,CAAA;AAAA,YACC,SAAS,UAAA,oBACNvC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,mCAAA,EACX,QAAA,EAAA;AAAA,8BAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA,cAAA,EAAY,CAAA;AAAA,8BAClEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,mBAAS,UAAA,EAAW;AAAA,aAAA,EACzE;AAAA,WAAA,EAER,CAAA;AAAA,0BAEAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACX,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACX,QAAA,EAAA;AAAA,8BAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA,gBAAA,EAAc,CAAA;AAAA,8BACpEA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EACX,iBAAO,QAAA,CAAS,IAAA,KAAS,QAAA,GAAW,MAAA,GAAS,MAAA,EAClD;AAAA,aAAA,EACJ,CAAA;AAAA,4BACAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACX,QAAA,EAAA;AAAA,8BAAAF,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qCAAA,EAAsC,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,8BAChEE,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EACX,QAAA,EAAA;AAAA,gBAAA,OAAO,QAAA,CAAS,IAAA,KAAS,QAAA,GAAW,QAAA,CAAS,IAAA,CAAK,SAAS,IAAA,CAAK,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,CAAE,MAAA;AAAA,gBAAO;AAAA,eAAA,EACrG;AAAA,aAAA,EACJ;AAAA,WAAA,EACJ;AAAA,SAAA,EACJ,CAAA;AAAA,QAEC,QAAA,CAAS,KAAA,oBACNF,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4DAAA,EACX,QAAA,kBAAAE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACX,QAAA,EAAA;AAAA,0BAAAF,cAAAA,CAACiE,mBAAA,EAAA,EAAQ,SAAA,EAAU,0BAAA,EAA2B,CAAA;AAAA,0BAC9CjE,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,0BAAA,EAA4B,mBAAS,KAAA,EAAM;AAAA,SAAA,EAC5D,CAAA,EACJ;AAAA,OAAA,EAER;AAAA,KAAA,EACJ,CAAA;AAAA,oBAGAA,cAAAA,CAACI,eAAAA,EAAA,EACG,QAAA,kBAAAJ,eAACK,sBAAAA,EAAA,EAAY,SAAA,EAAU,KAAA,EACjB,QAAA,EAAA,CAAA,MAAM;AAEJ,MAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,KAAW,GAAA;AAClC,MAAA,MAAM,SAAA,GAAY,OAAO,QAAA,CAAS,IAAA,KAAS,QAAA;AAE3C,MAAA,IAAI,SAAS,SAAA,EAAW;AACpB,QAAA,uBACIL,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACX,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EACR,QAAA,EAAA,KAAA,GACK,+CAAA,GACA,+CACV,CAAA,EACJ,CAAA;AAAA,MAER;AAEA,MAAA,IAAI,SAAS,IAAA,EAAM;AACf,QAAA,uBACIA,cAAAA;AAAA,UAACkE,kCAAA;AAAA,UAAA;AAAA,YACG,KAAA,EAAM,eAAA;AAAA,YACN,MAAM,QAAA,CAAS,IAAA;AAAA,YACf,MAAA,EAAQ;AAAA;AAAA,cAEJ,kBAAA,EAAoB,CAAA;AAAA,cACpB,uBAAA,EAAyB,EAAA;AAAA,cACzB,uBAAA,EAAyB,CAAA;AAAA,cACzB,eAAA,EAAiB,GAAA;AAAA,cACjB,eAAA,EAAiB,EAAA;AAAA,cACjB,kBAAA,EAAoB,IAAA;AAAA,cACpB,kBAAA,EAAoB,IAAA;AAAA,cACpB,iBAAA,EAAmB,KAAA;AAAA;AAAA,cACnB,gBAAA,EAAkB,IAAA;AAAA,cAClB,SAAA,EAAW;AAAA;AACf;AAAA,SACJ;AAAA,MAER;AAEA,MAAA,uBACIlE,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACX,QAAA,kBAAAA,cAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,4BAAA,EAA0B,CAAA,EAC3E,CAAA;AAAA,IAER,CAAA,KACJ,CAAA,EACJ;AAAA,GAAA,EAEJ,CAAA;AAER,CAAA,EA/JwC,gBAAA,CAAA;ACCjC,IAAM,mCAA6BV,wBAAA,CAAA,MAAM;AAC9C,EAAA,MAAM,EAAE,KAAA,EAAO,cAAA,EAAe,GAAIO,sCAAA,EAAqB;AACvD,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,SAAA,EAAU;AAE/B,EAAA,MAAM,oCAAoBP,wBAAA,CAAA,MAAM;AAC9B,IAAA,QAAQ,MAAM,WAAA;AAAa,MACzB,KAAK,WAAA;AACH,QAAA,uBAAOU,eAAC,gBAAA,EAAA,EAAiB,CAAA;AAAA,MAC3B,KAAK,SAAA;AACH,QAAA,uBAAOA,eAAC,cAAA,EAAA,EAAe,CAAA;AAAA,MACzB,KAAK,UAAA;AACH,QAAA,uBAAOA,eAAC,cAAA,EAAA,EAAe,CAAA;AAAA,MACzB;AACE,QAAA,uBAAOA,eAAC,gBAAA,EAAA,EAAiB,CAAA;AAAA;AAC7B,EACF,CAAA,EAX0B,mBAAA,CAAA;AAa1B,EAAA,uBACEE,gBAAC,KAAA,EAAA,EAEC,QAAA,EAAA;AAAA,oBAAAF,eAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YACb,QAAA,kBAAAA,cAAAA,CAAC,SAAI,SAAA,EAAU,6BAAA,EACb,QAAA,kBAAAA,cAAAA,CAAC,SAAI,SAAA,EAAU,mCAAA,EAEZ,qCACCE,eAAAA,CAAA2D,qBAAA,EACE,QAAA,EAAA;AAAA,sBAAA3D,gBAACiE,gBAAA,EAAA,EAAM,IAAA,EAAM,KAAA,CAAM,WAAA,EAAa,cAAc,cAAA,EAC5C,QAAA,EAAA;AAAA,wBAAAnE,eAACoE,uBAAA,EAAA,EAAa,OAAA,EAAO,MACnB,QAAA,kBAAApE,cAAAA,CAACe,mBAAA,EAAO,OAAA,EAAQ,OAAA,EAAQ,IAAA,EAAK,MAC3B,QAAA,kBAAAf,cAAAA,CAACqE,oBAAK,SAAA,EAAU,SAAA,EAAU,GAC5B,CAAA,EACF,CAAA;AAAA,wBACArE,cAAAA,CAACsE,uBAAA,EAAA,EAAa,IAAA,EAAK,MAAA,EAAO,SAAA,EAAU,MAAA,EAClC,QAAA,kBAAApE,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mCAAA,EACb,QAAA,EAAA;AAAA,4BAAAF,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,uCAAA,EAAwC,QAAA,EAAA,YAAA,EAAU,CAAA;AAAA,4BAChEA,cAAAA;AAAA,cAACe,iBAAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,OAAA;AAAA,gBACR,IAAA,EAAK,IAAA;AAAA,gBACL,OAAA,EAAS,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,gBAEnC,QAAA,kBAAAf,cAAAA,CAACuE,aAAA,EAAA,EAAE,SAAA,EAAU,SAAA,EAAU;AAAA;AAAA;AACzB,WAAA,EACF,CAAA;AAAA,0BACAvE,eAAC,iBAAA,EAAA,EAAkB;AAAA,SAAA,EACrB,CAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBACAA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gDAAA,EAAkD,gBAAM,WAAA,EAAY,CAAA;AAAA,sBACpFA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,KAAA,EAAM,CAAA;AAAA,MAAE;AAAA,KAAA,EACzB,oBAEAA,cAAAA,CAAC,iBAAA,EAAA,EAAkB,CAAA,EAEvB,GACF,CAAA,EACF,CAAA;AAAA,oBAGAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,6BAAkB,EACrB,CAAA;AAAA,IAGC,QAAA,IAAY,MAAM,WAAA,KAAgB,SAAA,oBACjCA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,kBAAAA,cAAAA;AAAA,MAACe,iBAAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,IAAA;AAAA,QACL,SAAA,EAAU,wBAAA;AAAA,QACX,QAAA,EAAA;AAAA;AAAA,KAED,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAA,EA5E0C,kBAAA","file":"PlaygroundLayout-XYMJBNT4.cjs","sourcesContent":["import { useIsMobile } from '@djangocfg/ui-core/hooks';\n\nexport const useMobile = () => {\n const isMobile = useIsMobile();\n\n return {\n isMobile,\n isDesktop: !isMobile,\n };\n}; ","'use client';\n\nimport consola from 'consola';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { ApiEndpoint, OpenApiSchema, SchemaSource, UseOpenApiSchemaReturn } from '../types';\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)\nconst extractEndpoints = (schema: OpenApiSchema): ApiEndpoint[] => {\n const endpoints: ApiEndpoint[] = [];\n\n if (!schema.paths) return [];\n\n // Get base URL from servers\n const baseUrl = schema.servers && schema.servers.length > 0 ? schema.servers[0].url : '';\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 description = op.description || op.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\n let requestBody: { type: string; description?: string } | undefined;\n if (op.requestBody) {\n const content = op.requestBody.content;\n const mediaType = content?.['application/json'] || content?.[Object.keys(content || {})[0]];\n requestBody = {\n type: mediaType?.schema?.type || 'object',\n description: op.requestBody.description,\n };\n }\n\n const endpoint: ApiEndpoint = {\n name: path.split('/').pop() || path,\n method: methodUpper,\n path: baseUrl + path,\n description,\n category,\n parameters: parameters.length > 0 ? parameters : undefined,\n requestBody,\n responses: responses.length > 0 ? responses : undefined,\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}\n\nexport default function useOpenApiSchema({\n schemas,\n defaultSchemaId,\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\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 const endpoints = useMemo(\n () => (currentOpenApiSchema ? extractEndpoints(currentOpenApiSchema) : []),\n [currentOpenApiSchema]\n );\n\n const categories = useMemo(() => getCategories(endpoints), [endpoints]);\n\n // Load schema when current schema changes\n useEffect(() => {\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]);\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 setCurrentSchema,\n refresh,\n };\n}\n","'use client';\n\nimport {\n Code, Filter, Grid3X3, List, Search,\n} from 'lucide-react';\nimport React, { useMemo } from 'react';\n\nimport {\n Badge, Button, Card, CardContent, CardHeader, CardTitle, Combobox, DownloadButton, Input,\n Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Skeleton, Table, TableBody,\n TableCell, TableHead, TableHeader, TableRow\n} from '@djangocfg/ui-core/components';\n\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\nimport useOpenApiSchema from '../hooks/useOpenApiSchema';\nimport { deduplicateEndpoints } from '../utils/versionManager';\n\nimport type { ApiEndpoint } from '../types';\n\n// Method color mapping for badges\nconst METHOD_BADGE_VARIANTS: Record<string, string> = {\n GET: 'bg-emerald-500/15 text-emerald-600 dark:text-emerald-400 border-emerald-500/20',\n POST: 'bg-blue-500/15 text-blue-600 dark:text-blue-400 border-blue-500/20',\n PUT: 'bg-amber-500/15 text-amber-600 dark:text-amber-400 border-amber-500/20',\n PATCH: 'bg-orange-500/15 text-orange-600 dark:text-orange-400 border-orange-500/20',\n DELETE: 'bg-red-500/15 text-red-600 dark:text-red-400 border-red-500/20',\n};\n\nexport const EndpointsLibrary: React.FC = () => {\n const { state, config, setSelectedEndpoint, setSelectedCategory, setSearchTerm } = usePlaygroundContext();\n const { endpoints, categories, loading, error, schemas, currentSchema, setCurrentSchema } = useOpenApiSchema({\n schemas: config.schemas,\n defaultSchemaId: config.defaultSchemaId,\n });\n const [viewMode, setViewMode] = React.useState<'table' | 'grid'>('table');\n\n const getRelativePath = (fullPath: string): string => {\n try {\n const url = new URL(fullPath);\n return url.pathname;\n } catch {\n return fullPath;\n }\n };\n\n const filteredEndpoints = useMemo(() => {\n let filtered = deduplicateEndpoints(endpoints, state.selectedVersion);\n\n if (state.selectedCategory && state.selectedCategory !== 'All') {\n filtered = filtered.filter((endpoint) => endpoint.category === state.selectedCategory);\n }\n\n if (state.searchTerm) {\n const searchLower = state.searchTerm.toLowerCase();\n filtered = filtered.filter(\n (endpoint) =>\n endpoint.name.toLowerCase().includes(searchLower) ||\n endpoint.description.toLowerCase().includes(searchLower) ||\n endpoint.path.toLowerCase().includes(searchLower)\n );\n }\n\n return filtered;\n }, [endpoints, state.selectedCategory, state.searchTerm, state.selectedVersion]);\n\n const schemaOptions = useMemo(() =>\n schemas.map((s) => ({ value: s.id, label: s.name })),\n [schemas]\n );\n\n const getMethodBadge = (method: string) => (\n <Badge\n key={method}\n variant=\"outline\"\n className={`text-xs font-mono font-semibold ${METHOD_BADGE_VARIANTS[method.toUpperCase()] || ''}`}\n >\n {method}\n </Badge>\n );\n\n if (loading) {\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-9 w-44\" />\n <Skeleton className=\"h-9 flex-1 max-w-xs\" />\n <div className=\"flex-1\" />\n <Skeleton className=\"h-9 w-24\" />\n </div>\n <div className=\"space-y-1\">\n {Array.from({ length: 8 }).map((_, i) => (\n <Skeleton key={i} className=\"h-12 w-full\" />\n ))}\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"space-y-3\">\n <Card className=\"bg-destructive/10 border-destructive/20\">\n <CardContent className=\"p-4\">\n <p className=\"text-sm text-destructive\">Failed to load schema: {error}</p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-3\">\n {/* Toolbar — single row */}\n <div className=\"flex items-center gap-2 flex-wrap\">\n {/* Left: Schema selector */}\n {schemas.length > 1 && (\n <Combobox\n options={schemaOptions}\n value={currentSchema?.id || ''}\n onValueChange={(id) => id && setCurrentSchema(id)}\n placeholder=\"Select API\"\n searchPlaceholder=\"Search APIs...\"\n emptyText=\"No APIs found\"\n className=\"w-44\"\n />\n )}\n\n {/* Search */}\n <div className=\"relative flex-1 max-w-xs\">\n <Search className=\"absolute left-2.5 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Search...\"\n value={state.searchTerm}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearchTerm(e.target.value)}\n className=\"h-9 pl-8 text-sm\"\n />\n </div>\n\n {/* Category filter */}\n <Select value={state.selectedCategory} onValueChange={setSelectedCategory}>\n <SelectTrigger className=\"w-auto h-9 gap-1.5\">\n <Filter className=\"h-3.5 w-3.5\" />\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"All\">All</SelectItem>\n {categories.map((category) => (\n <SelectItem key={category} value={category}>\n {category}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n\n {/* Spacer */}\n <div className=\"flex-1\" />\n\n {/* Right: View toggle + count + download */}\n <span className=\"text-xs text-muted-foreground tabular-nums hidden sm:inline\">\n {filteredEndpoints.length} endpoint{filteredEndpoints.length !== 1 ? 's' : ''}\n </span>\n\n <div className=\"flex items-center border rounded-md\">\n <Button\n variant={viewMode === 'table' ? 'default' : 'ghost'}\n size=\"icon\"\n className=\"h-8 w-8 rounded-r-none\"\n onClick={() => setViewMode('table')}\n >\n <List className=\"h-3.5 w-3.5\" />\n </Button>\n <Button\n variant={viewMode === 'grid' ? 'default' : 'ghost'}\n size=\"icon\"\n className=\"h-8 w-8 rounded-l-none\"\n onClick={() => setViewMode('grid')}\n >\n <Grid3X3 className=\"h-3.5 w-3.5\" />\n </Button>\n </div>\n\n {currentSchema && (\n <DownloadButton\n url={currentSchema.url}\n filename={`${currentSchema.id}-openapi.json`}\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8\"\n >\n <span className=\"hidden sm:inline\">Schema</span>\n </DownloadButton>\n )}\n </div>\n\n {/* Endpoints list */}\n {viewMode === 'table' ? (\n <Card>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead className=\"w-20 text-foreground\">Method</TableHead>\n <TableHead className=\"text-foreground\">Path</TableHead>\n <TableHead className=\"text-foreground hidden lg:table-cell\">Description</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {filteredEndpoints.length === 0 ? (\n <TableRow>\n <TableCell colSpan={3} className=\"text-center py-12 text-muted-foreground\">\n No endpoints found\n </TableCell>\n </TableRow>\n ) : (\n filteredEndpoints.map((endpoint) => (\n <TableRow\n key={`${endpoint.method}-${endpoint.path}`}\n className={`cursor-pointer transition-colors hover:bg-muted/50 ${\n state.selectedEndpoint?.path === endpoint.path &&\n state.selectedEndpoint?.method === endpoint.method\n ? 'bg-primary/5'\n : ''\n }`}\n onClick={() => setSelectedEndpoint(endpoint)}\n >\n <TableCell className=\"py-2.5\">\n {getMethodBadge(endpoint.method)}\n </TableCell>\n <TableCell className=\"font-mono text-sm text-muted-foreground py-2.5\">\n {getRelativePath(endpoint.path)}\n </TableCell>\n <TableCell className=\"text-sm text-muted-foreground max-w-sm truncate py-2.5 hidden lg:table-cell\">\n {endpoint.description}\n </TableCell>\n </TableRow>\n ))\n )}\n </TableBody>\n </Table>\n </Card>\n ) : (\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-3\">\n {filteredEndpoints.length === 0 ? (\n <div className=\"col-span-full text-center py-12 text-muted-foreground\">\n No endpoints found\n </div>\n ) : (\n filteredEndpoints.map((endpoint) => (\n <Card\n key={`${endpoint.method}-${endpoint.path}`}\n className={`cursor-pointer transition-all hover:shadow-md ${\n state.selectedEndpoint?.path === endpoint.path &&\n state.selectedEndpoint?.method === endpoint.method\n ? 'ring-2 ring-primary'\n : ''\n }`}\n onClick={() => setSelectedEndpoint(endpoint)}\n >\n <CardHeader className=\"pb-2 pt-3 px-4\">\n <CardTitle className=\"flex items-center justify-between text-sm\">\n <span className=\"font-mono text-xs text-muted-foreground truncate\">\n {getRelativePath(endpoint.path)}\n </span>\n {getMethodBadge(endpoint.method)}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"px-4 pb-3 pt-0\">\n <p className=\"text-xs text-muted-foreground line-clamp-2\">\n {endpoint.description}\n </p>\n </CardContent>\n </Card>\n ))\n )}\n </div>\n )}\n </div>\n );\n};\n","'use client';\n\nimport { Check, ChevronLeft, ChevronRight, Code, FileText, Send } from 'lucide-react';\nimport React from 'react';\n\nimport { Badge, Button } from '@djangocfg/ui-core/components';\n\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\nimport { PlaygroundStep } from '../types';\n\nconst stepConfig = {\n endpoints: {\n title: 'Endpoints',\n icon: Code,\n description: 'Select API endpoint'\n },\n request: {\n title: 'Request',\n icon: Send,\n description: 'Configure request'\n },\n response: {\n title: 'Response',\n icon: FileText,\n description: 'View response'\n }\n};\n\nexport const PlaygroundStepper: React.FC = () => {\n const { state, setCurrentStep, goToNextStep, goToPreviousStep } = usePlaygroundContext();\n const { currentStep, steps } = state;\n\n const currentIndex = steps.indexOf(currentStep);\n const canGoNext = currentIndex < steps.length - 1;\n const canGoPrevious = currentIndex > 0;\n\n return (\n <div className=\"flex items-center justify-between w-full\">\n {/* Steps */}\n <div className=\"flex items-center space-x-4\">\n {steps.map((step, index) => {\n const config = stepConfig[step];\n const Icon = config.icon;\n const isActive = step === currentStep;\n const isCompleted = index < currentIndex;\n const isClickable = index <= currentIndex + 1;\n\n return (\n <div key={step} className=\"flex items-center space-x-2\">\n <Button\n variant={isActive ? 'default' : 'ghost'}\n size=\"sm\"\n onClick={() => isClickable && setCurrentStep(step)}\n className={`flex items-center space-x-2 ${isClickable ? 'cursor-pointer' : 'cursor-not-allowed opacity-50'\n }`}\n disabled={!isClickable}\n >\n {isCompleted ? (\n <Check className=\"h-4 w-4\" />\n ) : (\n <Icon className=\"h-4 w-4\" />\n )}\n <span className=\"hidden sm:inline\">{config.title}</span>\n </Button>\n\n {index < steps.length - 1 && (\n <div className=\"w-8 h-px bg-border\" />\n )}\n </div>\n );\n })}\n </div>\n\n {/* Navigation */}\n <div className=\"flex items-center space-x-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={goToPreviousStep}\n disabled={!canGoPrevious}\n className=\"flex items-center space-x-1\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Previous</span>\n </Button>\n\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={goToNextStep}\n disabled={!canGoNext}\n className=\"flex items-center space-x-1\"\n >\n <span className=\"hidden sm:inline\">Next</span>\n <ChevronRight className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n );\n}; ","'use client';\n\nimport { AlertCircle, ChevronDown, Code, Database, FileText } from 'lucide-react';\nimport React, { useMemo } from 'react';\n\nimport {\n Badge, Card, CardContent, CardHeader, CardTitle, Collapsible, CollapsibleContent,\n CollapsibleTrigger, CopyButton\n} from '@djangocfg/ui-core/components';\n\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\nimport { getMethodColor, getStatusColor } from '../utils';\n\nexport const EndpointInfo: React.FC = () => {\n const { state } = usePlaygroundContext();\n const { selectedEndpoint } = state;\n\n // Memoize endpoint JSON for copy\n const endpointJson = useMemo(() => {\n if (!selectedEndpoint) return '';\n return JSON.stringify({\n name: selectedEndpoint.name,\n method: selectedEndpoint.method,\n path: selectedEndpoint.path,\n description: selectedEndpoint.description,\n parameters: selectedEndpoint.parameters,\n requestBody: selectedEndpoint.requestBody,\n responses: selectedEndpoint.responses\n }, null, 2);\n }, [selectedEndpoint]);\n\n if (!selectedEndpoint) {\n return null;\n }\n\n const getMethodBadges = (methods: string) => {\n return methods.split(', ').map((method) => (\n <Badge key={method} variant={getMethodColor(method) === 'success' ? 'default' : 'secondary'} className=\"text-xs\">\n {method}\n </Badge>\n ));\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-foreground\">Selected Endpoint</h2>\n <CopyButton value={endpointJson} variant=\"outline\" size=\"sm\">\n Copy\n </CopyButton>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center justify-between text-sm text-foreground\">\n <div className=\"flex items-center space-x-2\">\n <Code className=\"h-4 w-4\" />\n <span className=\"font-medium\">{selectedEndpoint.name}</span>\n </div>\n <div className=\"flex space-x-1\">{getMethodBadges(selectedEndpoint.method)}</div>\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div>\n <p className=\"text-xs font-mono text-muted-foreground break-all\">\n {selectedEndpoint.path}\n </p>\n <p className=\"text-xs text-muted-foreground mt-1\">\n {selectedEndpoint.description}\n </p>\n </div>\n\n {/* Parameters */}\n {selectedEndpoint.parameters && selectedEndpoint.parameters.length > 0 && (\n <Collapsible>\n <CollapsibleTrigger className=\"flex items-center space-x-2 text-sm font-medium text-foreground\">\n <Database className=\"h-4 w-4\" />\n <span>Parameters ({selectedEndpoint.parameters.length})</span>\n <ChevronDown className=\"h-4 w-4\" />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"mt-2 space-y-2\">\n {selectedEndpoint.parameters.map((param, index) => (\n <div key={index} className=\"flex items-center space-x-2 text-xs\">\n <Badge variant={param.required ? 'destructive' : 'secondary'} className=\"text-xs\">\n {param.required ? 'Required' : 'Optional'}\n </Badge>\n <span className=\"font-mono text-muted-foreground\">\n {param.name}: {param.type}\n </span>\n {param.description && (\n <span className=\"text-muted-foreground\">- {param.description}</span>\n )}\n </div>\n ))}\n </CollapsibleContent>\n </Collapsible>\n )}\n\n {/* Request Body */}\n {selectedEndpoint.requestBody && (\n <Collapsible>\n <CollapsibleTrigger className=\"flex items-center space-x-2 text-sm font-medium text-foreground\">\n <FileText className=\"h-4 w-4\" />\n <span>Request Body</span>\n <ChevronDown className=\"h-4 w-4\" />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"mt-2\">\n <div className=\"text-xs text-muted-foreground\">\n <p>Type: {selectedEndpoint.requestBody.type}</p>\n {selectedEndpoint.requestBody.description && (\n <p className=\"mt-1\">{selectedEndpoint.requestBody.description}</p>\n )}\n </div>\n </CollapsibleContent>\n </Collapsible>\n )}\n\n {/* Responses */}\n {selectedEndpoint.responses && selectedEndpoint.responses.length > 0 && (\n <Collapsible>\n <CollapsibleTrigger className=\"flex items-center space-x-2 text-sm font-medium text-foreground\">\n <AlertCircle className=\"h-4 w-4\" />\n <span>Responses ({selectedEndpoint.responses.length})</span>\n <ChevronDown className=\"h-4 w-4\" />\n </CollapsibleTrigger>\n <CollapsibleContent className=\"mt-2 space-y-2\">\n {selectedEndpoint.responses.map((response, index) => {\n const statusColor = getStatusColor(parseInt(response.code));\n const badgeVariant = statusColor === 'success' ? 'default' :\n statusColor === 'error' ? 'destructive' : 'secondary';\n return (\n <div key={index} className=\"flex items-center space-x-2 text-xs\">\n <Badge variant={badgeVariant} className=\"text-xs\">\n {response.code}\n </Badge>\n <span className=\"text-muted-foreground\">\n {response.description}\n </span>\n </div>\n );\n })}\n </CollapsibleContent>\n </Collapsible>\n )}\n </CardContent>\n </Card>\n </div>\n );\n}; ","'use client';\n\nimport { HelpCircle } from 'lucide-react';\nimport React, { useEffect, useState } from 'react';\n\nimport {\n Accordion, AccordionContent, AccordionItem, AccordionTrigger, Badge, Button, Card, CardContent,\n CardHeader, CardTitle, Input, Label, Tabs, TabsContent, TabsList, TabsTrigger, Textarea,\n Tooltip, TooltipContent, TooltipProvider, TooltipTrigger\n} from '@djangocfg/ui-core/components';\n\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\n\ninterface Parameter {\n name: string;\n type: string;\n required: boolean;\n description?: string;\n}\n\nexport const RequestParametersForm: React.FC = () => {\n const { state, setParameters } = usePlaygroundContext();\n const [formData, setFormData] = useState<Record<string, string>>({});\n const [activeTab, setActiveTab] = useState('required');\n\n // Reset form data when endpoint changes\n useEffect(() => {\n if (state.selectedEndpoint?.parameters) {\n const initialData: Record<string, string> = {};\n state.selectedEndpoint.parameters.forEach(param => {\n initialData[param.name] = '';\n });\n setFormData(initialData);\n }\n }, [state.selectedEndpoint?.path, state.selectedEndpoint?.parameters]);\n\n const handleInputChange = (name: string, value: string) => {\n const newFormData = {\n ...formData,\n [name]: value\n };\n setFormData(newFormData);\n\n // Update parameters in context for URL substitution\n setParameters(newFormData);\n };\n\n const handleClearForm = () => {\n setFormData({});\n setParameters({});\n };\n\n const handleGenerateJson = () => {\n const hasData = Object.values(formData).some(value => value !== '' && value !== null && value !== undefined);\n if (hasData) {\n const jsonString = JSON.stringify(formData, null, 2);\n navigator.clipboard.writeText(jsonString);\n }\n };\n\n if (!state.selectedEndpoint) return null;\n\n const requiredParams = state.selectedEndpoint.parameters?.filter(param => param.required) || [];\n const optionalParams = state.selectedEndpoint.parameters?.filter(param => !param.required) || [];\n const hasParameters = (state.selectedEndpoint.parameters?.length || 0) > 0;\n\n if (!hasParameters) {\n return null;\n }\n\n const hasFormData = Object.values(formData).some(value => value !== '' && value !== null && value !== undefined);\n\n // Component for rendering parameter fields\n const ParameterField = ({ param }: { param: Parameter }) => (\n <div className=\"space-y-2\">\n <div className=\"flex items-center space-x-1\">\n <Label htmlFor={param.name} className=\"text-xs font-medium text-foreground\">\n {param.name}\n {param.required && <span className=\"text-destructive ml-1\">*</span>}\n </Label>\n {param.description && (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <HelpCircle className=\"h-3 w-3 text-muted-foreground hover:text-foreground cursor-help\" />\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-xs\">\n <p className=\"text-xs\">{param.description}</p>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n <Input\n id={param.name}\n value={formData[param.name] || ''}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => handleInputChange(param.name, e.target.value)}\n placeholder={`Enter ${param.name}${param.required ? '' : ' (optional)'}`}\n className=\"text-sm\"\n />\n </div>\n );\n\n // Component for rendering parameters in grid or list layout\n const ParametersGrid = ({ params, title, badgeVariant }: {\n params: Parameter[],\n title: string,\n badgeVariant: 'destructive' | 'secondary'\n }) => {\n if (params.length === 0) return null;\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center space-x-2\">\n <Badge variant={badgeVariant} className=\"text-xs\">{title}</Badge>\n <span className=\"text-xs text-muted-foreground\">\n {params.length} parameter{params.length !== 1 ? 's' : ''}\n </span>\n </div>\n </div>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4\">\n {params.map((param) => (\n <ParameterField key={param.name} param={param} />\n ))}\n </div>\n </div>\n );\n };\n\n return (\n <TooltipProvider>\n <Card>\n <CardHeader className=\"pb-3\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-sm text-foreground\">Request Parameters</CardTitle>\n <div className=\"flex items-center space-x-2\">\n {hasFormData && (\n <Button\n variant=\"default\"\n size=\"sm\"\n onClick={handleGenerateJson}\n className=\"text-xs\"\n >\n Copy JSON\n </Button>\n )}\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={handleClearForm}\n className=\"text-xs\"\n >\n Clear\n </Button>\n </div>\n </div>\n </CardHeader>\n\n <CardContent className=\"space-y-4\">\n {/* Use Tabs for better organization when there are many parameters */}\n {(requiredParams.length + optionalParams.length) > 10 ? (\n <Tabs value={activeTab} onValueChange={setActiveTab}>\n <TabsList className=\"grid w-full grid-cols-2\">\n <TabsTrigger value=\"required\" className=\"text-xs\">\n Required ({requiredParams.length})\n </TabsTrigger>\n <TabsTrigger value=\"optional\" className=\"text-xs\">\n Optional ({optionalParams.length})\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"required\" className=\"space-y-4\">\n <ParametersGrid\n params={requiredParams}\n title=\"Required\"\n badgeVariant=\"destructive\"\n />\n </TabsContent>\n\n <TabsContent value=\"optional\" className=\"space-y-4\">\n <ParametersGrid\n params={optionalParams}\n title=\"Optional\"\n badgeVariant=\"secondary\"\n />\n </TabsContent>\n </Tabs>\n ) : (\n /* Use Accordion for smaller parameter sets */\n <Accordion type=\"multiple\" defaultValue={requiredParams.length > 0 ? [\"required\"] : [\"optional\"]}>\n {requiredParams.length > 0 && (\n <AccordionItem value=\"required\">\n <AccordionTrigger className=\"text-sm text-foreground\">\n <div className=\"flex items-center space-x-2\">\n <Badge variant=\"destructive\" className=\"text-xs\">Required</Badge>\n <span className=\"text-xs text-muted-foreground\">\n {requiredParams.length} parameter{requiredParams.length !== 1 ? 's' : ''}\n </span>\n </div>\n </AccordionTrigger>\n <AccordionContent>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 pt-2\">\n {requiredParams.map((param) => (\n <ParameterField key={param.name} param={param} />\n ))}\n </div>\n </AccordionContent>\n </AccordionItem>\n )}\n\n {optionalParams.length > 0 && (\n <AccordionItem value=\"optional\">\n <AccordionTrigger className=\"text-sm text-foreground\">\n <div className=\"flex items-center space-x-2\">\n <Badge variant=\"secondary\" className=\"text-xs\">Optional</Badge>\n <span className=\"text-xs text-muted-foreground\">\n {optionalParams.length} parameter{optionalParams.length !== 1 ? 's' : ''}\n </span>\n </div>\n </AccordionTrigger>\n <AccordionContent>\n <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 pt-2\">\n {optionalParams.map((param) => (\n <ParameterField key={param.name} param={param} />\n ))}\n </div>\n </AccordionContent>\n </AccordionItem>\n )}\n </Accordion>\n )}\n\n {/* JSON Preview */}\n {hasFormData && (\n <div className=\"space-y-2 mt-6 pt-4 border-t\">\n <Label className=\"text-xs text-foreground\">Generated JSON</Label>\n <Textarea\n value={JSON.stringify(formData, null, 2)}\n readOnly\n className=\"text-xs font-mono\"\n rows={4}\n />\n <p className=\"text-xs text-muted-foreground\">\n Click "Copy JSON" to copy this to clipboard, then paste it into the Request Body field above.\n </p>\n </div>\n )}\n </CardContent>\n </Card>\n </TooltipProvider>\n );\n}; ","'use client';\n\nimport { Key, Loader2, Send } from 'lucide-react';\nimport React, { useCallback } from 'react';\n\nimport {\n Button, Card, CardContent, CardHeader, CardTitle, CopyButton, Input, Textarea\n} from '@djangocfg/ui-core/components';\n\nimport PrettyCode from '../../PrettyCode';\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\nimport { findApiKeyById, isValidJson, parseRequestHeaders } from '../utils';\nimport { EndpointInfo } from './EndpointInfo';\nimport { RequestParametersForm } from './RequestParametersForm';\n\nexport const RequestBuilder: React.FC = () => {\n const {\n state,\n apiKeys,\n setRequestBody,\n setManualApiToken,\n sendRequest\n } = usePlaygroundContext();\n\n const isJsonValid = state.requestBody ? isValidJson(state.requestBody) : true;\n\n // Generate cURL command\n const generateCurlCommand = () => {\n if (!state.requestUrl) return '';\n\n const apiKey = state.selectedApiKey ? findApiKeyById(apiKeys, state.selectedApiKey) : null;\n const headers = parseRequestHeaders(state.requestHeaders);\n\n if (apiKey) {\n headers['X-API-Key'] = apiKey.id || ''; // Note: using id as full key not available\n }\n\n let curl = `curl -X ${state.requestMethod} \"${state.requestUrl}\"`;\n\n // Add headers\n Object.entries(headers).forEach(([key, value]) => {\n curl += ` \\\\\\n -H \"${key}: ${value}\"`;\n });\n\n // Add body for non-GET requests\n if (state.requestBody && state.requestMethod !== 'GET' && isJsonValid) {\n curl += ` \\\\\\n -d '${state.requestBody}'`;\n }\n\n return curl;\n };\n\n const curlCommand = generateCurlCommand();\n\n const handleSendRequest = useCallback(async () => {\n await sendRequest();\n }, [sendRequest]);\n\n return (\n <div className=\"space-y-4\">\n {/* Endpoint Info */}\n {state.selectedEndpoint && <EndpointInfo />}\n\n {/* Request Parameters Form */}\n {state.selectedEndpoint && (\n <RequestParametersForm />\n )}\n\n {/* Request Body */}\n {state.requestMethod !== 'GET' && (\n <Card className=\"\">\n <CardHeader>\n <CardTitle className=\"text-sm text-foreground\">Request Body</CardTitle>\n </CardHeader>\n <CardContent>\n <Textarea\n placeholder='{\\n \"key\": \"value\"\\n}'\n value={state.requestBody}\n onChange={(e) => setRequestBody(e.target.value)}\n className={`font-mono text-sm ${\n !isJsonValid ? 'border-destructive' : ''\n }`}\n rows={6}\n />\n {!isJsonValid && (\n <p className=\"mt-1 text-xs text-destructive\">Invalid JSON format</p>\n )}\n </CardContent>\n </Card>\n )}\n\n {/* Bearer Token Authentication */}\n <Card className=\"\">\n <CardHeader>\n <CardTitle className=\"flex items-center space-x-2 text-sm text-foreground\">\n <Key className=\"h-4 w-4\" />\n <span>Bearer Token</span>\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-col sm:flex-row sm:items-center gap-2\">\n <div className=\"flex-1\">\n <Input\n type=\"password\"\n placeholder=\"Enter Bearer token (optional, uses JWT if empty)\"\n value={state.manualApiToken}\n onChange={(e) => setManualApiToken(e.target.value)}\n className=\"font-mono text-sm\"\n />\n <p className=\"mt-1 text-xs text-muted-foreground\">\n Leave empty to use JWT token from localStorage\n </p>\n </div>\n <Button\n onClick={handleSendRequest}\n disabled={state.loading || !state.requestUrl || !isJsonValid}\n className=\"bg-primary hover:bg-primary/90 text-primary-foreground flex items-center gap-2\"\n >\n {state.loading ? (\n <>\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span className=\"hidden sm:inline\">Sending...</span>\n </>\n ) : (\n <>\n <Send className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Send Request</span>\n </>\n )}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* cURL Command */}\n {curlCommand && (\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-sm text-foreground\">cURL Command</CardTitle>\n <CopyButton\n value={curlCommand}\n variant=\"outline\"\n size=\"sm\"\n >\n Copy cURL\n </CopyButton>\n </div>\n </CardHeader>\n <CardContent>\n <PrettyCode data={curlCommand} language=\"bash\" />\n </CardContent>\n </Card>\n )}\n </div>\n );\n}; ","'use client';\n\nimport { Download, XCircle } from 'lucide-react';\nimport React, { useCallback, useMemo } from 'react';\n\nimport {\n Badge, Button, Card, CardContent, CardHeader, CardTitle, CopyButton\n} from '@djangocfg/ui-core/components';\n\nimport JsonTree from '../../JsonTree';\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\nimport { getStatusColor } from '../utils';\n\nexport const ResponseViewer: React.FC = () => {\n const { state } = usePlaygroundContext();\n const { response } = state;\n\n // Memoize response text for copy/download\n const responseText = useMemo(() => {\n if (!response?.data) return '';\n return typeof response.data === 'string' ? response.data : JSON.stringify(response.data, null, 2);\n }, [response?.data]);\n\n const handleDownloadResponse = useCallback(() => {\n if (!responseText) return;\n const blob = new Blob([responseText], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'response.json';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }, [responseText]);\n\n if (!response) {\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-foreground\">Response</h2>\n </div>\n <Card>\n <CardContent className=\"flex items-center justify-center py-8\">\n <p className=\"text-sm text-muted-foreground\">No response yet. Send a request to see the response here.</p>\n </CardContent>\n </Card>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-foreground\">Response</h2>\n <div className=\"flex items-center space-x-2\">\n <CopyButton value={responseText} variant=\"outline\" size=\"sm\">\n Copy\n </CopyButton>\n <Button variant=\"outline\" size=\"sm\" onClick={handleDownloadResponse}>\n <Download className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Download</span>\n </Button>\n </div>\n </div>\n\n {/* Response Status */}\n <Card>\n <CardHeader>\n <CardTitle className=\"text-sm text-foreground\">Response Information</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-foreground\">Status Code:</span>\n <Badge\n variant={getStatusColor(response.status || 0) === 'success' ? 'default' :\n getStatusColor(response.status || 0) === 'error' ? 'destructive' : 'secondary'}\n className=\"text-xs\"\n >\n {response.status}\n </Badge>\n </div>\n {response.statusText && (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-foreground\">Status Text:</span>\n <span className=\"text-sm text-muted-foreground\">{response.statusText}</span>\n </div>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-foreground\">Response Type:</span>\n <span className=\"text-sm text-muted-foreground\">\n {typeof response.data === 'string' ? 'Text' : 'JSON'}\n </span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium text-foreground\">Data Size:</span>\n <span className=\"text-sm text-muted-foreground\">\n {typeof response.data === 'string' ? response.data.length : JSON.stringify(response.data).length} chars\n </span>\n </div>\n </div>\n </div>\n\n {response.error && (\n <div className=\"bg-destructive/10 border border-destructive/20 rounded p-3\">\n <div className=\"flex items-center space-x-2\">\n <XCircle className=\"h-4 w-4 text-destructive\" />\n <p className=\"text-sm text-destructive\">{response.error}</p>\n </div>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Response Body */}\n <Card>\n <CardContent className=\"p-0\">\n {(() => {\n // Check if response body should be hidden\n const is404 = response.status === 404;\n const isNonJson = typeof response.data === 'string';\n\n if (is404 || isNonJson) {\n return (\n <div className=\"p-8 text-center\">\n <p className=\"text-sm text-muted-foreground\">\n {is404\n ? 'Response body hidden for 404 Not Found status'\n : 'Response body hidden for non-JSON responses'}\n </p>\n </div>\n );\n }\n\n if (response.data) {\n return (\n <JsonTree\n title=\"Response Body\"\n data={response.data}\n config={{\n // Smart defaults for API responses\n maxAutoExpandDepth: 2,\n maxAutoExpandArrayItems: 10,\n maxAutoExpandObjectKeys: 5,\n maxStringLength: 200,\n collectionLimit: 50,\n showCollectionInfo: true,\n showExpandControls: true,\n showActionButtons: false, // We have our own copy/download buttons above\n preserveKeyOrder: true,\n className: \"border-0 rounded-none\"\n }}\n />\n );\n }\n\n return (\n <div className=\"p-8 text-center\">\n <p className=\"text-sm text-muted-foreground\">No response body available</p>\n </div>\n );\n })()}\n </CardContent>\n </Card>\n\n </div>\n );\n}; ","'use client';\n\nimport { Menu, X } from 'lucide-react';\nimport React from 'react';\n\nimport { Button, Sheet, SheetContent, SheetTrigger } from '@djangocfg/ui-core/components';\n\nimport { usePlaygroundContext } from '../context/PlaygroundContext';\nimport { useMobile } from '../hooks/useMobile';\nimport { EndpointsLibrary } from './EndpointsLibrary';\nimport { PlaygroundStepper } from './PlaygroundStepper';\nimport { RequestBuilder } from './RequestBuilder';\nimport { ResponseViewer } from './ResponseViewer';\n\nexport const PlaygroundLayout: React.FC = () => {\n const { state, setSidebarOpen } = usePlaygroundContext();\n const { isMobile } = useMobile();\n\n const renderStepContent = () => {\n switch (state.currentStep) {\n case 'endpoints':\n return <EndpointsLibrary />;\n case 'request':\n return <RequestBuilder />;\n case 'response':\n return <ResponseViewer />;\n default:\n return <EndpointsLibrary />;\n }\n };\n\n return (\n <div>\n {/* Stepper bar */}\n <div className=\"border-b\">\n <div className=\"container mx-auto px-6 py-3\">\n <div className=\"flex items-center justify-between\">\n {/* Mobile Menu */}\n {isMobile ? (\n <>\n <Sheet open={state.sidebarOpen} onOpenChange={setSidebarOpen}>\n <SheetTrigger asChild>\n <Button variant=\"ghost\" size=\"sm\">\n <Menu className=\"h-4 w-4\" />\n </Button>\n </SheetTrigger>\n <SheetContent side=\"left\" className=\"w-80\">\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <h2 className=\"text-lg font-semibold text-foreground\">Navigation</h2>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setSidebarOpen(false)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n <PlaygroundStepper />\n </div>\n </SheetContent>\n </Sheet>\n <span className=\"text-sm font-medium text-foreground capitalize\">{state.currentStep}</span>\n <div className=\"w-8\" /> {/* Spacer for centering */}\n </>\n ) : (\n <PlaygroundStepper />\n )}\n </div>\n </div>\n </div>\n\n {/* Content */}\n <div className=\"container mx-auto px-6 py-6\">\n {renderStepContent()}\n </div>\n\n {/* Mobile FAB */}\n {isMobile && state.currentStep === 'request' && (\n <div className=\"fixed bottom-4 right-4 z-50\">\n <Button\n size=\"lg\"\n className=\"rounded-full shadow-lg\"\n >\n Send Request\n </Button>\n </div>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -39,9 +39,6 @@ var isEndpointInVersion = /* @__PURE__ */ __name((endpoint, version) => {
|
|
|
39
39
|
const endpointVersion = detectEndpointVersion(endpoint.path);
|
|
40
40
|
return endpointVersion === version;
|
|
41
41
|
}, "isEndpointInVersion");
|
|
42
|
-
var filterEndpointsByVersion = /* @__PURE__ */ __name((endpoints, version) => {
|
|
43
|
-
return endpoints.filter((endpoint) => isEndpointInVersion(endpoint, version));
|
|
44
|
-
}, "filterEndpointsByVersion");
|
|
45
42
|
var deduplicateEndpoints = /* @__PURE__ */ __name((endpoints, preferredVersion) => {
|
|
46
43
|
const endpointMap = /* @__PURE__ */ new Map();
|
|
47
44
|
const groupedEndpoints = /* @__PURE__ */ new Map();
|
|
@@ -69,9 +66,6 @@ var deduplicateEndpoints = /* @__PURE__ */ __name((endpoints, preferredVersion)
|
|
|
69
66
|
var normalizeEndpointPath = /* @__PURE__ */ __name((path) => {
|
|
70
67
|
return path.replace(/\/v\d+\//, "/");
|
|
71
68
|
}, "normalizeEndpointPath");
|
|
72
|
-
var getVersionById = /* @__PURE__ */ __name((versionId) => {
|
|
73
|
-
return API_VERSIONS.find((v) => v.id === versionId);
|
|
74
|
-
}, "getVersionById");
|
|
75
69
|
var getDefaultVersion = /* @__PURE__ */ __name(() => {
|
|
76
70
|
const defaultVersion = API_VERSIONS.find((v) => v.isDefault);
|
|
77
71
|
if (defaultVersion) {
|
|
@@ -82,13 +76,6 @@ var getDefaultVersion = /* @__PURE__ */ __name(() => {
|
|
|
82
76
|
}
|
|
83
77
|
throw new Error("No API versions defined");
|
|
84
78
|
}, "getDefaultVersion");
|
|
85
|
-
var getVersionStats = /* @__PURE__ */ __name((endpoints) => {
|
|
86
|
-
const stats = {};
|
|
87
|
-
API_VERSIONS.forEach((version) => {
|
|
88
|
-
stats[version.id] = filterEndpointsByVersion(endpoints, version.id).length;
|
|
89
|
-
});
|
|
90
|
-
return stats;
|
|
91
|
-
}, "getVersionStats");
|
|
92
79
|
|
|
93
80
|
// src/tools/OpenapiViewer/constants.ts
|
|
94
81
|
var HTTP_METHOD_COLORS = {
|
|
@@ -249,7 +236,7 @@ var PlaygroundProvider = /* @__PURE__ */ __name(({ children, config }) => {
|
|
|
249
236
|
if (endpoint) {
|
|
250
237
|
updateState({
|
|
251
238
|
selectedEndpoint: endpoint,
|
|
252
|
-
requestMethod:
|
|
239
|
+
requestMethod: endpoint.method,
|
|
253
240
|
requestUrl: endpoint.path,
|
|
254
241
|
parameters: {},
|
|
255
242
|
// Reset parameters when endpoint changes
|
|
@@ -388,6 +375,6 @@ var PlaygroundProvider = /* @__PURE__ */ __name(({ children, config }) => {
|
|
|
388
375
|
return /* @__PURE__ */ jsx(PlaygroundContext.Provider, { value: contextValue, children });
|
|
389
376
|
}, "PlaygroundProvider");
|
|
390
377
|
|
|
391
|
-
export {
|
|
392
|
-
//# sourceMappingURL=chunk-
|
|
393
|
-
//# sourceMappingURL=chunk-
|
|
378
|
+
export { PlaygroundProvider, PrettyCode_default, deduplicateEndpoints, findApiKeyById, getMethodColor, getStatusColor, isValidJson, parseRequestHeaders, usePlaygroundContext };
|
|
379
|
+
//# sourceMappingURL=chunk-FXFTJW2Y.mjs.map
|
|
380
|
+
//# sourceMappingURL=chunk-FXFTJW2Y.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/PrettyCode/index.tsx","../src/tools/OpenapiViewer/utils/apiKeyManager.ts","../src/tools/OpenapiViewer/utils/versionManager.ts","../src/tools/OpenapiViewer/constants.ts","../src/tools/OpenapiViewer/utils/formatters.ts","../src/tools/OpenapiViewer/context/PlaygroundContext.tsx"],"names":["React","jsx"],"mappings":"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","file":"chunk-FXFTJW2Y.mjs","sourcesContent":["/**\n * PrettyCode Component - Dynamic Import Wrapper\n *\n * Lazy loads the heavy Prism library (~500KB) only when needed.\n * This significantly reduces the initial bundle size.\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport type { Language } from 'prism-react-renderer';\n\n// Lazy load the client component\nconst PrettyCodeClient = lazy(() => import('./PrettyCode.client'));\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900\">\n <div className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20\"></div>\n <span className=\"text-xs text-muted-foreground\">Loading code...</span>\n </div>\n </div>\n </div>\n);\n\nexport interface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string;\n isCompact?: boolean;\n}\n\nconst PrettyCode: React.FC<PrettyCodeProps> = (props) => {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <PrettyCodeClient {...props} />\n </Suspense>\n );\n};\n\nexport default PrettyCode;\nexport type { Language };\n","/**\n * API Key Management Utility\n *\n * Provides centralized functions for managing API keys in headers and requests.\n * This utility can be used across different components that need to handle API keys.\n */\n\nimport type { ApiKey } from '../types';\n\nexport type { ApiKey };\n\nexport interface HeadersWithApiKey {\n [key: string]: string;\n}\n\n/**\n * Add API key to request headers\n * @param headers - Existing headers object\n * @param apiKey - API key object or string\n * @returns Headers with API key added\n */\nexport function addApiKeyToHeaders(headers: HeadersWithApiKey, apiKey: ApiKey | string | null): HeadersWithApiKey {\n if (!apiKey) {\n return headers;\n }\n\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.id || '');\n\n return {\n ...headers,\n 'X-API-Key': keyValue,\n };\n}\n\n/**\n * Remove API key from headers object\n * @param headers - Headers object\n * @returns Headers without API key\n */\nexport function removeApiKeyFromHeaders(headers: HeadersWithApiKey): HeadersWithApiKey {\n const { 'X-API-Key': removed, ...remainingHeaders } = headers;\n return remainingHeaders;\n}\n\n/**\n * Remove API key from headers JSON string\n * @param headersJson - JSON string of headers\n * @returns JSON string without API key\n */\nexport function removeApiKeyFromHeadersJson(headersJson: string): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = removeApiKeyFromHeaders(headers);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Update headers JSON string with API key\n * @param headersJson - JSON string of headers\n * @param apiKey - API key object or string\n * @returns Updated JSON string\n */\nexport function updateHeadersJsonWithApiKey(headersJson: string, apiKey: ApiKey | string | null): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = addApiKeyToHeaders(headers, apiKey);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Find API key by ID in a list of API keys\n * @param apiKeys - Array of API keys\n * @param keyId - ID of the API key to find\n * @returns API key object or null\n */\nexport function findApiKeyById(apiKeys: ApiKey[], keyId: string): ApiKey | null {\n return apiKeys.find((key) => key.id === keyId) || null;\n}\n\n/**\n * Validate API key format\n * @param apiKey - API key string to validate\n * @returns Whether the API key format is valid\n */\nexport function validateApiKeyFormat(apiKey: string): boolean {\n // Basic validation - adjust based on your API key format requirements\n return typeof apiKey === 'string' && apiKey.length > 0 && apiKey.trim() !== '';\n}\n\n/**\n * Create default headers with API key\n * @param apiKey - API key object or string\n * @returns Default headers with API key\n */\nexport function createDefaultHeaders(apiKey?: ApiKey | string): HeadersWithApiKey {\n const defaultHeaders: HeadersWithApiKey = {\n 'Content-Type': 'application/json',\n };\n\n if (apiKey) {\n return addApiKeyToHeaders(defaultHeaders, apiKey);\n }\n\n return defaultHeaders;\n}\n\n/**\n * Merge headers with API key\n * @param baseHeaders - Base headers object\n * @param additionalHeaders - Additional headers to merge\n * @param apiKey - API key to add\n * @returns Merged headers with API key\n */\nexport function mergeHeadersWithApiKey(baseHeaders: HeadersWithApiKey, additionalHeaders: HeadersWithApiKey, apiKey?: ApiKey | string): HeadersWithApiKey {\n const mergedHeaders = { ...baseHeaders, ...additionalHeaders };\n\n if (apiKey) {\n return addApiKeyToHeaders(mergedHeaders, apiKey);\n }\n\n return mergedHeaders;\n}\n\n/**\n * Log API key usage (for debugging/analytics)\n * @param apiKey - API key that was used\n * @param endpoint - Endpoint that was called\n * @param success - Whether the request was successful\n */\nexport function logApiKeyUsage(apiKey: ApiKey | string, endpoint: string, success: boolean): void {\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.id || '');\n const keyName = typeof apiKey === 'string' ? 'Unknown' : apiKey.name;\n\n console.log(`API Key Usage:`, {\n keyName,\n keyValue: keyValue.substring(0, 8) + '...',\n endpoint,\n success,\n timestamp: new Date().toISOString(),\n });\n}\n","/**\n * API Version Management Utilities\n * Handles version detection, filtering, and URL transformation\n */\n\nimport type { ApiEndpoint } from '../types';\n\nexport interface ApiVersion {\n id: string;\n name: string;\n description: string;\n isDefault: boolean;\n}\n\n// Available API versions\nexport const API_VERSIONS: ApiVersion[] = [\n {\n id: 'v1',\n name: 'v1',\n description: 'Current stable version',\n isDefault: true,\n },\n];\n\n/**\n * Detect version from endpoint path\n */\nexport const detectEndpointVersion = (path: string): string => {\n // Check for versioned paths like /api/vehicles_api/v1/...\n const versionMatch = path.match(/\\/api\\/[^/]+\\/(v\\d+)\\//);\n if (versionMatch && versionMatch[1]) {\n return versionMatch[1];\n }\n \n // If no version found, default to v1\n return 'v1';\n};\n\n/**\n * Check if endpoint belongs to specific version\n */\nexport const isEndpointInVersion = (endpoint: ApiEndpoint, version: string): boolean => {\n const endpointVersion = detectEndpointVersion(endpoint.path);\n return endpointVersion === version;\n};\n\n/**\n * Filter endpoints by version\n */\nexport const filterEndpointsByVersion = (endpoints: ApiEndpoint[], version: string): ApiEndpoint[] => {\n return endpoints.filter(endpoint => isEndpointInVersion(endpoint, version));\n};\n\n/**\n * Remove duplicate endpoints across versions\n * Keeps only the specified version, removes duplicates from other versions\n */\nexport const deduplicateEndpoints = (endpoints: ApiEndpoint[], preferredVersion: string): ApiEndpoint[] => {\n const endpointMap = new Map<string, ApiEndpoint>();\n \n // Group endpoints by normalized path (without version)\n const groupedEndpoints = new Map<string, ApiEndpoint[]>();\n \n endpoints.forEach(endpoint => {\n const normalizedPath = normalizeEndpointPath(endpoint.path);\n if (!groupedEndpoints.has(normalizedPath)) {\n groupedEndpoints.set(normalizedPath, []);\n }\n groupedEndpoints.get(normalizedPath)!.push(endpoint);\n });\n \n // For each group, pick the endpoint from preferred version\n groupedEndpoints.forEach((endpointGroup, normalizedPath) => {\n let selectedEndpoint: ApiEndpoint | null = null;\n \n // Try to find endpoint in preferred version\n const versionEndpoint = endpointGroup.find(ep => isEndpointInVersion(ep, preferredVersion));\n if (versionEndpoint) {\n selectedEndpoint = versionEndpoint;\n } else if (endpointGroup.length > 0) {\n // Fallback to first available endpoint\n selectedEndpoint = endpointGroup[0] || null;\n }\n \n if (selectedEndpoint) {\n endpointMap.set(normalizedPath, selectedEndpoint);\n }\n });\n \n return Array.from(endpointMap.values());\n};\n\n/**\n * Normalize endpoint path by removing version prefix\n * /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/vehicles/\n * /api/vehicles_api/vehicles/ -> /api/vehicles_api/vehicles/\n */\nexport const normalizeEndpointPath = (path: string): string => {\n // Remove version prefix like /v1/, /v2/, etc.\n return path.replace(/\\/v\\d+\\//, '/');\n};\n\n/**\n * Convert endpoint path to specific version\n */\nexport const convertEndpointToVersion = (endpoint: ApiEndpoint, targetVersion: string): ApiEndpoint => {\n const currentVersion = detectEndpointVersion(endpoint.path);\n \n // If already in target version, return as is\n if (currentVersion === targetVersion) {\n return endpoint;\n }\n \n let newPath = endpoint.path;\n \n // Replace version: /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/v2/vehicles/\n newPath = newPath.replace(/\\/v\\d+\\//, `/${targetVersion}/`);\n \n return {\n ...endpoint,\n path: newPath,\n };\n};\n\n/**\n * Get version info by ID\n */\nexport const getVersionById = (versionId: string): ApiVersion | undefined => {\n return API_VERSIONS.find(v => v.id === versionId);\n};\n\n/**\n * Get default version\n */\nexport const getDefaultVersion = (): ApiVersion => {\n const defaultVersion = API_VERSIONS.find(v => v.isDefault);\n if (defaultVersion) {\n return defaultVersion;\n }\n \n // Fallback to first version if no default is set\n if (API_VERSIONS.length > 0 && API_VERSIONS[0]) {\n return API_VERSIONS[0];\n }\n \n // This should never happen, but TypeScript requires it\n throw new Error('No API versions defined');\n};\n\n/**\n * Get version statistics from endpoints\n */\nexport const getVersionStats = (endpoints: ApiEndpoint[]): Record<string, number> => {\n const stats: Record<string, number> = {};\n \n API_VERSIONS.forEach(version => {\n stats[version.id] = filterEndpointsByVersion(endpoints, version.id).length;\n });\n \n return stats;\n};\n","// HTTP method colors mapping\nexport const HTTP_METHOD_COLORS = {\n GET: 'success',\n POST: 'primary',\n PUT: 'warning',\n DELETE: 'error',\n PATCH: 'default',\n} as const;\n\n// HTTP status code colors mapping\nexport const HTTP_STATUS_COLORS = {\n '2': 'success',\n '3': 'default',\n '4': 'warning',\n '5': 'error',\n} as const;\n\n// Default request headers\nexport const DEFAULT_HEADERS = {\n 'Content-Type': 'application/json',\n} as const;\n\n// Playground steps configuration\nexport const PLAYGROUND_STEPS = ['endpoints', 'request', 'response'] as const;\n\nexport const STEP_CONFIG = {\n endpoints: {\n title: 'API Endpoints',\n description: 'Browse and select API endpoints',\n },\n request: {\n title: 'Request Builder',\n description: 'Configure your API request',\n },\n response: {\n title: 'Response Viewer',\n description: 'View API response and details',\n },\n} as const;\n","import type { ApiKey } from '../types';\nimport { HTTP_METHOD_COLORS, HTTP_STATUS_COLORS } from '../constants';\n\nexport const getMethodColor = (\n method: string\n): 'success' | 'primary' | 'warning' | 'error' | 'default' => {\n return HTTP_METHOD_COLORS[method.toUpperCase() as keyof typeof HTTP_METHOD_COLORS] || 'default';\n};\n\nexport const getStatusColor = (\n status: number\n): 'success' | 'warning' | 'error' | 'default' => {\n const firstDigit = Math.floor(status / 100).toString();\n return HTTP_STATUS_COLORS[firstDigit as keyof typeof HTTP_STATUS_COLORS] || 'default';\n};\n\nexport const formatApiKeyDisplay = (apiKey: ApiKey): string => {\n const preview = apiKey.id.substring(0, 8);\n return `${apiKey.name} (${preview}...)`;\n};\n\nexport const isValidJson = (str: string): boolean => {\n if (!str || typeof str !== 'string') return false;\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const formatRequestHeaders = (headers: Record<string, string>): string => {\n return JSON.stringify(headers, null, 2);\n};\n\nexport const parseRequestHeaders = (headersString: string): Record<string, string> => {\n if (!headersString || typeof headersString !== 'string') {\n return { 'Content-Type': 'application/json' };\n }\n\n try {\n const parsed = JSON.parse(headersString);\n return typeof parsed === 'object' && parsed !== null ? parsed : { 'Content-Type': 'application/json' };\n } catch {\n return { 'Content-Type': 'application/json' };\n }\n};\n\n// Substitute URL parameters like {id}, {userId}, etc.\nexport const substituteUrlParameters = (\n url: string,\n parameters: Record<string, string>\n): string => {\n let substitutedUrl = url;\n\n Object.entries(parameters).forEach(([key, value]) => {\n if (value && value.trim() !== '') {\n // Replace both {key} and %7Bkey%7D patterns (URL encoded version)\n const patterns = [\n new RegExp(`\\\\{${key}\\\\}`, 'g'),\n new RegExp(`%7B${key}%7D`, 'gi'),\n ];\n\n patterns.forEach((pattern) => {\n substitutedUrl = substitutedUrl.replace(pattern, encodeURIComponent(value));\n });\n }\n });\n\n return substitutedUrl;\n};\n","'use client';\n\nimport consola from 'consola';\nimport React, {\n createContext, ReactNode, useCallback, useContext, useEffect, useState\n} from 'react';\n\nimport type {\n ApiEndpoint, ApiResponse, PlaygroundConfig, PlaygroundContextType, PlaygroundState,\n PlaygroundStep\n} from '../types';\nimport { parseRequestHeaders, substituteUrlParameters } from '../utils';\nimport { getDefaultVersion } from '../utils/versionManager';\n\nconst createInitialState = (): PlaygroundState => ({\n // Step management\n currentStep: 'endpoints',\n steps: ['endpoints', 'request', 'response'],\n\n // Endpoint selection\n selectedEndpoint: null,\n selectedCategory: 'All',\n searchTerm: '',\n selectedVersion: getDefaultVersion().id,\n\n // Request configuration\n requestUrl: '',\n requestMethod: 'GET',\n requestHeaders: '{\\n \"Content-Type\": \"application/json\"\\n}',\n requestBody: '',\n selectedApiKey: null,\n manualApiToken: '',\n parameters: {},\n\n // Response\n response: null,\n loading: false,\n\n // UI state\n sidebarOpen: false,\n});\n\nconst PlaygroundContext = createContext<PlaygroundContextType | undefined>(undefined);\n\nexport const usePlaygroundContext = () => {\n const context = useContext(PlaygroundContext);\n if (!context) {\n throw new Error('usePlaygroundContext must be used within a PlaygroundProvider');\n }\n return context;\n};\n\ninterface PlaygroundProviderProps {\n children: ReactNode;\n config: PlaygroundConfig;\n}\n\nexport const PlaygroundProvider: React.FC<PlaygroundProviderProps> = ({ children, config }) => {\n const [state, setState] = useState<PlaygroundState>(() => createInitialState());\n\n // TODO: Get API keys from CFG context - temporarily disabled\n // const { apiKeys: apiKeysResponse, isLoadingApiKeys } = useApiKeysContext();\n // const apiKeys = (apiKeysResponse && apiKeysResponse.results) ? apiKeysResponse.results : [];\n const apiKeys = React.useMemo(() => [], []);\n const isLoadingApiKeys = false;\n\n const updateState = (updates: Partial<PlaygroundState>) => {\n setState((prev) => ({ ...prev, ...updates }));\n };\n\n // Auto-select first API key when available\n useEffect(() => {\n if (!isLoadingApiKeys && apiKeys.length > 0 && !state.selectedApiKey) {\n updateState({ selectedApiKey: apiKeys[0]?.id || null });\n }\n }, [apiKeys, isLoadingApiKeys, state.selectedApiKey]);\n\n // Update headers when API key changes\n useEffect(() => {\n try {\n setState(prev => {\n const headers = parseRequestHeaders(prev.requestHeaders);\n let hasChanged = false;\n\n if (prev.selectedApiKey) {\n const apiKey = apiKeys.find(k => k.id === prev.selectedApiKey);\n\n if (apiKey) {\n // Add API key to headers only if it changed\n if (headers['X-API-Key'] !== apiKey.id) {\n headers['X-API-Key'] = apiKey.id;\n hasChanged = true;\n }\n } else {\n // Selected API key no longer exists, clear selection\n return { ...prev, selectedApiKey: null };\n }\n } else {\n // Remove API key from headers if no key is selected\n if (headers['X-API-Key']) {\n delete headers['X-API-Key'];\n hasChanged = true;\n }\n }\n\n // Only update if headers actually changed\n if (hasChanged) {\n const updatedHeaders = JSON.stringify(headers, null, 2);\n return { ...prev, requestHeaders: updatedHeaders };\n }\n\n return prev;\n });\n } catch (error) {\n consola.error('Error updating headers:', error);\n }\n }, [state.selectedApiKey, apiKeys]); // Removed state.requestHeaders dependency\n\n // Update URL when parameters change\n useEffect(() => {\n if (state.selectedEndpoint && state.parameters) {\n // Path is already a full URL from the endpoint\n const updatedUrl = substituteUrlParameters(state.selectedEndpoint.path, state.parameters);\n\n // Only update if URL actually changed to avoid infinite loop\n if (updatedUrl !== state.requestUrl) {\n updateState({ requestUrl: updatedUrl });\n }\n }\n }, [state.parameters, state.selectedEndpoint, state.requestUrl]);\n\n // Step management\n const setCurrentStep = (step: PlaygroundStep) => {\n updateState({ currentStep: step });\n };\n\n const goToNextStep = () => {\n const currentIndex = state.steps.indexOf(state.currentStep);\n if (currentIndex < state.steps.length - 1) {\n updateState({ currentStep: state.steps[currentIndex + 1] });\n }\n };\n\n const goToPreviousStep = () => {\n const currentIndex = state.steps.indexOf(state.currentStep);\n if (currentIndex > 0) {\n updateState({ currentStep: state.steps[currentIndex - 1] });\n }\n };\n\n // Endpoint management\n const setSelectedEndpoint = (endpoint: ApiEndpoint | null) => {\n if (endpoint) {\n updateState({\n selectedEndpoint: endpoint,\n requestMethod: endpoint.method,\n requestUrl: endpoint.path,\n parameters: {}, // Reset parameters when endpoint changes\n currentStep: 'request'\n });\n } else {\n updateState({ selectedEndpoint: endpoint });\n }\n };\n\n const setSelectedCategory = (category: string) => {\n updateState({ selectedCategory: category });\n };\n\n const setSearchTerm = (term: string) => {\n updateState({ searchTerm: term });\n };\n\n const setSelectedVersion = (version: string) => {\n updateState({ selectedVersion: version });\n };\n\n // Request management\n const setRequestUrl = (url: string) => {\n updateState({ requestUrl: url });\n };\n\n const setRequestMethod = (method: string) => {\n updateState({ requestMethod: method });\n };\n\n const setRequestHeaders = (headers: string) => {\n updateState({ requestHeaders: headers });\n };\n\n const setRequestBody = (body: string) => {\n updateState({ requestBody: body });\n };\n\n const setSelectedApiKey = (apiKeyId: string | null) => {\n updateState({ selectedApiKey: apiKeyId });\n };\n\n const setManualApiToken = (manualApiToken: string) => {\n updateState({ manualApiToken });\n };\n\n const setParameters = (parameters: Record<string, string>) => {\n updateState({ parameters });\n };\n\n // Response management\n const setResponse = (response: ApiResponse | null) => {\n updateState({ response });\n };\n\n const setLoading = (loading: boolean) => {\n updateState({ loading });\n };\n\n // UI management\n const setSidebarOpen = (sidebarOpen: boolean) => {\n updateState({ sidebarOpen });\n };\n\n // Actions\n const clearAll = useCallback(() => {\n setState(createInitialState());\n }, []);\n\n const sendRequest = useCallback(async () => {\n if (!state.requestUrl) {\n consola.error('No URL provided');\n return;\n }\n\n setLoading(true);\n setResponse(null);\n\n try {\n const headers = parseRequestHeaders(state.requestHeaders);\n\n // Bearer token priority: manual token → JWT token from localStorage\n let bearerToken: string | null = null;\n\n if (state.manualApiToken) {\n // Use manual token if provided\n bearerToken = state.manualApiToken;\n } else {\n // Try to get JWT token from localStorage\n if (typeof window !== 'undefined') {\n bearerToken = window.localStorage.getItem('auth_token');\n }\n }\n\n if (bearerToken) {\n headers['Authorization'] = `Bearer ${bearerToken}`;\n }\n\n const requestOptions: RequestInit = {\n method: state.requestMethod,\n headers,\n };\n\n if (state.requestBody && state.requestMethod !== 'GET') {\n requestOptions.body = state.requestBody;\n }\n\n const response = await fetch(state.requestUrl, requestOptions);\n const responseText = await response.text();\n\n let responseData;\n try {\n responseData = JSON.parse(responseText);\n } catch {\n responseData = responseText;\n }\n\n setResponse({\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n data: responseData,\n });\n\n consola.success(`Request successful: ${state.requestMethod} ${state.requestUrl}`);\n\n // Auto-advance to response step\n updateState({ currentStep: 'response' });\n } catch (error) {\n consola.error('Request failed:', error);\n setResponse({\n error: error instanceof Error ? error.message : 'Request failed',\n });\n } finally {\n setLoading(false);\n }\n }, [state, setLoading, setResponse]);\n\n const contextValue: PlaygroundContextType = {\n // State\n state,\n config,\n apiKeys,\n apiKeysLoading: isLoadingApiKeys,\n\n // Step management\n setCurrentStep,\n goToNextStep,\n goToPreviousStep,\n\n // Endpoint management\n setSelectedEndpoint,\n setSelectedCategory,\n setSearchTerm,\n setSelectedVersion,\n\n // Request management\n setRequestUrl,\n setRequestMethod,\n setRequestHeaders,\n setRequestBody,\n setSelectedApiKey,\n setManualApiToken,\n setParameters,\n\n // Response management\n setResponse,\n setLoading,\n\n // UI management\n setSidebarOpen,\n\n // Actions\n clearAll,\n sendRequest,\n };\n\n return <PlaygroundContext.Provider value={contextValue}>{children}</PlaygroundContext.Provider>;\n}; "]}
|
|
@@ -46,9 +46,6 @@ var isEndpointInVersion = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((endpoint, ve
|
|
|
46
46
|
const endpointVersion = detectEndpointVersion(endpoint.path);
|
|
47
47
|
return endpointVersion === version;
|
|
48
48
|
}, "isEndpointInVersion");
|
|
49
|
-
var filterEndpointsByVersion = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((endpoints, version) => {
|
|
50
|
-
return endpoints.filter((endpoint) => isEndpointInVersion(endpoint, version));
|
|
51
|
-
}, "filterEndpointsByVersion");
|
|
52
49
|
var deduplicateEndpoints = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((endpoints, preferredVersion) => {
|
|
53
50
|
const endpointMap = /* @__PURE__ */ new Map();
|
|
54
51
|
const groupedEndpoints = /* @__PURE__ */ new Map();
|
|
@@ -76,9 +73,6 @@ var deduplicateEndpoints = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((endpoints,
|
|
|
76
73
|
var normalizeEndpointPath = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((path) => {
|
|
77
74
|
return path.replace(/\/v\d+\//, "/");
|
|
78
75
|
}, "normalizeEndpointPath");
|
|
79
|
-
var getVersionById = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((versionId) => {
|
|
80
|
-
return API_VERSIONS.find((v) => v.id === versionId);
|
|
81
|
-
}, "getVersionById");
|
|
82
76
|
var getDefaultVersion = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => {
|
|
83
77
|
const defaultVersion = API_VERSIONS.find((v) => v.isDefault);
|
|
84
78
|
if (defaultVersion) {
|
|
@@ -89,13 +83,6 @@ var getDefaultVersion = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(() => {
|
|
|
89
83
|
}
|
|
90
84
|
throw new Error("No API versions defined");
|
|
91
85
|
}, "getDefaultVersion");
|
|
92
|
-
var getVersionStats = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name((endpoints) => {
|
|
93
|
-
const stats = {};
|
|
94
|
-
API_VERSIONS.forEach((version) => {
|
|
95
|
-
stats[version.id] = filterEndpointsByVersion(endpoints, version.id).length;
|
|
96
|
-
});
|
|
97
|
-
return stats;
|
|
98
|
-
}, "getVersionStats");
|
|
99
86
|
|
|
100
87
|
// src/tools/OpenapiViewer/constants.ts
|
|
101
88
|
var HTTP_METHOD_COLORS = {
|
|
@@ -256,7 +243,7 @@ var PlaygroundProvider = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ children, c
|
|
|
256
243
|
if (endpoint) {
|
|
257
244
|
updateState({
|
|
258
245
|
selectedEndpoint: endpoint,
|
|
259
|
-
requestMethod:
|
|
246
|
+
requestMethod: endpoint.method,
|
|
260
247
|
requestUrl: endpoint.path,
|
|
261
248
|
parameters: {},
|
|
262
249
|
// Reset parameters when endpoint changes
|
|
@@ -395,17 +382,14 @@ var PlaygroundProvider = /* @__PURE__ */ chunkWGEGR3DF_cjs.__name(({ children, c
|
|
|
395
382
|
return /* @__PURE__ */ jsxRuntime.jsx(PlaygroundContext.Provider, { value: contextValue, children });
|
|
396
383
|
}, "PlaygroundProvider");
|
|
397
384
|
|
|
398
|
-
exports.API_VERSIONS = API_VERSIONS;
|
|
399
385
|
exports.PlaygroundProvider = PlaygroundProvider;
|
|
400
386
|
exports.PrettyCode_default = PrettyCode_default;
|
|
401
387
|
exports.deduplicateEndpoints = deduplicateEndpoints;
|
|
402
388
|
exports.findApiKeyById = findApiKeyById;
|
|
403
389
|
exports.getMethodColor = getMethodColor;
|
|
404
390
|
exports.getStatusColor = getStatusColor;
|
|
405
|
-
exports.getVersionById = getVersionById;
|
|
406
|
-
exports.getVersionStats = getVersionStats;
|
|
407
391
|
exports.isValidJson = isValidJson;
|
|
408
392
|
exports.parseRequestHeaders = parseRequestHeaders;
|
|
409
393
|
exports.usePlaygroundContext = usePlaygroundContext;
|
|
410
|
-
//# sourceMappingURL=chunk-
|
|
411
|
-
//# sourceMappingURL=chunk-
|
|
394
|
+
//# sourceMappingURL=chunk-QP6QAK3F.cjs.map
|
|
395
|
+
//# sourceMappingURL=chunk-QP6QAK3F.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools/PrettyCode/index.tsx","../src/tools/OpenapiViewer/utils/apiKeyManager.ts","../src/tools/OpenapiViewer/utils/versionManager.ts","../src/tools/OpenapiViewer/constants.ts","../src/tools/OpenapiViewer/utils/formatters.ts","../src/tools/OpenapiViewer/context/PlaygroundContext.tsx"],"names":["lazy","__name","jsx","jsxs","Suspense","createContext","useContext","useState","React","useEffect","consola","useCallback"],"mappings":"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","file":"chunk-QP6QAK3F.cjs","sourcesContent":["/**\n * PrettyCode Component - Dynamic Import Wrapper\n *\n * Lazy loads the heavy Prism library (~500KB) only when needed.\n * This significantly reduces the initial bundle size.\n */\n\n'use client';\n\nimport React, { lazy, Suspense } from 'react';\nimport type { Language } from 'prism-react-renderer';\n\n// Lazy load the client component\nconst PrettyCodeClient = lazy(() => import('./PrettyCode.client'));\n\n// Loading fallback component\nconst LoadingFallback = () => (\n <div className=\"relative rounded-sm border border-border overflow-hidden bg-muted dark:bg-zinc-900\">\n <div className=\"p-4\">\n <div className=\"flex items-center gap-2\">\n <div className=\"animate-pulse h-4 w-4 rounded-full bg-muted-foreground/20\"></div>\n <span className=\"text-xs text-muted-foreground\">Loading code...</span>\n </div>\n </div>\n </div>\n);\n\nexport interface PrettyCodeProps {\n data: string | object;\n language: Language;\n className?: string;\n mode?: 'dark' | 'light';\n inline?: boolean;\n customBg?: string;\n isCompact?: boolean;\n}\n\nconst PrettyCode: React.FC<PrettyCodeProps> = (props) => {\n return (\n <Suspense fallback={<LoadingFallback />}>\n <PrettyCodeClient {...props} />\n </Suspense>\n );\n};\n\nexport default PrettyCode;\nexport type { Language };\n","/**\n * API Key Management Utility\n *\n * Provides centralized functions for managing API keys in headers and requests.\n * This utility can be used across different components that need to handle API keys.\n */\n\nimport type { ApiKey } from '../types';\n\nexport type { ApiKey };\n\nexport interface HeadersWithApiKey {\n [key: string]: string;\n}\n\n/**\n * Add API key to request headers\n * @param headers - Existing headers object\n * @param apiKey - API key object or string\n * @returns Headers with API key added\n */\nexport function addApiKeyToHeaders(headers: HeadersWithApiKey, apiKey: ApiKey | string | null): HeadersWithApiKey {\n if (!apiKey) {\n return headers;\n }\n\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.id || '');\n\n return {\n ...headers,\n 'X-API-Key': keyValue,\n };\n}\n\n/**\n * Remove API key from headers object\n * @param headers - Headers object\n * @returns Headers without API key\n */\nexport function removeApiKeyFromHeaders(headers: HeadersWithApiKey): HeadersWithApiKey {\n const { 'X-API-Key': removed, ...remainingHeaders } = headers;\n return remainingHeaders;\n}\n\n/**\n * Remove API key from headers JSON string\n * @param headersJson - JSON string of headers\n * @returns JSON string without API key\n */\nexport function removeApiKeyFromHeadersJson(headersJson: string): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = removeApiKeyFromHeaders(headers);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Update headers JSON string with API key\n * @param headersJson - JSON string of headers\n * @param apiKey - API key object or string\n * @returns Updated JSON string\n */\nexport function updateHeadersJsonWithApiKey(headersJson: string, apiKey: ApiKey | string | null): string {\n try {\n const headers = JSON.parse(headersJson);\n const updatedHeaders = addApiKeyToHeaders(headers, apiKey);\n return JSON.stringify(updatedHeaders, null, 2);\n } catch (error) {\n console.error('Error parsing headers JSON:', error);\n return headersJson;\n }\n}\n\n/**\n * Find API key by ID in a list of API keys\n * @param apiKeys - Array of API keys\n * @param keyId - ID of the API key to find\n * @returns API key object or null\n */\nexport function findApiKeyById(apiKeys: ApiKey[], keyId: string): ApiKey | null {\n return apiKeys.find((key) => key.id === keyId) || null;\n}\n\n/**\n * Validate API key format\n * @param apiKey - API key string to validate\n * @returns Whether the API key format is valid\n */\nexport function validateApiKeyFormat(apiKey: string): boolean {\n // Basic validation - adjust based on your API key format requirements\n return typeof apiKey === 'string' && apiKey.length > 0 && apiKey.trim() !== '';\n}\n\n/**\n * Create default headers with API key\n * @param apiKey - API key object or string\n * @returns Default headers with API key\n */\nexport function createDefaultHeaders(apiKey?: ApiKey | string): HeadersWithApiKey {\n const defaultHeaders: HeadersWithApiKey = {\n 'Content-Type': 'application/json',\n };\n\n if (apiKey) {\n return addApiKeyToHeaders(defaultHeaders, apiKey);\n }\n\n return defaultHeaders;\n}\n\n/**\n * Merge headers with API key\n * @param baseHeaders - Base headers object\n * @param additionalHeaders - Additional headers to merge\n * @param apiKey - API key to add\n * @returns Merged headers with API key\n */\nexport function mergeHeadersWithApiKey(baseHeaders: HeadersWithApiKey, additionalHeaders: HeadersWithApiKey, apiKey?: ApiKey | string): HeadersWithApiKey {\n const mergedHeaders = { ...baseHeaders, ...additionalHeaders };\n\n if (apiKey) {\n return addApiKeyToHeaders(mergedHeaders, apiKey);\n }\n\n return mergedHeaders;\n}\n\n/**\n * Log API key usage (for debugging/analytics)\n * @param apiKey - API key that was used\n * @param endpoint - Endpoint that was called\n * @param success - Whether the request was successful\n */\nexport function logApiKeyUsage(apiKey: ApiKey | string, endpoint: string, success: boolean): void {\n const keyValue = typeof apiKey === 'string' ? apiKey : (apiKey.id || '');\n const keyName = typeof apiKey === 'string' ? 'Unknown' : apiKey.name;\n\n console.log(`API Key Usage:`, {\n keyName,\n keyValue: keyValue.substring(0, 8) + '...',\n endpoint,\n success,\n timestamp: new Date().toISOString(),\n });\n}\n","/**\n * API Version Management Utilities\n * Handles version detection, filtering, and URL transformation\n */\n\nimport type { ApiEndpoint } from '../types';\n\nexport interface ApiVersion {\n id: string;\n name: string;\n description: string;\n isDefault: boolean;\n}\n\n// Available API versions\nexport const API_VERSIONS: ApiVersion[] = [\n {\n id: 'v1',\n name: 'v1',\n description: 'Current stable version',\n isDefault: true,\n },\n];\n\n/**\n * Detect version from endpoint path\n */\nexport const detectEndpointVersion = (path: string): string => {\n // Check for versioned paths like /api/vehicles_api/v1/...\n const versionMatch = path.match(/\\/api\\/[^/]+\\/(v\\d+)\\//);\n if (versionMatch && versionMatch[1]) {\n return versionMatch[1];\n }\n \n // If no version found, default to v1\n return 'v1';\n};\n\n/**\n * Check if endpoint belongs to specific version\n */\nexport const isEndpointInVersion = (endpoint: ApiEndpoint, version: string): boolean => {\n const endpointVersion = detectEndpointVersion(endpoint.path);\n return endpointVersion === version;\n};\n\n/**\n * Filter endpoints by version\n */\nexport const filterEndpointsByVersion = (endpoints: ApiEndpoint[], version: string): ApiEndpoint[] => {\n return endpoints.filter(endpoint => isEndpointInVersion(endpoint, version));\n};\n\n/**\n * Remove duplicate endpoints across versions\n * Keeps only the specified version, removes duplicates from other versions\n */\nexport const deduplicateEndpoints = (endpoints: ApiEndpoint[], preferredVersion: string): ApiEndpoint[] => {\n const endpointMap = new Map<string, ApiEndpoint>();\n \n // Group endpoints by normalized path (without version)\n const groupedEndpoints = new Map<string, ApiEndpoint[]>();\n \n endpoints.forEach(endpoint => {\n const normalizedPath = normalizeEndpointPath(endpoint.path);\n if (!groupedEndpoints.has(normalizedPath)) {\n groupedEndpoints.set(normalizedPath, []);\n }\n groupedEndpoints.get(normalizedPath)!.push(endpoint);\n });\n \n // For each group, pick the endpoint from preferred version\n groupedEndpoints.forEach((endpointGroup, normalizedPath) => {\n let selectedEndpoint: ApiEndpoint | null = null;\n \n // Try to find endpoint in preferred version\n const versionEndpoint = endpointGroup.find(ep => isEndpointInVersion(ep, preferredVersion));\n if (versionEndpoint) {\n selectedEndpoint = versionEndpoint;\n } else if (endpointGroup.length > 0) {\n // Fallback to first available endpoint\n selectedEndpoint = endpointGroup[0] || null;\n }\n \n if (selectedEndpoint) {\n endpointMap.set(normalizedPath, selectedEndpoint);\n }\n });\n \n return Array.from(endpointMap.values());\n};\n\n/**\n * Normalize endpoint path by removing version prefix\n * /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/vehicles/\n * /api/vehicles_api/vehicles/ -> /api/vehicles_api/vehicles/\n */\nexport const normalizeEndpointPath = (path: string): string => {\n // Remove version prefix like /v1/, /v2/, etc.\n return path.replace(/\\/v\\d+\\//, '/');\n};\n\n/**\n * Convert endpoint path to specific version\n */\nexport const convertEndpointToVersion = (endpoint: ApiEndpoint, targetVersion: string): ApiEndpoint => {\n const currentVersion = detectEndpointVersion(endpoint.path);\n \n // If already in target version, return as is\n if (currentVersion === targetVersion) {\n return endpoint;\n }\n \n let newPath = endpoint.path;\n \n // Replace version: /api/vehicles_api/v1/vehicles/ -> /api/vehicles_api/v2/vehicles/\n newPath = newPath.replace(/\\/v\\d+\\//, `/${targetVersion}/`);\n \n return {\n ...endpoint,\n path: newPath,\n };\n};\n\n/**\n * Get version info by ID\n */\nexport const getVersionById = (versionId: string): ApiVersion | undefined => {\n return API_VERSIONS.find(v => v.id === versionId);\n};\n\n/**\n * Get default version\n */\nexport const getDefaultVersion = (): ApiVersion => {\n const defaultVersion = API_VERSIONS.find(v => v.isDefault);\n if (defaultVersion) {\n return defaultVersion;\n }\n \n // Fallback to first version if no default is set\n if (API_VERSIONS.length > 0 && API_VERSIONS[0]) {\n return API_VERSIONS[0];\n }\n \n // This should never happen, but TypeScript requires it\n throw new Error('No API versions defined');\n};\n\n/**\n * Get version statistics from endpoints\n */\nexport const getVersionStats = (endpoints: ApiEndpoint[]): Record<string, number> => {\n const stats: Record<string, number> = {};\n \n API_VERSIONS.forEach(version => {\n stats[version.id] = filterEndpointsByVersion(endpoints, version.id).length;\n });\n \n return stats;\n};\n","// HTTP method colors mapping\nexport const HTTP_METHOD_COLORS = {\n GET: 'success',\n POST: 'primary',\n PUT: 'warning',\n DELETE: 'error',\n PATCH: 'default',\n} as const;\n\n// HTTP status code colors mapping\nexport const HTTP_STATUS_COLORS = {\n '2': 'success',\n '3': 'default',\n '4': 'warning',\n '5': 'error',\n} as const;\n\n// Default request headers\nexport const DEFAULT_HEADERS = {\n 'Content-Type': 'application/json',\n} as const;\n\n// Playground steps configuration\nexport const PLAYGROUND_STEPS = ['endpoints', 'request', 'response'] as const;\n\nexport const STEP_CONFIG = {\n endpoints: {\n title: 'API Endpoints',\n description: 'Browse and select API endpoints',\n },\n request: {\n title: 'Request Builder',\n description: 'Configure your API request',\n },\n response: {\n title: 'Response Viewer',\n description: 'View API response and details',\n },\n} as const;\n","import type { ApiKey } from '../types';\nimport { HTTP_METHOD_COLORS, HTTP_STATUS_COLORS } from '../constants';\n\nexport const getMethodColor = (\n method: string\n): 'success' | 'primary' | 'warning' | 'error' | 'default' => {\n return HTTP_METHOD_COLORS[method.toUpperCase() as keyof typeof HTTP_METHOD_COLORS] || 'default';\n};\n\nexport const getStatusColor = (\n status: number\n): 'success' | 'warning' | 'error' | 'default' => {\n const firstDigit = Math.floor(status / 100).toString();\n return HTTP_STATUS_COLORS[firstDigit as keyof typeof HTTP_STATUS_COLORS] || 'default';\n};\n\nexport const formatApiKeyDisplay = (apiKey: ApiKey): string => {\n const preview = apiKey.id.substring(0, 8);\n return `${apiKey.name} (${preview}...)`;\n};\n\nexport const isValidJson = (str: string): boolean => {\n if (!str || typeof str !== 'string') return false;\n try {\n JSON.parse(str);\n return true;\n } catch {\n return false;\n }\n};\n\nexport const formatRequestHeaders = (headers: Record<string, string>): string => {\n return JSON.stringify(headers, null, 2);\n};\n\nexport const parseRequestHeaders = (headersString: string): Record<string, string> => {\n if (!headersString || typeof headersString !== 'string') {\n return { 'Content-Type': 'application/json' };\n }\n\n try {\n const parsed = JSON.parse(headersString);\n return typeof parsed === 'object' && parsed !== null ? parsed : { 'Content-Type': 'application/json' };\n } catch {\n return { 'Content-Type': 'application/json' };\n }\n};\n\n// Substitute URL parameters like {id}, {userId}, etc.\nexport const substituteUrlParameters = (\n url: string,\n parameters: Record<string, string>\n): string => {\n let substitutedUrl = url;\n\n Object.entries(parameters).forEach(([key, value]) => {\n if (value && value.trim() !== '') {\n // Replace both {key} and %7Bkey%7D patterns (URL encoded version)\n const patterns = [\n new RegExp(`\\\\{${key}\\\\}`, 'g'),\n new RegExp(`%7B${key}%7D`, 'gi'),\n ];\n\n patterns.forEach((pattern) => {\n substitutedUrl = substitutedUrl.replace(pattern, encodeURIComponent(value));\n });\n }\n });\n\n return substitutedUrl;\n};\n","'use client';\n\nimport consola from 'consola';\nimport React, {\n createContext, ReactNode, useCallback, useContext, useEffect, useState\n} from 'react';\n\nimport type {\n ApiEndpoint, ApiResponse, PlaygroundConfig, PlaygroundContextType, PlaygroundState,\n PlaygroundStep\n} from '../types';\nimport { parseRequestHeaders, substituteUrlParameters } from '../utils';\nimport { getDefaultVersion } from '../utils/versionManager';\n\nconst createInitialState = (): PlaygroundState => ({\n // Step management\n currentStep: 'endpoints',\n steps: ['endpoints', 'request', 'response'],\n\n // Endpoint selection\n selectedEndpoint: null,\n selectedCategory: 'All',\n searchTerm: '',\n selectedVersion: getDefaultVersion().id,\n\n // Request configuration\n requestUrl: '',\n requestMethod: 'GET',\n requestHeaders: '{\\n \"Content-Type\": \"application/json\"\\n}',\n requestBody: '',\n selectedApiKey: null,\n manualApiToken: '',\n parameters: {},\n\n // Response\n response: null,\n loading: false,\n\n // UI state\n sidebarOpen: false,\n});\n\nconst PlaygroundContext = createContext<PlaygroundContextType | undefined>(undefined);\n\nexport const usePlaygroundContext = () => {\n const context = useContext(PlaygroundContext);\n if (!context) {\n throw new Error('usePlaygroundContext must be used within a PlaygroundProvider');\n }\n return context;\n};\n\ninterface PlaygroundProviderProps {\n children: ReactNode;\n config: PlaygroundConfig;\n}\n\nexport const PlaygroundProvider: React.FC<PlaygroundProviderProps> = ({ children, config }) => {\n const [state, setState] = useState<PlaygroundState>(() => createInitialState());\n\n // TODO: Get API keys from CFG context - temporarily disabled\n // const { apiKeys: apiKeysResponse, isLoadingApiKeys } = useApiKeysContext();\n // const apiKeys = (apiKeysResponse && apiKeysResponse.results) ? apiKeysResponse.results : [];\n const apiKeys = React.useMemo(() => [], []);\n const isLoadingApiKeys = false;\n\n const updateState = (updates: Partial<PlaygroundState>) => {\n setState((prev) => ({ ...prev, ...updates }));\n };\n\n // Auto-select first API key when available\n useEffect(() => {\n if (!isLoadingApiKeys && apiKeys.length > 0 && !state.selectedApiKey) {\n updateState({ selectedApiKey: apiKeys[0]?.id || null });\n }\n }, [apiKeys, isLoadingApiKeys, state.selectedApiKey]);\n\n // Update headers when API key changes\n useEffect(() => {\n try {\n setState(prev => {\n const headers = parseRequestHeaders(prev.requestHeaders);\n let hasChanged = false;\n\n if (prev.selectedApiKey) {\n const apiKey = apiKeys.find(k => k.id === prev.selectedApiKey);\n\n if (apiKey) {\n // Add API key to headers only if it changed\n if (headers['X-API-Key'] !== apiKey.id) {\n headers['X-API-Key'] = apiKey.id;\n hasChanged = true;\n }\n } else {\n // Selected API key no longer exists, clear selection\n return { ...prev, selectedApiKey: null };\n }\n } else {\n // Remove API key from headers if no key is selected\n if (headers['X-API-Key']) {\n delete headers['X-API-Key'];\n hasChanged = true;\n }\n }\n\n // Only update if headers actually changed\n if (hasChanged) {\n const updatedHeaders = JSON.stringify(headers, null, 2);\n return { ...prev, requestHeaders: updatedHeaders };\n }\n\n return prev;\n });\n } catch (error) {\n consola.error('Error updating headers:', error);\n }\n }, [state.selectedApiKey, apiKeys]); // Removed state.requestHeaders dependency\n\n // Update URL when parameters change\n useEffect(() => {\n if (state.selectedEndpoint && state.parameters) {\n // Path is already a full URL from the endpoint\n const updatedUrl = substituteUrlParameters(state.selectedEndpoint.path, state.parameters);\n\n // Only update if URL actually changed to avoid infinite loop\n if (updatedUrl !== state.requestUrl) {\n updateState({ requestUrl: updatedUrl });\n }\n }\n }, [state.parameters, state.selectedEndpoint, state.requestUrl]);\n\n // Step management\n const setCurrentStep = (step: PlaygroundStep) => {\n updateState({ currentStep: step });\n };\n\n const goToNextStep = () => {\n const currentIndex = state.steps.indexOf(state.currentStep);\n if (currentIndex < state.steps.length - 1) {\n updateState({ currentStep: state.steps[currentIndex + 1] });\n }\n };\n\n const goToPreviousStep = () => {\n const currentIndex = state.steps.indexOf(state.currentStep);\n if (currentIndex > 0) {\n updateState({ currentStep: state.steps[currentIndex - 1] });\n }\n };\n\n // Endpoint management\n const setSelectedEndpoint = (endpoint: ApiEndpoint | null) => {\n if (endpoint) {\n updateState({\n selectedEndpoint: endpoint,\n requestMethod: endpoint.method,\n requestUrl: endpoint.path,\n parameters: {}, // Reset parameters when endpoint changes\n currentStep: 'request'\n });\n } else {\n updateState({ selectedEndpoint: endpoint });\n }\n };\n\n const setSelectedCategory = (category: string) => {\n updateState({ selectedCategory: category });\n };\n\n const setSearchTerm = (term: string) => {\n updateState({ searchTerm: term });\n };\n\n const setSelectedVersion = (version: string) => {\n updateState({ selectedVersion: version });\n };\n\n // Request management\n const setRequestUrl = (url: string) => {\n updateState({ requestUrl: url });\n };\n\n const setRequestMethod = (method: string) => {\n updateState({ requestMethod: method });\n };\n\n const setRequestHeaders = (headers: string) => {\n updateState({ requestHeaders: headers });\n };\n\n const setRequestBody = (body: string) => {\n updateState({ requestBody: body });\n };\n\n const setSelectedApiKey = (apiKeyId: string | null) => {\n updateState({ selectedApiKey: apiKeyId });\n };\n\n const setManualApiToken = (manualApiToken: string) => {\n updateState({ manualApiToken });\n };\n\n const setParameters = (parameters: Record<string, string>) => {\n updateState({ parameters });\n };\n\n // Response management\n const setResponse = (response: ApiResponse | null) => {\n updateState({ response });\n };\n\n const setLoading = (loading: boolean) => {\n updateState({ loading });\n };\n\n // UI management\n const setSidebarOpen = (sidebarOpen: boolean) => {\n updateState({ sidebarOpen });\n };\n\n // Actions\n const clearAll = useCallback(() => {\n setState(createInitialState());\n }, []);\n\n const sendRequest = useCallback(async () => {\n if (!state.requestUrl) {\n consola.error('No URL provided');\n return;\n }\n\n setLoading(true);\n setResponse(null);\n\n try {\n const headers = parseRequestHeaders(state.requestHeaders);\n\n // Bearer token priority: manual token → JWT token from localStorage\n let bearerToken: string | null = null;\n\n if (state.manualApiToken) {\n // Use manual token if provided\n bearerToken = state.manualApiToken;\n } else {\n // Try to get JWT token from localStorage\n if (typeof window !== 'undefined') {\n bearerToken = window.localStorage.getItem('auth_token');\n }\n }\n\n if (bearerToken) {\n headers['Authorization'] = `Bearer ${bearerToken}`;\n }\n\n const requestOptions: RequestInit = {\n method: state.requestMethod,\n headers,\n };\n\n if (state.requestBody && state.requestMethod !== 'GET') {\n requestOptions.body = state.requestBody;\n }\n\n const response = await fetch(state.requestUrl, requestOptions);\n const responseText = await response.text();\n\n let responseData;\n try {\n responseData = JSON.parse(responseText);\n } catch {\n responseData = responseText;\n }\n\n setResponse({\n status: response.status,\n statusText: response.statusText,\n headers: Object.fromEntries(response.headers.entries()),\n data: responseData,\n });\n\n consola.success(`Request successful: ${state.requestMethod} ${state.requestUrl}`);\n\n // Auto-advance to response step\n updateState({ currentStep: 'response' });\n } catch (error) {\n consola.error('Request failed:', error);\n setResponse({\n error: error instanceof Error ? error.message : 'Request failed',\n });\n } finally {\n setLoading(false);\n }\n }, [state, setLoading, setResponse]);\n\n const contextValue: PlaygroundContextType = {\n // State\n state,\n config,\n apiKeys,\n apiKeysLoading: isLoadingApiKeys,\n\n // Step management\n setCurrentStep,\n goToNextStep,\n goToPreviousStep,\n\n // Endpoint management\n setSelectedEndpoint,\n setSelectedCategory,\n setSearchTerm,\n setSelectedVersion,\n\n // Request management\n setRequestUrl,\n setRequestMethod,\n setRequestHeaders,\n setRequestBody,\n setSelectedApiKey,\n setManualApiToken,\n setParameters,\n\n // Response management\n setResponse,\n setLoading,\n\n // UI management\n setSidebarOpen,\n\n // Actions\n clearAll,\n sendRequest,\n };\n\n return <PlaygroundContext.Provider value={contextValue}>{children}</PlaygroundContext.Provider>;\n}; "]}
|