juno-code 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +117 -0
- package/dist/bin/cli.js +22048 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/bin/cli.mjs +22014 -0
- package/dist/bin/cli.mjs.map +1 -0
- package/dist/bin/feedback-collector.js +128 -0
- package/dist/bin/feedback-collector.js.map +1 -0
- package/dist/bin/feedback-collector.mjs +126 -0
- package/dist/bin/feedback-collector.mjs.map +1 -0
- package/dist/index.js +15006 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +14725 -0
- package/dist/index.mjs.map +1 -0
- package/dist/templates/scripts/clean_logs_folder.sh +170 -0
- package/dist/templates/scripts/install_requirements.sh +221 -0
- package/package.json +82 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/version.ts","../src/utils/environment.ts","../src/tui/types.ts","../src/tui/apps/TUIApp.tsx","../src/tui/components/Input.tsx","../src/tui/components/Dialog.tsx","../src/tui/components/Select.tsx","../src/tui/hooks/useKeyboard.ts","../src/tui/hooks/useTUIState.ts","../src/tui/utils/templateVariables.ts","../src/tui/utils/tokenEstimator.ts","../src/tui/utils/promptAnalyzer.ts","../src/tui/utils/syntaxHighlighter.ts","../src/tui/apps/PromptEditor.tsx","../src/tui/utils/renderer.ts","../src/tui/utils/headless.ts","../src/index.ts","../src/core/config.ts","../src/core/profiles.ts","../src/core/engine.ts","../src/mcp/errors.ts","../src/utils/hooks.ts","../src/cli/utils/advanced-logger.ts","../src/cli/utils/rich-formatter.ts","../node_modules/strip-ansi/index.js","../node_modules/strip-ansi/node_modules/ansi-regex/index.js","../src/core/session.ts","../src/core/metrics.ts","../src/utils/validation.ts","../src/cli/types.ts","../src/types/index.ts","../src/tui/index.ts","../src/tui/components/Spinner.tsx","../src/tui/components/ProgressBar.tsx","../src/mcp/index.ts","../src/mcp/client.ts","../src/mcp/types.ts","../src/mcp/advanced/progress-stream.ts","../src/mcp/config.ts","../src/utils/logger.ts","../src/utils/terminal-progress-writer.ts","../src/utils/feedback-state.ts","../src/mcp/client-stub.ts","../src/mcp/advanced/index.ts","../src/errors/index.ts","../src/errors/base.ts","../src/errors/context.ts","../src/errors/categories.ts","../src/errors/codes.ts","../src/errors/recovery.ts","../src/errors/system.ts","../src/errors/validation.ts","../src/errors/configuration.ts","../src/errors/mcp.ts","../src/errors/template.ts","../src/errors/session.ts","../src/errors/cli.ts","../src/errors/tui.ts","../src/errors/utils.ts","../src/errors/manager.ts","../src/errors/reporter.ts","../src/errors/legacy.ts"],"names":["version","process2","env","delimiter","supportsColor","os","path5","platform","fs","TUIError","DEFAULT_TUI_THEME","TUIInputError","KEYS","SPINNER_FRAMES","PROGRESS_CHARS","TUIApp","TUILayout","TUIScreen","TUIScreenManager","useTUIContext","React","jsxs","Box","Text","jsx","useState","useRef","useEffect","useCallback","useInput","Input","Validators","chalk","AlertDialog","ChoiceDialog","ConfirmDialog","Dialog","ErrorDialog","ProgressDialog","styling","BooleanSelect","MultiSelect","QuickSelect","SearchableSelect","Select","SingleSelect","useMemo","Fragment","isValid","PromptEditor","SimplePromptEditor","getCurrentLineIndex","getLineStartPosition","getLineEndPosition","TUIRenderer","tuiRenderer","stdout","stdin","render","resolve","readline","z","path","fsPromises","yaml","path2","yaml2","nodeFs","MCPErrorCode","Table","LogLevel","result","execa","success","ExecutionStatus","EventEmitter","path3","fs2","uuidv4","PerformanceObserver","performance","memoryUsage","totalmem","freemem","path4","LogLevelSchema","path6","currentStepText","isTUIAvailable","headlessPromptEditor","initializeTUIRenderer","renderAndWait","MCPConnectionState","ProgressEventType","ToolExecutionStatus","SubagentCapability","SubagentStatus","ConnectionEventType","RecoveryStrategyType","SessionState","SessionStorageType","SUBAGENT_ALIASES","path7","EOL","StdioClientTransport","spawn","Client","logger","mcpLogger","ErrorCategory","ErrorSeverity","ErrorPriority","ErrorHandlingStrategy","RecoveryActionType","ErrorCode","requiresUserIntervention","ValidationError","MCPError"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKaA;AALb,IAAA,YAAA,GAAA,KAAA,CAAA;AAAA,EAAA,gBAAA,GAAA;AAKO,IAAMA,eAAA,GAAU,OAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACuGhB,SAAS,qBAAA,GAAiC;AAE/C,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,IAAA;AAAA,IACA,wBAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,qBAAA;AAAA;AAAA,IACA,oBAAA;AAAA;AAAA,IACA;AAAA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,aAAa,YAAA,EAAc;AACpC,IAAA,IAAYC,mBAAA,CAAA,GAAA,CAAI,SAAS,CAAA,EAAG;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,CAASA,mBAAA,CAAA,KAAA,CAAM,KAAA,IAAS,CAASA,2BAAO,KAAA,EAAO;AACjD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAcO,SAAS,eAAA,GAA2B;AACzC,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,IAAA;AAAA,IACA,wBAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,aAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,aAAa,IAAA,CAAK,CAAA,SAAA,KAAa,QAAgBA,mBAAA,CAAA,GAAA,CAAI,SAAS,CAAC,CAAC,CAAA;AACvE;AAcO,SAAS,qBAAA,GAAiC;AAC/C,EAAA,OAAO,QAAgBA,mBAAA,CAAA,KAAA,CAAM,KAAA,IAAiBA,2BAAO,KAAA,IAAS,CAAC,uBAAuB,CAAA;AACxF;AAcO,SAAS,iBAAA,GAA6B;AAC3C,EAAA,MAAM,UAAU,kBAAA,EAAmB;AACnC,EAAA,OAAO,OAAA,KAAY,aAAA,IAAiB,OAAA,CAAgBA,mBAAA,CAAA,GAAA,CAAI,KAAK,CAAA;AAC/D;AAaO,SAAS,kBAAA,GAAsC;AACpD,EAAA,MAAMC,IAAAA,GAAcD,mBAAA,CAAA,GAAA,CAAI,QAAA,EAAU,WAAA,EAAY;AAE9C,EAAA,IAAIC,IAAAA,KAAQ,cAAc,OAAO,YAAA;AACjC,EAAA,IAAIA,IAAAA,KAAQ,QAAQ,OAAO,MAAA;AAC3B,EAAA,OAAO,aAAA;AACT;AAmBO,SAAS,SAAA,CAAU,KAAa,YAAA,EAA2C;AAChF,EAAA,OAAeD,mBAAA,CAAA,GAAA,CAAI,GAAG,CAAA,IAAK,YAAA;AAC7B;AAcO,SAAS,oBAAA,CAAqB,KAAa,YAAA,EAA8B;AAC9E,EAAA,OAAeA,mBAAA,CAAA,GAAA,CAAI,GAAG,CAAA,IAAK,YAAA;AAC7B;AAaO,SAAS,SAAA,CAAU,KAAa,KAAA,EAAqB;AAC1D,EAAQA,mBAAA,CAAA,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA;AACrB;AAeO,SAAS,eAAA,CAAgB,KAAA,EAA2B,YAAA,GAAwB,KAAA,EAAgB;AACjG,EAAA,IAAI,CAAC,OAAO,OAAO,YAAA;AAEnB,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,WAAA,EAAY,CAAE,IAAA,EAAK;AAC5C,EAAA,OAAO,CAAC,QAAQ,GAAA,EAAK,KAAA,EAAO,MAAM,SAAS,CAAA,CAAE,SAAS,UAAU,CAAA;AAClE;AAeO,SAAS,cAAA,CAAe,KAAA,EAA2B,YAAA,GAAuB,CAAA,EAAW;AAC1F,EAAA,IAAI,CAAC,OAAO,OAAO,YAAA;AAEnB,EAAA,MAAM,MAAA,GAAS,OAAO,KAAK,CAAA;AAC3B,EAAA,OAAO,KAAA,CAAM,MAAM,CAAA,GAAI,YAAA,GAAe,MAAA;AACxC;AAgBO,SAAS,cACd,KAAA,EACAE,UAAAA,GAAoB,GAAA,EACpB,YAAA,GAAyB,EAAC,EAChB;AACV,EAAA,IAAI,CAAC,OAAO,OAAO,YAAA;AAEnB,EAAA,OAAO,KAAA,CAAM,KAAA,CAAMA,UAAS,CAAA,CAAE,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACvE;AAiBO,SAAS,gBAAA,GAA2B;AACzC,EAAA,OAAeF,2BAAO,OAAA,IAAW,EAAA;AACnC;AAaO,SAAS,iBAAA,GAA4B;AAC1C,EAAA,OAAeA,2BAAO,IAAA,IAAQ,EAAA;AAChC;AAcO,SAASG,cAAAA,GAAyB;AAEvC,EAAA,IAAYH,wBAAI,WAAA,EAAa;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAYA,mBAAA,CAAA,GAAA,CAAI,QAAA,IAAoBA,mBAAA,CAAA,GAAA,CAAI,mBAAA,EAAqB;AAC3D,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAASA,2BAAO,KAAA,EAAO;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,OAAeA,mBAAA,CAAA,GAAA,CAAI,IAAA;AACzB,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,KAAS,MAAA,EAAQ;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,aAAa,CAAC,OAAA,EAAS,MAAA,EAAQ,WAAA,EAAa,YAAY,OAAO,CAAA;AACrE,EAAA,OAAO,WAAW,IAAA,CAAK,CAAA,SAAA,KAAa,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAC9D;AAeO,SAAS,eAAA,GAAgC;AAC9C,EAAA,IAAI,CAACG,gBAAc,EAAG;AACpB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAeH,wBAAI,IAAA,IAAQ,EAAA;AACjC,EAAA,MAAM,SAAA,GAAoBA,wBAAI,SAAA,IAAa,EAAA;AAG3C,EAAA,IAAI,SAAA,KAAc,WAAA,IAAe,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3D,IAAA,OAAO,WAAA;AAAA,EACT;AAGA,EAAA,IAAI,KAAK,QAAA,CAAS,KAAK,KAAK,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG;AACrD,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,OAAA;AACT;AAcO,SAAS,UAAA,GAAsB;AACpC,EAAA,IAAI;AAEF,IAAA,SAAA,CAAQ,IAAS,CAAA,CAAE,UAAA,CAAW,aAAa,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAEN,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,SAAA,CAAQ,IAAS,CAAA,CAAE,YAAA,CAAa,kBAAkB,MAAM,CAAA;AACvE,MAAA,OAAO,OAAO,QAAA,CAAS,QAAQ,CAAA,IAAK,MAAA,CAAO,SAAS,YAAY,CAAA;AAAA,IAClE,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF;AAiBO,SAAS,WAAA,GAAwB;AACtC,EAAA,OAAUI,aAAA,CAAA,QAAA,EAAS;AACrB;AAaO,SAAS,eAAA,GAAgC;AAC9C,EAAA,OAAUA,aAAA,CAAA,IAAA,EAAK;AACjB;AAaO,SAAS,QAAA,GAAsB;AACpC,EAAA,MAAM,KAAA,GAAgBJ,mBAAA,CAAA,GAAA,CAAI,KAAA,IAAiBA,mBAAA,CAAA,GAAA,CAAI,OAAA,IAAW,EAAA;AAC1D,EAAA,MAAM,SAAA,GAAiBK,gBAAA,CAAA,QAAA,CAAS,KAAK,CAAA,CAAE,WAAA,EAAY;AAEnD,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,MAAA;AACvC,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AACtC,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG,OAAO,MAAA;AACvC,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AACtC,EAAA,IAAI,SAAA,CAAU,SAAS,YAAY,CAAA,IAAK,UAAU,QAAA,CAAS,MAAM,GAAG,OAAO,YAAA;AAE3E,EAAA,OAAO,SAAA;AACT;AAaO,SAAS,gBAAA,GAA2B;AACzC,EAAA,OAAUD,aAAA,CAAA,OAAA,EAAQ;AACpB;AAaO,SAAS,gBAAA,GAA2B;AACzC,EAAA,OAAUA,aAAA,CAAA,MAAA,EAAO;AACnB;AAmBO,SAAS,kBAAA,CAAmB,UAAkB,WAAA,EAAqB;AACxE,EAAA,MAAME,YAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,OAAO,gBAAA,EAAiB;AAE9B,EAAA,QAAQA,SAAAA;AAAU,IAChB,KAAK,OAAA;AACH,MAAA,OAAYD,gBAAA,CAAA,IAAA,CAAaL,wBAAI,OAAA,IAAgBK,gBAAA,CAAA,IAAA,CAAK,MAAM,SAAA,EAAW,SAAS,GAAG,OAAO,CAAA;AAAA,IACxF,KAAK,QAAA;AACH,MAAA,OAAYA,gBAAA,CAAA,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,qBAAA,EAAuB,OAAO,CAAA;AAAA,IAClE;AACE,MAAA,OAAYA,sBAAaL,mBAAA,CAAA,GAAA,CAAI,eAAA,IAAwBK,sBAAK,IAAA,EAAM,SAAS,GAAG,OAAO,CAAA;AAAA;AAEzF;AAaO,SAAS,gBAAA,CAAiB,UAAkB,WAAA,EAAqB;AACtE,EAAA,MAAMC,YAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,OAAO,gBAAA,EAAiB;AAE9B,EAAA,QAAQA,SAAAA;AAAU,IAChB,KAAK,OAAA;AACH,MAAA,OAAYD,gBAAA,CAAA,IAAA,CAAaL,wBAAI,YAAA,IAAqBK,gBAAA,CAAA,IAAA,CAAK,MAAM,SAAA,EAAW,OAAO,GAAG,OAAO,CAAA;AAAA,IAC3F,KAAK,QAAA;AACH,MAAA,OAAYA,gBAAA,CAAA,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,qBAAA,EAAuB,OAAO,CAAA;AAAA,IAClE;AACE,MAAA,OAAYA,gBAAA,CAAA,IAAA,CAAaL,wBAAI,aAAA,IAAsBK,gBAAA,CAAA,IAAA,CAAK,MAAM,QAAA,EAAU,OAAO,GAAG,OAAO,CAAA;AAAA;AAE/F;AAaO,SAAS,iBAAA,CAAkB,UAAkB,WAAA,EAAqB;AACvE,EAAA,MAAMC,YAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,OAAO,gBAAA,EAAiB;AAE9B,EAAA,QAAQA,SAAAA;AAAU,IAChB,KAAK,OAAA;AACH,MAAA,OAAYD,gBAAA,CAAA,IAAA,CAAaL,wBAAI,IAAA,IAAaK,gBAAA,CAAA,IAAA,CAAK,MAAM,SAAA,EAAW,OAAA,EAAS,MAAM,CAAA,EAAG,OAAO,CAAA;AAAA,IAC3F,KAAK,QAAA;AACH,MAAA,OAAYA,gBAAA,CAAA,IAAA,CAAK,IAAA,EAAM,SAAA,EAAW,QAAA,EAAU,OAAO,CAAA;AAAA,IACrD;AACE,MAAA,OAAYA,sBAAaL,mBAAA,CAAA,GAAA,CAAI,cAAA,IAAuBK,sBAAK,IAAA,EAAM,QAAQ,GAAG,OAAO,CAAA;AAAA;AAEvF;AAaA,eAAsB,2BAA2B,OAAA,EAAgC;AAC/E,EAAA,IAAI;AACF,IAAA,MAAME,gBAAG,KAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC7C,SAAS,KAAA,EAAO;AACd,IAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AACF;AAiBO,SAAS,cAAA,GAA8B;AAC5C,EAAA,OAAO;AAAA,IACL,GAAA,EAAaP,mBAAA,CAAA,GAAA;AAAA,IACb,MAAcA,mBAAA,CAAA,IAAA,IAAQ,CAAA;AAAA,IACtB,UAAU,WAAA,EAAY;AAAA,IACtB,MAAM,eAAA,EAAgB;AAAA,IACtB,WAAA,EAAqBA,mBAAA,CAAA,OAAA;AAAA,IACrB,QAAgBA,mBAAA,CAAA,MAAA,EAAO;AAAA,IACvB,KAAaA,mBAAA,CAAA,GAAA,EAAI;AAAA,IACjB,QAAA,EAAkBA,mBAAA,CAAA,QAAA;AAAA,IAClB,IAAA,EAAcA,mBAAA,CAAA,IAAA;AAAA,IACd,GAAA,EAAaA,mBAAA,CAAA;AAAA,GACf;AACF;AAcO,SAAS,eAAA,GAA2B;AACzC,EAAA,MAAMM,YAAW,WAAA,EAAY;AAE7B,EAAA,IAAIA,cAAa,OAAA,EAAS;AAExB,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,QAAA,EAAS,GAAI,SAAA,CAAQ,eAAoB,CAAA;AACjD,MAAA,QAAA,CAAS,aAAA,EAAe,EAAE,KAAA,EAAO,QAAA,EAAU,CAAA;AAC3C,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,OAAeN,8BAAS,KAAM,CAAA;AAAA,EAChC;AACF;AAaO,SAAS,cAAA,GAA8B;AAC5C,EAAA,OAAeA,mBAAA,CAAA,WAAA,EAAY;AAC7B;AAaO,SAAS,WAAA,GAAwB;AACtC,EAAA,OAAeA,mBAAA,CAAA,QAAA,EAAS;AAC1B;AAqBA,eAAsB,iBAAA,CAAkB,aAAqB,YAAA,EAAsC;AACjG,EAAA,MAAMM,YAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,cAAwB,EAAC;AAG/B,EAAA,MAAM,OAAA,GAAkBN,wBAAI,IAAA,IAAQ,EAAA;AACpC,EAAA,WAAA,CAAY,IAAA,CAAK,GAAG,OAAA,CAAQ,KAAA,CAAWK,0BAAS,CAAC,CAAA;AAGjD,EAAA,IAAIC,cAAa,OAAA,EAAS;AACxB,IAAA,WAAA,CAAY,IAAA;AAAA,MACV,6BAAA;AAAA,MACA,mCAAA;AAAA,MACKD,sBAAaL,mBAAA,CAAA,GAAA,CAAI,YAAA,IAAgB,EAAA,EAAI,UAAA,EAAY,OAAO,KAAK;AAAA,KACpE;AAAA,EACF,CAAA,MAAO;AACL,IAAA,WAAA,CAAY,IAAA;AAAA,MACV,gBAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA;AAAA,MACKK,gBAAA,CAAA,IAAA,CAAK,gBAAA,EAAiB,EAAG,QAAA,EAAU,KAAK,CAAA;AAAA,MACxCA,gBAAA,CAAA,IAAA,CAAK,gBAAA,EAAiB,EAAG,KAAK;AAAA,KACrC;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAaC,SAAAA,KAAa,OAAA,GAAU,CAAA,EAAG,UAAU,CAAA,IAAA,CAAA,GAAS,UAAA;AAGhE,EAAA,KAAA,MAAW,cAAc,WAAA,EAAa;AACpC,IAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,IAAA,MAAM,QAAA,GAAgBD,gBAAA,CAAA,IAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AACjD,IAAA,IAAI;AACF,MAAA,MAAME,eAAAA,CAAG,OAAO,QAAA,EAAUA,eAAAA,CAAG,UAAU,IAAA,GAAOA,eAAAA,CAAG,UAAU,IAAI,CAAA;AAC/D,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAgBA,eAAsB,sBAAsB,UAAA,EAAsC;AAChF,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAMA,eAAAA,CAAG,IAAA,CAAK,UAAU,CAAA;AACtC,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAO,EAAG;AACnB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAMA,eAAAA,CAAG,MAAA,CAAO,UAAA,EAAYA,eAAAA,CAAG,UAAU,IAAI,CAAA;AAC7C,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAcO,SAAS,uBAAA,CAAwB,aAAA,GAAwC,EAAC,EAAyB;AACxG,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,IAAA,EAAcP,wBAAI,IAAA,IAAQ,EAAA;AAAA,IAC1B,UAAU,kBAAA,EAAmB;AAAA,IAC7B,MAAM,gBAAA,EAAiB;AAAA,IACvB,QAAQ,gBAAA;AAAiB,GAC3B;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IACH,GAAG;AAAA,GACL;AACF;AAl2BA,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,0BAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC+nBO,SAAS,WAAW,KAAA,EAAmC;AAC5D,EAAA,OAAO,KAAA,YAAiBQ,SAAAA;AAC1B;AAKO,SAAS,gBAAgB,KAAA,EAAwC;AACtE,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,UAAU,IAAA,IACV,KAAA,IAAS,SACT,MAAA,IAAU,KAAA;AAEd;AA3lBaC,kCAAA,CAAA,KAoiBAD,SAAAA,CAAAA,CA2BAE,8BAAA,CAAA,CAqCAC,qBAAA,CAAA,CAsBAC,+BAAA,CAAA,CAYAC;AAxrBb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,kBAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AAkDO,IAAMJ,yBAAA,GAA8B;AAAA,MACzC,OAAA,EAAS,SAAA;AAAA,MACT,SAAA,EAAW,SAAA;AAAA,MACX,OAAA,EAAS,SAAA;AAAA,MACT,OAAA,EAAS,SAAA;AAAA,MACT,KAAA,EAAO,SAAA;AAAA,MACP,KAAA,EAAO,SAAA;AAAA,MACP,UAAA,EAAY,SAAA;AAAA,MACZ,IAAA,EAAM;AAAA,KACR;AA2hBO,IAAMD,SAAAA,GAAN,cAAuB,KAAA,CAAM;AAAA;AAAA,MAElC,IAAA;AAAA;AAAA,MAEA,SAAA;AAAA,MAEA,WAAA,CAAY,OAAA,EAAiB,IAAA,GAAe,WAAA,EAAa,SAAA,EAAoB;AAC3E,QAAA,KAAA,CAAM,OAAO,CAAA;AACb,QAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,QAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,MACnB;AAAA,KACF;AAeO,IAAME,qBAAA,GAAN,cAA4BF,SAAAA,CAAS;AAAA,MAC1C,WAAA,CAAY,SAAiB,SAAA,EAAoB;AAC/C,QAAA,KAAA,CAAM,OAAA,EAAS,mBAAmB,SAAS,CAAA;AAC3C,QAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,MACd;AAAA,KACF;AAgCO,IAAMG,YAAA,GAAO;AAAA,MAClB,KAAA,EAAO,QAAA;AAAA,MACP,MAAA,EAAQ,QAAA;AAAA,MACR,GAAA,EAAK,KAAA;AAAA,MACL,SAAA,EAAW,WAAA;AAAA,MACX,MAAA,EAAQ,QAAA;AAAA,MACR,EAAA,EAAI,SAAA;AAAA,MACJ,IAAA,EAAM,WAAA;AAAA,MACN,IAAA,EAAM,WAAA;AAAA,MACN,KAAA,EAAO,YAAA;AAAA,MACP,IAAA,EAAM,MAAA;AAAA,MACN,GAAA,EAAK,KAAA;AAAA,MACL,OAAA,EAAS,QAAA;AAAA,MACT,SAAA,EAAW,UAAA;AAAA,MACX,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ;AAAA,KACV;AAKO,IAAMC,sBAAA,GAAiB;AAAA,MAC5B,IAAA,EAAM,CAAC,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAG,CAAA;AAAA,MACvD,IAAA,EAAM,CAAC,GAAA,EAAK,GAAA,EAAK,KAAK,IAAI,CAAA;AAAA,MAC1B,KAAK,CAAC,QAAA,EAAK,UAAK,QAAA,EAAK,QAAA,EAAK,UAAK,QAAG,CAAA;AAAA,MAClC,KAAA,EAAO,CAAC,QAAA,EAAK,QAAA,EAAK,UAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAG,CAAA;AAAA,MAC9C,MAAA,EAAQ,CAAC,QAAA,EAAK,QAAA,EAAK,UAAK,QAAG,CAAA;AAAA,MAC3B,KAAA,EAAO,CAAC,QAAA,EAAK,QAAA,EAAK,UAAK,QAAG;AAAA,KAC5B;AAKO,IAAMC,sBAAA,GAAiB;AAAA,MAC5B,QAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAY,QAAA;AAAA,MACZ,MAAA,EAAQ;AAAA,KACV;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC5rBA,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,MAAA,EAAA,MAAAC,cAAA;AAAA,EAAA,SAAA,EAAA,MAAAC,iBAAA;AAAA,EAAA,SAAA,EAAA,MAAAC,iBAAA;AAAA,EAAA,gBAAA,EAAA,MAAAC,wBAAA;AAAA,EAAA,OAAA,EAAA,MAAA,cAAA;AAAA,EAAA,aAAA,EAAA,MAAAC;AAAA,CAAA,CAAA;AAAA,IAuBM,oBAKOA,8BAAA,CAAA,KAWP,gBAAA,CAAA,CA0COJ,uBAAA,CAAA,CAgLAE,0BAAA,CAAA,CAmCAC,mCA8DAF,0BAAA,CAAA,KAoGN;AAtcP,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,yBAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AASA,IAAA,gBAAA,EAAA;AASA,IAAA,UAAA,EAAA;AAKA,IAAM,kBAAA,GAAqBI,uBAAA,CAAM,aAAA,CAAiC,IAAI,CAAA;AAK/D,IAAMD,wBAAgB,MAAkB;AAC7C,MAAA,MAAM,OAAA,GAAUC,uBAAA,CAAM,UAAA,CAAW,kBAAkB,CAAA;AACnD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAIX,SAAAA,CAAS,4CAAA,EAA8C,mBAAmB,CAAA;AAAA,MACtF;AACA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAKA,IAAM,gBAAA,GAAN,cAA+BW,uBAAA,CAAM,SAAA,CAGnC;AAAA,MACA,YAAY,KAAA,EAAY;AACtB,QAAA,KAAA,CAAM,KAAK,CAAA;AACX,QAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,QAAA,EAAU,KAAA,EAAM;AAAA,MACjC;AAAA,MAEA,OAAO,yBAAyB,KAAA,EAAc;AAC5C,QAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM;AAAA,MACjC;AAAA,MAEA,iBAAA,CAAkB,OAAc,SAAA,EAA4B;AAC1D,QAAA,OAAA,CAAQ,KAAA,CAAM,qCAAA,EAAuC,KAAA,EAAO,SAAS,CAAA;AACrE,QAAA,IAAA,CAAK,KAAA,CAAM,UAAU,KAAK,CAAA;AAAA,MAC5B;AAAA,MAEA,MAAA,GAAS;AACP,QAAA,IAAI,IAAA,CAAK,MAAM,QAAA,EAAU;AACvB,UAAA,uBACEC,eAAA,CAACC,OAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,SAAS,CAAA,EACnC,QAAA,EAAA;AAAA,4BAAAD,eAAA,CAACE,QAAA,EAAA,EAAK,KAAA,EAAM,KAAA,EAAM,IAAA,EAAI,IAAA,EAAC,QAAA,EAAA;AAAA,cAAA,aAAA;AAAA,cACT,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,OAAA,IAAW;AAAA,aAAA,EAC3C,CAAA;AAAA,4BACAC,cAAA,CAACD,QAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,2DAAA,EAEnB,CAAA;AAAA,4BACAC,cAAA,CAACD,QAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,QAAA,EAAA,uDAAA,EAEnB;AAAA,WAAA,EACF,CAAA;AAAA,QAEJ;AAEA,QAAA,OAAO,KAAK,KAAA,CAAM,QAAA;AAAA,MACpB;AAAA,KACF;AAKO,IAAMR,iBAAgC,CAAC;AAAA,MAC5C,KAAA;AAAA,MACA,YAAA,GAAe,IAAA;AAAA,MACf,KAAA,EAAO,cAAc,EAAC;AAAA,MACtB,QAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA,GAAe;AAAA,KACjB,KAAM;AACJ,MAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIU,eAAA,CAAsB;AAAA,QACpD,QAAA,EAAU,IAAA;AAAA,QACV,YAAA,EAAc;AAAA,OACf,CAAA;AAED,MAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAAA,CAAmB;AAAA,QACzD,GAAGf,yBAAA;AAAA,QACH,GAAG;AAAA,OACJ,CAAA;AAED,MAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIe,eAAA,CAA2B;AAAA,QAC7D,KAAA,EAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AAAA,QACjC,MAAA,EAAQ,OAAA,CAAQ,MAAA,CAAO,IAAA,IAAQ;AAAA,OAChC,CAAA;AAED,MAAA,MAAM,aAAa,qBAAA,EAAsB;AACzC,MAAA,MAAM,UAAA,GAAaC,cAAO,KAAK,CAAA;AAG/B,MAAAC,gBAAA,CAAU,MAAM;AACd,QAAA,MAAM,eAAe,MAAM;AACzB,UAAA,aAAA,CAAc;AAAA,YACZ,KAAA,EAAO,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AAAA,YACjC,MAAA,EAAQ,OAAA,CAAQ,MAAA,CAAO,IAAA,IAAQ;AAAA,WAChC,CAAA;AAAA,QACH,CAAA;AAEA,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,OAAA,CAAQ,MAAA,CAAO,EAAA,CAAG,QAAA,EAAU,YAAY,CAAA;AACxC,UAAA,OAAO,MAAM;AACX,YAAA,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,YAAY,CAAA;AAAA,UAC3C,CAAA;AAAA,QACF;AAAA,MACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAGf,MAAAA,gBAAA,CAAU,MAAM;AACd,QAAA,IAAI,YAAA,IAAgB,CAAC,UAAA,IAAc,CAAC,WAAW,OAAA,EAAS;AACtD,UAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,sBAAsB,CAAA;AAC3C,UAAA,UAAA,CAAW,OAAA,GAAU,IAAA;AAAA,QACvB;AAAA,MACF,CAAA,EAAG,CAAC,YAAA,EAAc,UAAU,CAAC,CAAA;AAG7B,MAAA,MAAM,WAAA,GAAcC,kBAAA,CAAY,CAAC,QAAA,KAAgC;AAC/D,QAAA,eAAA,CAAgB,WAAS,EAAE,GAAG,IAAA,EAAM,GAAG,UAAS,CAAE,CAAA;AAAA,MACpD,CAAA,EAAG,EAAE,CAAA;AAGL,MAAA,MAAM,IAAA,GAAOA,kBAAA,CAAY,CAAC,IAAA,GAAe,CAAA,KAAM;AAC7C,QAAA,WAAA,CAAY,WAAS,EAAE,GAAG,IAAA,EAAM,QAAA,EAAU,OAAM,CAAE,CAAA;AAClD,QAAA,MAAA,GAAS,IAAI,CAAA;AAAA,MACf,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAGX,MAAAC,YAAA;AAAA,QACE,CAAC,OAAO,GAAA,KAAQ;AACd,UAAA,IAAI,CAAC,SAAS,QAAA,EAAU;AAGxB,UAAA,IAAI,GAAA,CAAI,UAAU,YAAA,EAAc;AAC9B,YAAA,IAAA,CAAK,CAAC,CAAA;AACN,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,GAAA,CAAI,IAAA,IAAQ,KAAA,KAAU,GAAA,EAAK;AAC7B,YAAA,IAAA,CAAK,GAAG,CAAA;AACR,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,IAAI,GAAA,EAAK;AACX,YAAA,WAAA,CAAY,CAAA,IAAA,MAAS;AAAA,cACnB,GAAG,IAAA;AAAA,cACH,YAAA,EAAc,CAAC,IAAA,CAAK;AAAA,aACtB,CAAE,CAAA;AACF,YAAA;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,EAAE,QAAA,EAAU,QAAA,CAAS,QAAA;AAAS,OAChC;AAGA,MAAA,MAAM,WAAA,GAAcD,kBAAA,CAAY,CAAC,KAAA,KAAiB;AAChD,QAAA,WAAA,CAAY,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,OAAM,CAAE,CAAA;AACxC,QAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAAA,MAC/C,CAAA,EAAG,EAAE,CAAA;AAGL,MAAA,MAAM,YAAA,GAA2B;AAAA,QAC/B,KAAA,EAAO,YAAA;AAAA,QACP,UAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA;AAAA,OACF;AAGA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,uBACEJ,cAAA,CAAC,mBAAmB,QAAA,EAAnB,EAA4B,OAAO,YAAA,EAClC,QAAA,kBAAAH,eAAA,CAACC,OAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAChB,QAAA,EAAA;AAAA,UAAA,KAAA,oBACCE,cAAA,CAACD,QAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAE,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,UAEnB;AAAA,SAAA,EACH,CAAA,EACF,CAAA;AAAA,MAEJ;AAGA,MAAA,uBACEC,cAAA,CAAC,mBAAmB,QAAA,EAAnB,EAA4B,OAAO,YAAA,EAClC,QAAA,kBAAAA,cAAA,CAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,WAAA,EACzB,QAAA,kBAAAH,eAAA;AAAA,QAACC,OAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAc,QAAA;AAAA,UACd,OAAO,UAAA,CAAW,KAAA;AAAA,UAClB,MAAA,EAAQ,QAAA,CAAS,YAAA,GAAe,UAAA,CAAW,MAAA,GAAS,MAAA;AAAA,UAGnD,QAAA,EAAA;AAAA,YAAA,KAAA,oBACCD,eAAA;AAAA,cAACC,OAAA;AAAA,cAAA;AAAA,gBACC,KAAA,EAAM,MAAA;AAAA,gBACN,WAAA,EAAY,OAAA;AAAA,gBACZ,aAAa,YAAA,CAAa,OAAA;AAAA,gBAC1B,QAAA,EAAU,CAAA;AAAA,gBACV,YAAA,EAAc,CAAA;AAAA,gBAEd,QAAA,EAAA;AAAA,kCAAAE,cAAA,CAACD,YAAK,KAAA,EAAO,YAAA,CAAa,OAAA,EAAS,IAAA,EAAI,MACpC,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,kCACAC,cAAA,CAACF,OAAA,EAAA,EAAI,QAAA,EAAU,CAAA,EAAG,CAAA;AAAA,iDACjBC,QAAA,EAAA,EAAK,KAAA,EAAO,aAAa,KAAA,EACvB,QAAA,EAAA,YAAA,GAAe,gBAAgB,gBAAA,EAClC;AAAA;AAAA;AAAA,aACF;AAAA,2CAIDD,OAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,QAAA,EAAU,GACnC,QAAA,EACH,CAAA;AAAA,YAGC,SAAS,KAAA,oBACRE,cAAA;AAAA,cAACF,OAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAW,CAAA;AAAA,gBACX,WAAA,EAAY,OAAA;AAAA,gBACZ,aAAa,YAAA,CAAa,KAAA;AAAA,gBAC1B,QAAA,EAAU,CAAA;AAAA,gBAEV,QAAA,kBAAAD,eAAA,CAACE,QAAA,EAAA,EAAK,KAAA,EAAO,YAAA,CAAa,KAAA,EAAO,QAAA,EAAA;AAAA,kBAAA,SAAA;AAAA,kBACvB,SAAS,KAAA,CAAM;AAAA,iBAAA,EACzB;AAAA;AAAA;AACF;AAAA;AAAA,SAGN,CAAA,EACF,CAAA;AAAA,IAEJ,CAAA;AAKO,IAAMN,oBAMR,CAAC;AAAA,MACJ,IAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF,KAAM;AACJ,MAAAU,gBAAA,CAAU,MAAM;AACd,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,UAAA,IAAa;AAAA,QACf,CAAA,MAAO;AACL,UAAA,YAAA,IAAe;AAAA,QACjB;AAAA,MACF,CAAA,EAAG,CAAC,QAAA,EAAU,UAAA,EAAY,YAAY,CAAC,CAAA;AAEvC,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,uBACEH,cAAA,CAACF,WAAI,aAAA,EAAc,QAAA,EAAS,OAAM,MAAA,EAAO,MAAA,EAAO,QAC7C,QAAA,EACH,CAAA;AAAA,IAEJ,CAAA;AAKO,IAAMJ,2BASR,CAAC;AAAA,MACJ,OAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF,KAAM;AACJ,MAAA,MAAM,EAAE,KAAA,EAAM,GAAIC,qBAAA,EAAc;AAEhC,MAAA,uCACGG,OAAA,EAAA,EAAI,aAAA,EAAc,UAAS,KAAA,EAAM,MAAA,EAAO,QAAO,MAAA,EAE7C,QAAA,EAAA;AAAA,QAAA,OAAA,CAAQ,MAAA,GAAS,CAAA,oBAChBE,cAAA,CAACF,OAAA,EAAA,EAAI,cAAc,CAAA,EAChB,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBACpBE,cAAA,CAACF,OAAA,EAAA,EAAsB,aAAa,CAAA,EAClC,QAAA,kBAAAD,eAAA;AAAA,UAACE,QAAA;AAAA,UAAA;AAAA,YACC,OAAO,MAAA,CAAO,IAAA,KAAS,YAAA,GAAe,KAAA,CAAM,UAAU,KAAA,CAAM,KAAA;AAAA,YAC5D,IAAA,EAAM,OAAO,IAAA,KAAS,YAAA;AAAA,YAErB,QAAA,EAAA;AAAA,cAAA,KAAA,GAAQ,CAAA;AAAA,cAAE,IAAA;AAAA,cAAG,MAAA,CAAO;AAAA;AAAA;AAAA,SACvB,EAAA,EANQ,MAAA,CAAO,IAOjB,CACD,CAAA,EACH,CAAA;AAAA,QAID,OAAA,CAAQ,IAAI,CAAA,MAAA,qBACXC,cAAA;AAAA,UAACP,iBAAA;AAAA,UAAA;AAAA,YAEC,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,QAAA,EAAU,OAAO,IAAA,KAAS,YAAA;AAAA,YAC1B,YAAY,MAAA,CAAO,UAAA;AAAA,YACnB,cAAc,MAAA,CAAO,YAAA;AAAA,YAEpB,QAAA,EAAA,MAAA,CAAO;AAAA,WAAA;AAAA,UANH,MAAA,CAAO;AAAA,SAQf,CAAA;AAAA,QAGA,OAAA,CAAQ,MAAA,GAAS,CAAA,oBAChBO,cAAA,CAACF,OAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,cAAA,EAAe,QAAA,EAChC,QAAA,kBAAAD,eAAA,CAACE,QAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,UAAA,aAAA;AAAA,UACZ,OAAA,CAAQ,MAAA;AAAA,UAAO;AAAA,SAAA,EAC7B,CAAA,EACF;AAAA,OAAA,EAEJ,CAAA;AAAA,IAEJ,CAAA;AAKO,IAAMP,iBAAA,GAAY;AAAA;AAAA;AAAA;AAAA,MAIvB,WAAW,CAAC,EAAE,MAAM,KAAA,EAAO,KAAA,GAAQ,KAAI,KAIjC;AACJ,QAAA,MAAM,EAAE,UAAA,EAAW,GAAIG,qBAAA,EAAc;AACrC,QAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,QAAQ,KAAK,CAAA;AACrD,QAAA,MAAM,UAAA,GAAa,WAAW,KAAA,GAAQ,SAAA;AAEtC,QAAA,uBACEE,eAAA,CAACC,OAAA,EAAA,EAAI,KAAA,EAAM,MAAA,EACT,QAAA,EAAA;AAAA,0BAAAE,cAAA,CAACF,OAAA,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,aAAA,EAAc,UAClC,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,yCACCA,OAAA,EAAA,EAAI,KAAA,EAAO,UAAA,EAAY,aAAA,EAAc,UACnC,QAAA,EAAA,KAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,MAEJ,CAAA;AAAA;AAAA;AAAA;AAAA,MAKA,aAAa,CAAC,EAAE,IAAA,EAAM,MAAA,EAAQ,OAAM,KAI9B;AACJ,QAAA,MAAM,EAAE,UAAA,EAAW,GAAIH,qBAAA,EAAc;AACrC,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,QAAQ,CAAC,CAAA;AAEnD,QAAA,uBACEE,eAAA,CAACC,OAAA,EAAA,EAAI,KAAA,EAAM,MAAA,EACT,QAAA,EAAA;AAAA,0BAAAE,cAAA,CAACF,OAAA,EAAA,EAAI,KAAA,EAAO,WAAA,EAAa,aAAA,EAAc,UACpC,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,yCACCA,OAAA,EAAA,EAAI,KAAA,EAAO,WAAA,EAAa,aAAA,EAAc,UACpC,QAAA,EAAA,MAAA,EACH,CAAA;AAAA,yCACCA,OAAA,EAAA,EAAI,KAAA,EAAO,WAAA,EAAa,aAAA,EAAc,UACpC,QAAA,EAAA,KAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,MAEJ,CAAA;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAA,EAAkB,CAAC,EAAE,MAAA,EAAQ,MAAM,MAAA,EAAO,qBAKxCD,eAAA,CAACC,OAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,KAAA,EAAM,MAAA,EAAO,QAAO,MAAA,EAC7C,QAAA,EAAA;AAAA,QAAA,MAAA,oBACCE,cAAA,CAACF,OAAA,EAAA,EAAI,KAAA,EAAM,MAAA,EACR,QAAA,EAAA,MAAA,EACH,CAAA;AAAA,uCAEDA,OAAA,EAAA,EAAI,QAAA,EAAU,CAAA,EAAG,KAAA,EAAM,QACrB,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,QACC,MAAA,oBACCE,cAAA,CAACF,OAAA,EAAA,EAAI,KAAA,EAAM,QACR,QAAA,EAAA,MAAA,EACH;AAAA,OAAA,EAEJ,CAAA;AAAA;AAAA;AAAA;AAAA,MAMF,SAAS,CAAC,EAAE,SAAS,IAAA,EAAM,YAAA,GAAe,IAAG,KAIvC;AACJ,QAAA,MAAM,EAAE,UAAA,EAAW,GAAIH,qBAAA,EAAc;AACrC,QAAA,MAAM,SAAA,GAAY,WAAW,KAAA,GAAQ,YAAA;AAErC,QAAA,uBACEE,eAAA,CAACC,OAAA,EAAA,EAAI,KAAA,EAAM,MAAA,EACT,QAAA,EAAA;AAAA,0BAAAE,cAAA,CAACF,OAAA,EAAA,EAAI,KAAA,EAAO,YAAA,EAAc,aAAA,EAAc,UACrC,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,yCACCA,OAAA,EAAA,EAAI,KAAA,EAAO,SAAA,EAAW,aAAA,EAAc,UAClC,QAAA,EAAA,IAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,MAEJ;AAAA,KACF;AAEA,IAAO,cAAA,GAAQP,cAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACjNf,SAAS,mBAAA,CAAoB,MAAc,cAAA,EAAgC;AACzE,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA;AACjD,EAAA,OAAO,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAC3C;AAKA,SAAS,uBAAA,CAAwB,MAAc,cAAA,EAAgC;AAC7E,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AACrC,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA;AACjC;AAKA,SAAS,wBAAA,CAAyB,IAAA,EAAc,SAAA,EAAmB,cAAA,EAAgC;AACjG,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,IAAI,SAAA,IAAa,KAAA,CAAM,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAA;AAE3C,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,IAAA,QAAA,IAAY,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,UAAA,GAAa,MAAM,SAAS,CAAA;AAClC,EAAA,QAAA,IAAY,IAAA,CAAK,GAAA,CAAI,cAAA,EAAgB,UAAA,CAAW,MAAM,CAAA;AAEtD,EAAA,OAAO,QAAA;AACT;AAKA,SAAS,oBAAA,CAAqB,MAAc,cAAA,EAAgC;AAC1E,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA;AACjD,EAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,WAAA,CAAY,IAAI,CAAA;AACtD,EAAA,OAAO,gBAAA,KAAqB,EAAA,GAAK,CAAA,GAAI,gBAAA,GAAmB,CAAA;AAC1D;AAKA,SAAS,kBAAA,CAAmB,MAAc,cAAA,EAAgC;AACxE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA;AAC7C,EAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAA;AACjD,EAAA,OAAO,gBAAA,KAAqB,EAAA,GAAK,IAAA,CAAK,MAAA,GAAS,cAAA,GAAiB,gBAAA;AAClE;AArRae,sBAAA,CAAA,CA8RAC;AA9Sb,IAAA,UAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AAWA,IAAA,WAAA,EAAA;AAKO,IAAMD,gBAA8B,CAAC;AAAA,MAC1C,KAAA;AAAA,MACA,WAAA,GAAc,EAAA;AAAA,MACd,KAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA,GAAa,KAAA;AAAA,MACb,SAAA,GAAY,KAAA;AAAA,MACZ,SAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,GAAY,KAAA;AAAA,MACZ,QAAA,GAAW,KAAA;AAAA,MACX,SAAA,GAAY,KAAA;AAAA,MACZ;AAAA,KACF,KAAM;AACJ,MAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAIX,qBAAA,EAAc;AAC5C,MAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIM,gBAAS,SAAS,CAAA;AACpD,MAAA,MAAM,CAAC,YAAY,aAAa,CAAA,GAAIA,gBAA0B,EAAE,OAAA,EAAS,MAAM,CAAA;AAC/E,MAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAAA,CAAS,MAAM,MAAM,CAAA;AAGjE,MAAAE,iBAAU,MAAM;AACd,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,KAAA,GAAQ,SAAS,KAAK,CAAA;AAC5B,UAAA,aAAA,CAAc;AAAA,YACZ,SAAS,CAAC,KAAA;AAAA,YACV;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAGpB,MAAAE,YAAAA;AAAA,QACE,CAAC,OAAO,GAAA,KAAQ;AACd,UAAA,IAAI,QAAA,EAAU;AAGd,UAAA,IAAI,IAAI,MAAA,EAAQ;AACd,YAAA,IAAI,SAAA,IAAa,CAAC,GAAA,CAAI,IAAA,EAAM;AAE1B,cAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA,GAAI,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AACnF,cAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,cAAA,iBAAA,CAAkB,iBAAiB,CAAC,CAAA;AAAA,YACtC,CAAA,MAAO;AAEL,cAAA,IAAI,QAAA,IAAY,WAAW,OAAA,EAAS;AAClC,gBAAA,QAAA,CAAS,KAAK,CAAA;AAAA,cAChB;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,MAAA,EAAQ;AAC/B,YAAA,IAAI,GAAA,CAAI,SAAA,IAAa,cAAA,GAAiB,CAAA,EAAG;AAEvC,cAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,iBAAiB,CAAC,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AAChF,cAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,cAAA,iBAAA,CAAkB,iBAAiB,CAAC,CAAA;AAAA,YACtC,CAAA,MAAA,IAAW,GAAA,CAAI,MAAA,IAAU,cAAA,GAAiB,MAAM,MAAA,EAAQ;AAEtD,cAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA,GAAI,KAAA,CAAM,KAAA,CAAM,cAAA,GAAiB,CAAC,CAAA;AAChF,cAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,YACnB;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,GAAA,CAAI,SAAA,IAAa,cAAA,GAAiB,CAAA,EAAG;AACvC,YAAA,iBAAA,CAAkB,iBAAiB,CAAC,CAAA;AACpC,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,GAAA,CAAI,UAAA,IAAc,cAAA,GAAiB,KAAA,CAAM,MAAA,EAAQ;AACnD,YAAA,iBAAA,CAAkB,iBAAiB,CAAC,CAAA;AACpC,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,GAAA,CAAI,WAAW,SAAA,EAAW;AAC5B,YAAc,KAAA,CAAM,KAAA,CAAM,IAAI;AAC9B,YAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,KAAA,EAAO,cAAc,CAAA;AAClE,YAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,cAAA,MAAM,WAAA,GAAc,yBAAyB,KAAA,EAAO,gBAAA,GAAmB,GAAG,uBAAA,CAAwB,KAAA,EAAO,cAAc,CAAC,CAAA;AACxH,cAAA,iBAAA,CAAkB,WAAW,CAAA;AAAA,YAC/B;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,GAAA,CAAI,aAAa,SAAA,EAAW;AAC9B,YAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,IAAI,CAAA;AAC9B,YAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,KAAA,EAAO,cAAc,CAAA;AAClE,YAAA,IAAI,gBAAA,GAAmB,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACvC,cAAA,MAAM,WAAA,GAAc,yBAAyB,KAAA,EAAO,gBAAA,GAAmB,GAAG,uBAAA,CAAwB,KAAA,EAAO,cAAc,CAAC,CAAA;AACxH,cAAA,iBAAA,CAAkB,WAAW,CAAA;AAAA,YAC/B;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,IAAI,IAAA,EAAM;AACZ,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,MAAM,SAAA,GAAY,oBAAA,CAAqB,KAAA,EAAO,cAAc,CAAA;AAC5D,cAAA,iBAAA,CAAkB,SAAS,CAAA;AAAA,YAC7B,CAAA,MAAO;AACL,cAAA,iBAAA,CAAkB,CAAC,CAAA;AAAA,YACrB;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,IAAI,GAAA,EAAK;AACX,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,KAAA,EAAO,cAAc,CAAA;AACxD,cAAA,iBAAA,CAAkB,OAAO,CAAA;AAAA,YAC3B,CAAA,MAAO;AACL,cAAA,iBAAA,CAAkB,MAAM,MAAM,CAAA;AAAA,YAChC;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,KAAA,KAAU,CAAC,SAAA,IAAa,KAAA,CAAM,SAAS,SAAA,CAAA,EAAY;AACrD,YAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA,GAAI,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,cAAc,CAAA;AACpF,YAAA,QAAA,CAAS,QAAQ,CAAA;AACjB,YAAA,iBAAA,CAAkB,cAAA,GAAiB,MAAM,MAAM,CAAA;AAAA,UACjD;AAAA,QACF,CAAA;AAAA,QACA,EAAE,QAAA,EAAU,SAAA,IAAa,CAAC,QAAA;AAAS,OACrC;AAGA,MAAA,MAAM,eAAe,UAAA,GAAa,GAAA,CAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,GAAI,KAAA;AAG7D,MAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,IAAS,WAAA;AAGlC,MAAA,MAAM,kBAAA,GAAqBD,mBAAY,MAAM;AAC3C,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,OAAOI,uBAAAA,CAAM,GAAA,CAAI,KAAA,CAAM,KAAK,EAAE,WAAW,CAAA;AAAA,QAC3C;AAEA,QAAA,IAAI,CAAC,SAAA,EAAW;AACd,UAAA,OAAO,YAAA;AAAA,QACT;AAGA,QAAA,MAAM,YAAA,GAAe,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA;AACzD,QAAA,MAAM,QAAA,GAAW,YAAA,CAAa,cAAc,CAAA,IAAK,GAAA;AACjD,QAAA,MAAM,WAAA,GAAc,YAAA,CAAa,KAAA,CAAM,cAAA,GAAiB,CAAC,CAAA;AAEzD,QAAA,OAAO,YAAA,GAAeA,uBAAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,WAAA;AAAA,MAClD,CAAA,EAAG,CAAC,YAAA,EAAc,cAAA,EAAgB,WAAW,eAAA,EAAiB,WAAA,EAAa,KAAA,CAAM,KAAK,CAAC,CAAA;AAGvF,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,uBACEX,eAAAA,CAACC,OAAAA,EAAA,EAAI,eAAc,QAAA,EAChB,QAAA,EAAA;AAAA,UAAA,KAAA,oBACCD,eAAAA,CAACE,QAAAA,EAAA,EAAM,QAAA,EAAA;AAAA,YAAA,KAAA;AAAA,YAAM;AAAA,WAAA,EAAC,CAAA;AAAA,0BAEhBC,cAAAA,CAACD,QAAAA,EAAA,EAAM,0BAAgB,WAAA,EAAY,CAAA;AAAA,UAClC,WAAW,KAAA,oBACVF,gBAACE,QAAAA,EAAA,EAAK,OAAM,KAAA,EAAM,QAAA,EAAA;AAAA,YAAA,SAAA;AAAA,YAAQ,UAAA,CAAW;AAAA,WAAA,EAAM;AAAA,SAAA,EAE/C,CAAA;AAAA,MAEJ;AAEA,MAAA,uBACEF,eAAAA,CAACC,OAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,eAAa,MAAA,EAEtC,QAAA,EAAA;AAAA,QAAA,KAAA,oBACCE,cAAAA,CAACF,OAAAA,EAAA,EAAI,YAAA,EAAc,CAAA,EACjB,QAAA,kBAAAD,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,IAAA,EAAO,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAAM;AAAA,SAAA,EAAC,CAAA,EACnC,CAAA;AAAA,wBAIFC,cAAAA;AAAA,UAACF,OAAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAY,OAAA;AAAA,YACZ,WAAA,EACE,QAAA,GACI,KAAA,CAAM,KAAA,GACN,UAAA,CAAW,OAAA,GACX,SAAA,GACE,KAAA,CAAM,OAAA,GACN,KAAA,CAAM,KAAA,GACR,KAAA,CAAM,KAAA;AAAA,YAEZ,QAAA,EAAU,CAAA;AAAA,YACV,SAAA,EAAW,YAAY,CAAA,GAAI,CAAA;AAAA,YAE3B,QAAA,kBAAAE,cAAAA,CAACD,QAAAA,EAAA,EAAM,8BAAmB,EAAE;AAAA;AAAA,SAC9B;AAAA,QAGC,UAAA,CAAW,KAAA,oBACVC,cAAAA,CAACF,SAAA,EAAI,SAAA,EAAW,CAAA,EACd,QAAA,kBAAAD,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,UAAA,SAAA;AAAA,UAAG,UAAA,CAAW;AAAA,SAAA,EAAM,CAAA,EAChD,CAAA;AAAA,QAID,SAAA,oBACCC,cAAAA,CAACF,OAAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,cAAA,EAAe,UAAA,EAChC,0BAAAD,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAChB,QAAA,EAAA;AAAA,UAAA,KAAA,CAAM,MAAA;AAAA,UACN,SAAA,IAAa,IAAI,SAAS,CAAA;AAAA,SAAA,EAC7B,CAAA,EACF,CAAA;AAAA,QAID,aAAa,CAAC,QAAA,oBACbC,cAAAA,CAACF,OAAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EACd,0BAAAE,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,OAChB,QAAA,EAAA,SAAA,GAAY,oEAAA,GAA6D,wCAC5E,CAAA,EACF;AAAA,OAAA,EAEJ,CAAA;AAAA,IAEJ,CAAA;AAkEO,IAAMQ,kBAAA,GAAa;AAAA,MACxB,UAAU,CAAC,KAAA,KAAmB,CAAC,KAAA,CAAM,IAAA,KAAS,wBAAA,GAA2B,IAAA;AAAA,MAEzE,SAAA,EAAW,CAAC,GAAA,KAAgB,CAAC,KAAA,KAC3B,MAAM,MAAA,GAAS,GAAA,GAAM,CAAA,kBAAA,EAAqB,GAAG,CAAA,WAAA,CAAA,GAAgB,IAAA;AAAA,MAE/D,SAAA,EAAW,CAAC,GAAA,KAAgB,CAAC,KAAA,KAC3B,MAAM,MAAA,GAAS,GAAA,GAAM,CAAA,kBAAA,EAAqB,GAAG,CAAA,WAAA,CAAA,GAAgB,IAAA;AAAA,MAE/D,KAAA,EAAO,CAAC,KAAA,KAAkB;AACxB,QAAA,MAAM,UAAA,GAAa,4BAAA;AACnB,QAAA,OAAO,CAAC,UAAA,CAAW,IAAA,CAAK,KAAK,IAAI,oCAAA,GAAuC,IAAA;AAAA,MAC1E,CAAA;AAAA,MAEA,GAAA,EAAK,CAAC,KAAA,KAAkB;AACtB,QAAA,IAAI;AACF,UAAA,IAAI,IAAI,KAAK,CAAA;AACb,UAAA,OAAO,IAAA;AAAA,QACT,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,0BAAA;AAAA,QACT;AAAA,MACF,CAAA;AAAA,MAEA,OAAA,EAAS,CAAC,KAAA,KAAmB,CAAC,SAAS,CAAC,KAAA,CAAM,IAAA,EAAK,GAAI,uBAAA,GAA0B,IAAA;AAAA,MAEjF,OAAA,EAAS,CAAA,GAAI,UAAA,KACX,CAAC,KAAA,KAAkB;AACjB,QAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,UAAA,MAAM,KAAA,GAAQ,UAAU,KAAK,CAAA;AAC7B,UAAA,IAAI,OAAO,OAAO,KAAA;AAAA,QACpB;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,KACJ;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC/UA,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,WAAA,EAAA,MAAAE,mBAAA;AAAA,EAAA,YAAA,EAAA,MAAAC,oBAAA;AAAA,EAAA,aAAA,EAAA,MAAAC,qBAAA;AAAA,EAAA,MAAA,EAAA,MAAAC,cAAA;AAAA,EAAA,WAAA,EAAA,MAAAC,mBAAA;AAAA,EAAA,cAAA,EAAA,MAAAC,sBAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAgBaF,uBAAA,CAAA,CAoPAD,8BAAA,CAAA,CAkDAF,4BAAA,CAAA,CAyCAC,6BAAA,CAAA,CAgDAG,8BA8DAC,+BAAA,CAAA,KA2CN;AAxfP,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AAWA,IAAA,WAAA,EAAA;AAKO,IAAMF,iBAAgC,CAAC;AAAA,MAC5C,KAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAU,EAAC;AAAA,MACX,IAAA,GAAO,MAAA;AAAA,MACP,WAAA,GAAc,IAAA;AAAA,MACd,QAAA,GAAW,KAAA;AAAA,MACX;AAAA,KACF,KAAM;AACJ,MAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAIjB,qBAAA,EAAc;AAC5C,MAAA,MAAM,CAAC,mBAAA,EAAqB,sBAAsB,CAAA,GAAIM,gBAAS,CAAC,CAAA;AAGhE,MAAA,MAAM,cAAA,GAAiC,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU;AAAA,QACpE;AAAA,UACE,KAAA,EAAO,IAAA;AAAA,UACP,MAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS,SAAA;AAAA,UACT,SAAA,EAAW;AAAA;AACb,OACF;AAGA,MAAA,MAAM,qBAAqB,cAAA,CAAe,SAAA,CAAU,CAAA,GAAA,KAAO,GAAA,CAAI,SAAS,CAAA,IAAK,CAAA;AAG7E,MAAAE,iBAAU,MAAM;AACd,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,sBAAA,CAAuB,kBAAkB,CAAA;AAAA,QAC3C;AAAA,MACF,CAAA,EAAG,CAAC,SAAA,EAAW,kBAAkB,CAAC,CAAA;AAGlC,MAAAE,YAAAA;AAAA,QACE,CAAC,OAAO,GAAA,KAAQ;AACd,UAAA,IAAI,CAAC,aAAa,QAAA,EAAU;AAG5B,UAAA,IAAI,GAAA,CAAI,UAAU,WAAA,EAAa;AAC7B,YAAA,OAAA,EAAQ;AACR,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,IAAI,MAAA,EAAQ;AACd,YAAA,MAAM,cAAA,GAAiB,eAAe,mBAAmB,CAAA;AACzD,YAAA,IAAI,cAAA,IAAkB,CAAC,cAAA,CAAe,QAAA,EAAU;AAC9C,cAAA,cAAA,CAAe,MAAA,EAAO;AAAA,YACxB;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,OAAA,EAAS;AAChC,YAAA,sBAAA;AAAA,cAAuB,CAAC,IAAA,KACtB,IAAA,KAAS,IAAI,cAAA,CAAe,MAAA,GAAS,IAAI,IAAA,GAAO;AAAA,aAClD;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,GAAA,CAAI,UAAA,IAAc,GAAA,CAAI,SAAA,EAAW;AACnC,YAAA,sBAAA;AAAA,cAAuB,CAAC,IAAA,KACtB,IAAA,KAAS,eAAe,MAAA,GAAS,CAAA,GAAI,IAAI,IAAA,GAAO;AAAA,aAClD;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,IAAI,GAAA,EAAK;AACX,YAAA,sBAAA;AAAA,cAAuB,CAAC,IAAA,KAAA,CACrB,IAAA,GAAO,CAAA,IAAK,cAAA,CAAe;AAAA,aAC9B;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,KAAA,IAAS,SAAA,CAAU,IAAA,CAAK,KAAK,CAAA,EAAG;AAClC,YAAA,MAAM,WAAA,GAAc,QAAA,CAAS,KAAK,CAAA,GAAI,CAAA;AACtC,YAAA,IAAI,WAAA,GAAc,eAAe,MAAA,EAAQ;AACvC,cAAA,MAAM,MAAA,GAAS,eAAe,WAAW,CAAA;AACzC,cAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,gBAAA,MAAA,CAAO,MAAA,EAAO;AAAA,cAChB;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,KAAA,IAAS,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA,EAAG;AACrC,YAAA,MAAM,MAAA,GAAS,MAAM,WAAA,EAAY;AACjC,YAAA,MAAM,sBAAsB,cAAA,CAAe,SAAA;AAAA,cACzC,CAAA,GAAA,KAAO,IAAI,KAAA,CAAM,WAAA,GAAc,UAAA,CAAW,MAAM,CAAA,IAAK,CAAC,GAAA,CAAI;AAAA,aAC5D;AACA,YAAA,IAAI,wBAAwB,EAAA,EAAI;AAC9B,cAAA,cAAA,CAAe,mBAAmB,EAAE,MAAA,EAAO;AAAA,YAC7C;AACA,YAAA;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,EAAE,QAAA,EAAU,SAAA,IAAa,CAAC,QAAA;AAAS,OACrC;AAGA,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,MAAM,gBAAA,GAAmB,CAAC,UAAA,KAA2B;AACnD,QAAA,QAAQ,UAAA;AAAY,UAClB,KAAK,SAAA;AACH,YAAA,OAAO,EAAE,WAAA,EAAa,KAAA,CAAM,OAAA,EAAS,MAAM,QAAA,EAAI;AAAA,UACjD,KAAK,SAAA;AACH,YAAA,OAAO,EAAE,WAAA,EAAa,KAAA,CAAM,OAAA,EAAS,MAAM,QAAA,EAAI;AAAA,UACjD,KAAK,OAAA;AACH,YAAA,OAAO,EAAE,WAAA,EAAa,KAAA,CAAM,KAAA,EAAO,MAAM,QAAA,EAAI;AAAA,UAC/C,KAAK,SAAA;AACH,YAAA,OAAO,EAAE,WAAA,EAAa,KAAA,CAAM,OAAA,EAAS,MAAM,GAAA,EAAI;AAAA,UACjD;AACE,YAAA,OAAO,EAAE,WAAA,EAAa,KAAA,CAAM,OAAA,EAAS,MAAM,QAAA,EAAI;AAAA;AACnD,MACF,CAAA;AAEA,MAAA,MAAM,OAAA,GAAU,iBAAiB,IAAI,CAAA;AAGrC,MAAA,MAAM,gBAAA,GAAmB,CAAC,OAAA,GAAyB,WAAA,EAAa,YAAqB,UAAA,KAAwB;AAC3G,QAAA,IAAI,UAAA,EAAY;AACd,UAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,YAAY,EAAA,EAAG;AAAA,QAC9C;AAEA,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,UAAA,EAAY,UAAA,GAAa,KAAA,CAAM,OAAA,GAAU,EAAA,EAAG;AAAA,UAC7E,SAAA,EAAW,EAAE,KAAA,EAAO,KAAA,CAAM,MAAM,UAAA,EAAY,UAAA,GAAa,KAAA,CAAM,KAAA,GAAQ,EAAA,EAAG;AAAA,UAC1E,OAAA,EAAS,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,UAAA,EAAY,UAAA,GAAa,KAAA,CAAM,OAAA,GAAU,EAAA,EAAG;AAAA,UAC7E,OAAA,EAAS,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,UAAA,EAAY,UAAA,GAAa,KAAA,CAAM,OAAA,GAAU,EAAA,EAAG;AAAA,UAC7E,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,UAAA,EAAY,UAAA,GAAa,KAAA,CAAM,KAAA,GAAQ,EAAA;AAAG,SACzE;AAEA,QAAA,OAAO,OAAO,OAAO,CAAA;AAAA,MACvB,CAAA;AAGA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,uBACER,eAAAA,CAACC,OAAAA,EAAA,EAAI,eAAc,QAAA,EAChB,QAAA,EAAA;AAAA,UAAA,KAAA,oBAASE,cAAAA,CAACD,QAAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,0BACvBC,cAAAA,CAACD,QAAAA,EAAA,EAAM,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,0BACfF,eAAAA,CAACE,QAAAA,EAAA,EAAK,QAAA,EAAA;AAAA,YAAA,WAAA;AAAA,YACM,cAAA,CAAe,GAAA,CAAI,CAAC,GAAA,EAAK,UAAU,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI;AAAA,WAAA,EACtF;AAAA,SAAA,EACF,CAAA;AAAA,MAEJ;AAEA,MAAA,uBACEF,eAAAA;AAAA,QAACC,OAAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAS,UAAA;AAAA,UACT,GAAA,EAAK,CAAA;AAAA,UACL,IAAA,EAAM,CAAA;AAAA,UACN,KAAA,EAAM,MAAA;AAAA,UACN,MAAA,EAAO,MAAA;AAAA,UACP,cAAA,EAAe,QAAA;AAAA,UACf,UAAA,EAAW,QAAA;AAAA,UACX,aAAA,EAAa,MAAA;AAAA,UAGb,QAAA,EAAA;AAAA,4BAAAE,cAAAA;AAAA,cAACF,OAAAA;AAAA,cAAA;AAAA,gBACC,QAAA,EAAS,UAAA;AAAA,gBACT,GAAA,EAAK,CAAA;AAAA,gBACL,IAAA,EAAM,CAAA;AAAA,gBACN,KAAA,EAAM,MAAA;AAAA,gBACN,MAAA,EAAO,MAAA;AAAA,gBACP,eAAA,EAAgB,OAAA;AAAA,gBAChB,OAAA,EAAS;AAAA;AAAA,aACX;AAAA,4BAGAD,eAAAA;AAAA,cAACC,OAAAA;AAAA,cAAA;AAAA,gBACC,aAAA,EAAc,QAAA;AAAA,gBACd,WAAA,EAAY,OAAA;AAAA,gBACZ,aAAa,OAAA,CAAQ,WAAA;AAAA,gBACrB,iBAAiB,KAAA,CAAM,UAAA;AAAA,gBACvB,QAAA,EAAU,CAAA;AAAA,gBACV,QAAA,EAAU,CAAA;AAAA,gBACV,QAAA,EAAU,EAAA;AAAA,gBACV,QAAA,EAAU,EAAA;AAAA,gBAGT,QAAA,EAAA;AAAA,kBAAA,KAAA,oBACCD,eAAAA,CAACC,OAAAA,EAAA,EAAI,YAAA,EAAc,CAAA,EAAG,YAAW,QAAA,EAC/B,QAAA,EAAA;AAAA,oCAAAE,eAACD,QAAAA,EAAA,EAAK,OAAO,OAAA,CAAQ,WAAA,EAAc,kBAAQ,IAAA,EAAK,CAAA;AAAA,oCAChDF,gBAACE,QAAAA,EAAA,EAAK,OAAO,KAAA,CAAM,IAAA,EAAM,MAAI,IAAA,EAAC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,sBAAE;AAAA,qBAAA,EAAM;AAAA,mBAAA,EACxC,CAAA;AAAA,kCAIFC,cAAAA,CAACF,OAAAA,EAAA,EAAI,cAAc,CAAA,EACjB,QAAA,kBAAAE,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,IAAA,EAAO,mBAAQ,CAAA,EACpC,CAAA;AAAA,kCAGAC,cAAAA,CAACF,OAAAA,EAAA,EAAI,cAAA,EAAe,UAAA,EAAW,GAAA,EAAK,CAAA,EACjC,QAAA,EAAA,cAAA,CAAe,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,KAAU;AACrC,oBAAA,MAAM,aAAa,KAAA,KAAU,mBAAA;AAC7B,oBAAA,MAAMiB,WAAU,gBAAA,CAAiB,MAAA,CAAO,OAAA,EAAS,UAAA,EAAY,OAAO,QAAQ,CAAA;AAE5E,oBAAA,uBACEf,cAAAA;AAAA,sBAACF,OAAAA;AAAA,sBAAA;AAAA,wBAEC,WAAA,EAAa,aAAa,OAAA,GAAU,MAAA;AAAA,wBACpC,WAAA,EAAa,UAAA,GAAaiB,QAAAA,CAAQ,KAAA,GAAQ,MAAA;AAAA,wBAC1C,QAAA,EAAU,CAAA;AAAA,wBAEV,QAAA,kBAAAlB,eAAAA;AAAA,0BAACE,QAAAA;AAAA,0BAAA;AAAA,4BACC,OAAOgB,QAAAA,CAAQ,KAAA;AAAA,4BACf,eAAA,EAAiB,UAAA,GAAaA,QAAAA,CAAQ,UAAA,GAAa,MAAA;AAAA,4BACnD,OAAA,EAAS,UAAA,IAAc,CAAC,MAAA,CAAO,QAAA;AAAA,4BAE9B,QAAA,EAAA;AAAA,8BAAA,KAAA,GAAQ,CAAA;AAAA,8BAAE,IAAA;AAAA,8BAAG,MAAA,CAAO;AAAA;AAAA;AAAA;AACvB,uBAAA;AAAA,sBAXK;AAAA,qBAYP;AAAA,kBAEJ,CAAC,CAAA,EACH,CAAA;AAAA,kBAGC,CAAC,QAAA,oBACAf,cAAAA,CAACF,SAAA,EAAI,SAAA,EAAW,CAAA,EACd,QAAA,kBAAAD,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,oBAAA,4DAAA;AAAA,oBACyB,cAAc,eAAA,GAAkB;AAAA,mBAAA,EACnF,CAAA,EACF;AAAA;AAAA;AAAA;AAEJ;AAAA;AAAA,OACF;AAAA,IAEJ,CAAA;AAKO,IAAMY,wBASR,CAAC;AAAA,MACJ,KAAA,GAAQ,SAAA;AAAA,MACR,OAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA,GAAe,KAAA;AAAA,MACf,WAAA,GAAc,IAAA;AAAA,MACd;AAAA,KACF,KAAM;AACJ,MAAA,MAAM,OAAA,GAA0B;AAAA,QAC9B;AAAA,UACE,KAAA,EAAO,WAAA;AAAA,UACP,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACX;AAAA,QACA;AAAA,UACE,KAAA,EAAO,YAAA;AAAA,UACP,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,SAAA;AAAA,UACT,SAAA,EAAW;AAAA;AACb,OACF;AAEA,MAAA,uBACEX,cAAAA;AAAA,QAACY,cAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,OAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS,QAAA;AAAA,UACT,OAAA;AAAA,UACA,IAAA,EAAK,SAAA;AAAA,UACL,WAAA,EAAa,IAAA;AAAA,UACb;AAAA;AAAA,OACF;AAAA,IAEJ,CAAA;AAKO,IAAMH,sBAOR,CAAC;AAAA,MACJ,KAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,GAAO,MAAA;AAAA,MACP;AAAA,KACF,KAAM;AACJ,MAAA,MAAM,OAAA,GAA0B;AAAA,QAC9B;AAAA,UACE,KAAA,EAAO,IAAA;AAAA,UACP,MAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS,SAAA;AAAA,UACT,SAAA,EAAW;AAAA;AACb,OACF;AAEA,MAAA,uBACET,cAAAA;AAAA,QAACY,cAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,OAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb;AAAA;AAAA,OACF;AAAA,IAEJ,CAAA;AAKO,IAAMF,uBAQR,CAAC;AAAA,MACJ,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF,KAAM;AACJ,MAAA,MAAM,OAAA,GAA0B;AAAA,QAC9B,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,KAAA,MAAW;AAAA,UACjC,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,MAAA,EAAQ,MAAM,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAAA,UACnC,OAAA,EAAS,OAAO,OAAA,IAAW,WAAA;AAAA,UAC3B,WAAW,KAAA,KAAU;AAAA,SACvB,CAAE,CAAA;AAAA,QACF,GAAI,WAAW,CAAC;AAAA,UACd,KAAA,EAAO,QAAA;AAAA,UACP,MAAA,EAAQ,QAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACV,IAAI;AAAC,OACR;AAEA,MAAA,uBACEV,cAAAA;AAAA,QAACY,cAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,OAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA,EAAS,aAAa,MAAM;AAAA,UAAC,CAAA,CAAA;AAAA,UAC7B,OAAA;AAAA,UACA,IAAA,EAAK,MAAA;AAAA,UACL,WAAA,EAAa,CAAC,CAAC,QAAA;AAAA,UACf;AAAA;AAAA,OACF;AAAA,IAEJ,CAAA;AAKO,IAAMC,sBASR,CAAC;AAAA,MACJ,KAAA,GAAQ,OAAA;AAAA,MACR,OAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,WAAA,GAAc,KAAA;AAAA,MACd;AAAA,KACF,KAAM;AACJ,MAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIZ,gBAAS,KAAK,CAAA;AAEhD,MAAA,MAAM,OAAA,GAA0B;AAAA,QAC9B,GAAI,UAAU,CAAC;AAAA,UACb,KAAA,EAAO,OAAA;AAAA,UACP,MAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS,SAAA;AAAA,UACT,SAAA,EAAW;AAAA,SACZ,IAAI,EAAC;AAAA,QACN;AAAA,UACE,KAAA,EAAO,OAAA;AAAA,UACP,MAAA,EAAQ,OAAA;AAAA,UACR,OAAA,EAAS,WAAA;AAAA,UACT,WAAW,CAAC;AAAA,SACd;AAAA,QACA,GAAI,KAAA,IAAS,WAAA,GAAc,CAAC;AAAA,UAC1B,KAAA,EAAO,YAAY,cAAA,GAAiB,cAAA;AAAA,UACpC,MAAA,EAAQ,MAAM,YAAA,CAAa,CAAC,SAAS,CAAA;AAAA,UACrC,OAAA,EAAS;AAAA,SACV,IAAI;AAAC,OACR;AAEA,MAAA,MAAM,WAAA,GAAc,SAAA,IAAa,KAAA,GAC7B,CAAA,EAAG,OAAO;;AAAA;AAAA,EAAuB,MAAM,OAAO;;AAAA;AAAA,EAAqB,KAAA,CAAM,KAAK,CAAA,CAAA,GAC9E,OAAA;AAEJ,MAAA,uBACED,cAAAA;AAAA,QAACY,cAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,OAAA,EAAS,WAAA;AAAA,UACT,SAAA;AAAA,UACA,OAAA;AAAA,UACA,OAAA;AAAA,UACA,IAAA,EAAK,OAAA;AAAA,UACL,WAAA,EAAa,IAAA;AAAA,UACb;AAAA;AAAA,OACF;AAAA,IAEJ,CAAA;AAKO,IAAME,yBAQR,CAAC;AAAA,MACJ,KAAA,GAAQ,YAAA;AAAA,MACR,OAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAA,GAAe,IAAA;AAAA,MACf;AAAA,KACF,KAAM;AACJ,MAAA,MAAM,EAAE,KAAA,EAAM,GAAInB,qBAAA,EAAc;AAEhC,MAAA,MAAM,OAAA,GAA0B,WAAW,CAAC;AAAA,QAC1C,KAAA,EAAO,QAAA;AAAA,QACP,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAS;AAAA,OACV,IAAI,EAAC;AAEN,MAAA,MAAM,WAAA,GAAc,YAAA,IAAgB,OAAO,QAAA,KAAa,QAAA,GACpD;;AAAA,EAAO,QAAA,CAAI,OAAO,IAAA,CAAK,KAAA,CAAM,WAAW,CAAC,CAAC,CAAC,CAAA,EAAG,QAAA,CAAI,MAAA,CAAO,KAAK,IAAA,CAAK,KAAA,CAAM,QAAA,GAAW,CAAC,CAAC,CAAC,IAAI,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAA,CAAA,GAC/G,EAAA;AAEJ,MAAA,uBACEK,cAAAA;AAAA,QAACY,cAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,SAAS,OAAA,GAAU,WAAA;AAAA,UACnB,SAAA;AAAA,UACA,SAAS,MAAM;AAAA,UAAC,CAAA;AAAA,UAChB,OAAA;AAAA,UACA,IAAA,EAAK,MAAA;AAAA,UACL,WAAA,EAAa,KAAA;AAAA,UACb;AAAA;AAAA,OACF;AAAA,IAEJ,CAAA;AAEA,IAAO,cAAA,GAAQA,cAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACxff,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,aAAA,EAAA,MAAAI,qBAAA;AAAA,EAAA,WAAA,EAAA,MAAAC,mBAAA;AAAA,EAAA,WAAA,EAAA,MAAAC,mBAAA;AAAA,EAAA,gBAAA,EAAA,MAAAC,wBAAA;AAAA,EAAA,MAAA,EAAA,MAAAC,cAAA;AAAA,EAAA,YAAA,EAAA,MAAAC,oBAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAgBaD,uBAAA,CAAA,CA+YAC,6BAAA,CAAA,CAOAJ,4BAAA,CAAA,CAOAE,iCAAA,CAAA,CAOAH,gCAkCAE,4BAAA,CAAA,KAgCN;AAtfP,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AAWA,IAAA,WAAA,EAAA;AAKO,IAAME,iBAAS,CAAa;AAAA,MACjC,KAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA,GAAW,KAAA;AAAA,MACX,WAAA,GAAc,qBAAA;AAAA,MACd,UAAA,GAAa,KAAA;AAAA,MACb,UAAA,GAAa,EAAA;AAAA,MACb,QAAA,GAAW,KAAA;AAAA,MACX,SAAA,GAAY,KAAA;AAAA,MACZ;AAAA,KACF,KAA0C;AACxC,MAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAIzB,qBAAA,EAAc;AAC5C,MAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIM,gBAAS,SAAS,CAAA;AAC9C,MAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,gBAAS,CAAC,CAAA;AACpD,MAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,gBAAS,EAAE,CAAA;AACjD,MAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,eAAAA;AAAA,QAC1C,QAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,CAAC,KAAK,CAAA,GAAI,EAAC,GAAK;AAAC,OACtE;AAGA,MAAA,MAAM,eAAA,GAAkBqB,eAAQ,MAAM;AACpC,QAAA,IAAI,CAAC,aAAa,OAAO,OAAA;AAEzB,QAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,UAAO,YACpB,MAAA,CAAO,KAAA,CAAM,aAAY,CAAE,QAAA,CAAS,YAAY,WAAA,EAAa,KAC5D,MAAA,CAAO,WAAA,IAAe,OAAO,WAAA,CAAY,WAAA,GAAc,QAAA,CAAS,WAAA,CAAY,aAAa;AAAA,SAC5F;AAAA,MACF,CAAA,EAAG,CAAC,OAAA,EAAS,WAAW,CAAC,CAAA;AAGzB,MAAA,MAAM,cAAA,GAAiBA,eAAQ,MAAM;AACnC,QAAA,MAAM,SAA4C,EAAC;AACnD,QAAA,MAAM,YAA+B,EAAC;AAEtC,QAAA,eAAA,CAAgB,QAAQ,CAAA,MAAA,KAAU;AAChC,UAAA,IAAI,OAAO,KAAA,EAAO;AAChB,YAAA,IAAI,CAAC,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,EAAG;AACzB,cAAA,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,GAAI,EAAC;AAAA,YAC1B;AACA,YAAA,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAAA,UAClC,CAAA,MAAO;AACL,YAAA,SAAA,CAAU,KAAK,MAAM,CAAA;AAAA,UACvB;AAAA,QACF,CAAC,CAAA;AAED,QAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAAA,MAC7B,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAGpB,MAAA,MAAM,WAAA,GAAcA,eAAQ,MAAM;AAChC,QAAA,MAAM,SAA4B,EAAC;AAGnC,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,cAAA,CAAe,SAAS,CAAA;AAGvC,QAAA,MAAA,CAAO,OAAA,CAAQ,eAAe,MAAM,CAAA,CAAE,QAAQ,CAAC,CAAC,KAAA,EAAO,YAAY,CAAA,KAAM;AACvE,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,YAAY,CAAA;AAAA,QAC7B,CAAC,CAAA;AAED,QAAA,OAAO,MAAA;AAAA,MACT,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAGnB,MAAAnB,iBAAU,MAAM;AACd,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,iBAAA,CAAkB,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,QAAQ,CAAC,KAAK,CAAA,GAAI,EAAE,CAAA;AAAA,QACvE,CAAA,MAAO;AACL,UAAA,iBAAA,CAAkB,KAAA,GAAQ,CAAC,KAAK,CAAA,GAAI,EAAE,CAAA;AAAA,QACxC;AAAA,MACF,CAAA,EAAG,CAAC,KAAA,EAAO,QAAQ,CAAC,CAAA;AAGpB,MAAAA,iBAAU,MAAM;AACd,QAAA,gBAAA,CAAiB,CAAC,CAAA;AAAA,MACpB,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAGpB,MAAAE,YAAAA;AAAA,QACE,CAAC,OAAO,GAAA,KAAQ;AACd,UAAA,IAAI,QAAA,EAAU;AAGd,UAAA,IAAI,GAAA,CAAI,MAAA,IAAU,CAAC,MAAA,EAAQ;AACzB,YAAA,SAAA,CAAU,IAAI,CAAA;AACd,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,CAAC,MAAA,EAAQ;AAEX,YAAA,IAAI,KAAA,IAAS,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,OAAA,EAAS;AACzC,cAAA,SAAA,CAAU,IAAI,CAAA;AACd,cAAA,IAAI,SAAS,UAAA,EAAY;AACvB,gBAAA,cAAA,CAAe,KAAK,CAAA;AAAA,cACtB;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,UAAA,IAAc,KAAA,IAAS,iBAAA,CAAkB,IAAA,CAAK,KAAK,CAAA,EAAG;AACxD,YAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,OAAO,KAAK,CAAA;AACnC,YAAA,gBAAA,CAAiB,CAAC,CAAA;AAClB,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,UAAA,IAAc,IAAI,SAAA,EAAW;AAC/B,YAAA,cAAA,CAAe,CAAA,IAAA,KAAQ,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AACxC,YAAA,gBAAA,CAAiB,CAAC,CAAA;AAClB,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,IAAI,MAAA,EAAQ;AACd,YAAA,SAAA,CAAU,KAAK,CAAA;AACf,YAAA,cAAA,CAAe,EAAE,CAAA;AACjB,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,IAAI,OAAA,EAAS;AACf,YAAA,gBAAA;AAAA,cAAiB,UACf,IAAA,KAAS,CAAA,GAAI,WAAA,CAAY,MAAA,GAAS,IAAI,IAAA,GAAO;AAAA,aAC/C;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,IAAI,SAAA,EAAW;AACjB,YAAA,gBAAA;AAAA,cAAiB,UACf,IAAA,KAAS,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,IAAI,IAAA,GAAO;AAAA,aAC/C;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,IAAI,MAAA,EAAQ;AACd,YAAA,gBAAA,CAAiB,UAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,GAAO,UAAU,CAAC,CAAA;AACvD,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,IAAI,QAAA,EAAU;AAChB,YAAA,gBAAA;AAAA,cAAiB,UACf,IAAA,CAAK,GAAA,CAAI,YAAY,MAAA,GAAS,CAAA,EAAG,OAAO,UAAU;AAAA,aACpD;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,IAAI,IAAA,EAAM;AACZ,YAAA,gBAAA,CAAiB,CAAC,CAAA;AAClB,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,IAAI,GAAA,EAAK;AACX,YAAA,gBAAA,CAAiB,WAAA,CAAY,SAAS,CAAC,CAAA;AACvC,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,IAAI,MAAA,EAAQ;AACd,YAAA,MAAM,cAAA,GAAiB,YAAY,aAAa,CAAA;AAChD,YAAA,IAAI,cAAA,IAAkB,CAAC,cAAA,CAAe,QAAA,EAAU;AAC9C,cAAA,IAAI,QAAA,EAAU;AACZ,gBAAA,MAAM,YAAY,cAAA,CAAe,QAAA,CAAS,cAAA,CAAe,KAAK,IAC1D,cAAA,CAAe,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,KAAM,eAAe,KAAK,CAAA,GACrD,CAAC,GAAG,cAAA,EAAgB,eAAe,KAAK,CAAA;AAC5C,gBAAA,iBAAA,CAAkB,SAAS,CAAA;AAC3B,gBAAA,QAAA,CAAS,SAAgB,CAAA;AAAA,cAC3B,CAAA,MAAO;AACL,gBAAA,QAAA,CAAS,eAAe,KAAK,CAAA;AAC7B,gBAAA,SAAA,CAAU,KAAK,CAAA;AACf,gBAAA,cAAA,CAAe,EAAE,CAAA;AAAA,cACnB;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,QAAA,IAAY,IAAI,KAAA,EAAO;AACzB,YAAA,MAAM,cAAA,GAAiB,YAAY,aAAa,CAAA;AAChD,YAAA,IAAI,cAAA,IAAkB,CAAC,cAAA,CAAe,QAAA,EAAU;AAC9C,cAAA,MAAM,YAAY,cAAA,CAAe,QAAA,CAAS,cAAA,CAAe,KAAK,IAC1D,cAAA,CAAe,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,KAAM,eAAe,KAAK,CAAA,GACrD,CAAC,GAAG,cAAA,EAAgB,eAAe,KAAK,CAAA;AAC5C,cAAA,iBAAA,CAAkB,SAAS,CAAA;AAC3B,cAAA,QAAA,CAAS,SAAgB,CAAA;AAAA,YAC3B;AACA,YAAA;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,EAAE,QAAA,EAAU,CAAC,QAAA;AAAS,OACxB;AAGA,MAAA,MAAM,iBAAiB,MAAM;AAC3B,QAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,UAAA,OAAO,WAAA;AAAA,QACT;AAEA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,cAAA,GAAiB,cAAA,CACpB,GAAA,CAAI,CAAA,GAAA,KAAO,QAAQ,IAAA,CAAK,CAAA,GAAA,KAAO,GAAA,CAAI,KAAA,KAAU,GAAG,CAAA,EAAG,KAAK,CAAA,CACxD,OAAO,OAAO,CAAA;AAEjB,UAAA,IAAI,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG,OAAO,WAAA;AACxC,UAAA,IAAI,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG,OAAO,eAAe,CAAC,CAAA;AACxD,UAAA,OAAO,CAAA,EAAG,eAAe,MAAM,CAAA,eAAA,CAAA;AAAA,QACjC;AAEA,QAAA,MAAM,cAAA,GAAiB,QAAQ,IAAA,CAAK,CAAA,GAAA,KAAO,IAAI,KAAA,KAAU,cAAA,CAAe,CAAC,CAAC,CAAA;AAC1E,QAAA,OAAO,gBAAgB,KAAA,IAAS,WAAA;AAAA,MAClC,CAAA;AAGA,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,uBACER,eAAAA,CAACC,OAAAA,EAAA,EAAI,eAAc,QAAA,EAChB,QAAA,EAAA;AAAA,UAAA,KAAA,oBAASD,eAAAA,CAACE,QAAAA,EAAA,EAAM,QAAA,EAAA;AAAA,YAAA,KAAA;AAAA,YAAM;AAAA,WAAA,EAAC,CAAA;AAAA,0BACxBC,cAAAA,CAACD,QAAAA,EAAA,EAAM,0BAAe,EAAE,CAAA;AAAA,UACvB,MAAA,oBACCC,cAAAA,CAACF,OAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,UAAA,EAAY,CAAA,EACrC,QAAA,EAAA,WAAA,CAAY,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,qBACxBD,eAAAA,CAACE,QAAAA,EAAA,EAAgC,KAAA,EAAO,KAAA,KAAU,aAAA,GAAgB,MAAA,GAAS,OAAA,EACxE,QAAA,EAAA;AAAA,YAAA,KAAA,KAAU,gBAAgB,IAAA,GAAO,IAAA;AAAA,YACjC,QAAA,IAAY,eAAe,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA,GAAI,WAAA,GAAS,WAAW,MAAA,GAAS,EAAA;AAAA,YACjF,MAAA,CAAO;AAAA,WAAA,EAAA,EAHC,MAAA,CAAO,MAAA,CAAO,KAAK,CAI9B,CACD,CAAA,EACH;AAAA,SAAA,EAEJ,CAAA;AAAA,MAEJ;AAEA,MAAA,uBACEF,eAAAA,CAACC,OAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,eAAa,MAAA,EAEtC,QAAA,EAAA;AAAA,QAAA,KAAA,oBACCE,cAAAA,CAACF,OAAAA,EAAA,EAAI,YAAA,EAAc,CAAA,EACjB,QAAA,kBAAAD,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,IAAA,EAAO,QAAA,EAAA;AAAA,UAAA,KAAA;AAAA,UAAM;AAAA,SAAA,EAAC,CAAA,EACnC,CAAA;AAAA,wBAIFF,eAAAA;AAAA,UAACC,OAAAA;AAAA,UAAA;AAAA,YACC,WAAA,EAAY,OAAA;AAAA,YACZ,aACE,QAAA,GACI,KAAA,CAAM,QACN,MAAA,GACA,KAAA,CAAM,UACN,KAAA,CAAM,KAAA;AAAA,YAEZ,QAAA,EAAU,CAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAE,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,cAAA,CAAe,MAAA,KAAW,CAAA,GAAI,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,EAC5D,QAAA,EAAA,cAAA,EAAe,EAClB,CAAA;AAAA,8BACAF,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,gBAAA,GAAA;AAAA,gBAAE,SAAS,QAAA,GAAM;AAAA,eAAA,EAAI;AAAA;AAAA;AAAA,SACjD;AAAA,QAGC,MAAA,IAAU,8BACTF,eAAAA;AAAA,UAACC,OAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA;AAAA,YACX,WAAA,EAAY,OAAA;AAAA,YACZ,aAAa,KAAA,CAAM,OAAA;AAAA,YACnB,QAAA,EAAU,CAAA;AAAA,YAEV,QAAA,EAAA;AAAA,8BAAAE,eAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,OAAO,QAAA,EAAA,UAAA,EAAQ,CAAA;AAAA,8BAClCC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,MAAO,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,8BACtCC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,QAAA,EAAA,GAAA,EAAC;AAAA;AAAA;AAAA,SAC/B;AAAA,QAID,0BACCF,eAAAA;AAAA,UAACC,OAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA;AAAA,YACX,WAAA,EAAY,OAAA;AAAA,YACZ,aAAa,KAAA,CAAM,OAAA;AAAA,YACnB,QAAA,EAAU,CAAA;AAAA,YACV,QAAA,EAAU,CAAA;AAAA,YACV,aAAA,EAAc,QAAA;AAAA,YACd,WAAW,UAAA,GAAa,CAAA;AAAA,YAEvB,QAAA,EAAA;AAAA,cAAA,WAAA,CAAY,MAAA,KAAW,CAAA,mBACtBE,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,QAAA,EAAA,kBAAA,EAAgB,CAAA,mBAE1CF,gBAAA0B,mBAAA,EAAA,EAEG,QAAA,EAAA;AAAA,gBAAA,cAAA,CAAe,SAAA,CAAU,GAAA,CAAI,CAAC,MAAA,EAAQ,WAAA,KAAgB;AACrD,kBAAA,MAAM,aAAa,aAAA,KAAkB,WAAA;AACrC,kBAAA,MAAM,SAAA,GAAY,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAEtD,kBAAA,uBACEvB,cAAAA,CAACF,OAAAA,EAAA,EACC,QAAA,kBAAAD,eAAAA;AAAA,oBAACE,QAAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EACE,OAAO,QAAA,GACH,KAAA,CAAM,QACN,UAAA,GACA,KAAA,CAAM,UACN,KAAA,CAAM,IAAA;AAAA,sBAEZ,eAAA,EAAiB,UAAA,GAAa,KAAA,CAAM,OAAA,GAAU,MAAA;AAAA,sBAC9C,OAAA,EAAS,UAAA,IAAc,CAAC,MAAA,CAAO,QAAA;AAAA,sBAE9B,QAAA,EAAA;AAAA,wBAAA,UAAA,GAAa,IAAA,GAAO,IAAA;AAAA,wBACpB,QAAA,oBACCC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,SAAA,GAAY,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,KAAA,EAC5C,QAAA,EAAA,SAAA,GAAY,cAAS,MAAA,EACxB,CAAA;AAAA,wBAED,MAAA,CAAO,KAAA;AAAA,wBACP,MAAA,CAAO,+BACNF,eAAAA,CAACE,UAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,0BAAA,KAAA;AAAA,0BAAI,MAAA,CAAO;AAAA,yBAAA,EAAY;AAAA;AAAA;AAAA,mBAErD,EAAA,EAtBQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAuB7B,CAAA;AAAA,gBAEJ,CAAC,CAAA;AAAA,gBAGA,MAAA,CAAO,OAAA,CAAQ,cAAA,CAAe,MAAM,CAAA,CAAE,IAAI,CAAC,CAAC,SAAA,EAAW,YAAY,CAAA,KAAM;AACxE,kBAAA,MAAM,eAAA,GAAkB,cAAA,CAAe,SAAA,CAAU,MAAA,GAC/C,MAAA,CAAO,OAAA,CAAQ,cAAA,CAAe,MAAM,CAAA,CACjC,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,KAAK,cAAA,CAAe,MAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAC,CAAA,CAC9D,MAAA,CAAO,CAAC,GAAA,EAAK,GAAG,IAAI,CAAA,KAAM,GAAA,GAAM,IAAA,CAAK,QAAQ,CAAC,CAAA;AAEnD,kBAAA,uBACEF,eAAAA,CAACC,OAAAA,EAAA,EAAoB,eAAc,QAAA,EAEjC,QAAA,EAAA;AAAA,oCAAAE,eAACF,OAAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,cAAc,CAAA,EAC/B,QAAA,kBAAAE,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,WAAW,IAAA,EAAI,IAAA,EAC/B,qBACH,CAAA,EACF,CAAA;AAAA,oBAGC,YAAA,CAAa,GAAA,CAAI,CAAC,MAAA,EAAQ,UAAA,KAAe;AACxC,sBAAA,MAAM,cAAc,eAAA,GAAkB,UAAA;AACtC,sBAAA,MAAM,aAAa,aAAA,KAAkB,WAAA;AACrC,sBAAA,MAAM,SAAA,GAAY,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAEtD,sBAAA,uBACEC,cAAAA,CAACF,OAAAA,EAAA,EAA+B,UAAA,EAAY,GAC1C,QAAA,kBAAAD,eAAAA;AAAA,wBAACE,QAAAA;AAAA,wBAAA;AAAA,0BACC,KAAA,EACE,OAAO,QAAA,GACH,KAAA,CAAM,QACN,UAAA,GACA,KAAA,CAAM,UACN,KAAA,CAAM,IAAA;AAAA,0BAEZ,eAAA,EAAiB,UAAA,GAAa,KAAA,CAAM,OAAA,GAAU,MAAA;AAAA,0BAC9C,OAAA,EAAS,UAAA,IAAc,CAAC,MAAA,CAAO,QAAA;AAAA,0BAE9B,QAAA,EAAA;AAAA,4BAAA,UAAA,GAAa,IAAA,GAAO,IAAA;AAAA,4BACpB,QAAA,oBACCC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,SAAA,GAAY,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,KAAA,EAC5C,QAAA,EAAA,SAAA,GAAY,cAAS,MAAA,EACxB,CAAA;AAAA,4BAED,MAAA,CAAO,KAAA;AAAA,4BACP,MAAA,CAAO,+BACNF,eAAAA,CAACE,UAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,8BAAA,KAAA;AAAA,8BAAI,MAAA,CAAO;AAAA,6BAAA,EAAY;AAAA;AAAA;AAAA,uBAErD,EAAA,EAtBQ,MAAA,CAAO,MAAA,CAAO,KAAK,CAuB7B,CAAA;AAAA,oBAEJ,CAAC;AAAA,mBAAA,EAAA,EAxCO,SAyCV,CAAA;AAAA,gBAEJ,CAAC;AAAA,eAAA,EACH,CAAA;AAAA,cAID,CAAC,QAAA,IAAY,WAAA,CAAY,MAAA,GAAS,CAAA,oBACjCC,cAAAA,CAACF,OAAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,SAAA,EAAS,MAAC,WAAA,EAAa,KAAA,CAAM,KAAA,EAAO,UAAA,EAAY,CAAA,EACjE,QAAA,kBAAAD,gBAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,KAAA,EAChB,QAAA,EAAA;AAAA,gBAAA,QAAA,GAAW,0FAAA,GAAoE,kEAAA;AAAA,gBAC/E,UAAA,IAAc;AAAA,eAAA,EACjB,CAAA,EACF;AAAA;AAAA;AAAA;AAEJ,OAAA,EAEJ,CAAA;AAAA,IAEJ,CAAA;AAKO,IAAMsB,oBAAA,GAAe,CAAa,KAAA,KAA4C;AACnF,MAAA,uBAAOrB,cAAAA,CAACoB,cAAA,EAAA,EAAQ,GAAG,KAAA,EAAO,UAAU,KAAA,EAAO,CAAA;AAAA,IAC7C,CAAA;AAKO,IAAMH,mBAAA,GAAc,CAAa,KAAA,KAA4C;AAClF,MAAA,uBAAOjB,cAAAA,CAACoB,cAAA,EAAA,EAAQ,GAAG,KAAA,EAAO,UAAU,IAAA,EAAM,CAAA;AAAA,IAC5C,CAAA;AAKO,IAAMD,wBAAA,GAAmB,CAAa,KAAA,KAA8C;AACzF,MAAA,uBAAOnB,cAAAA,CAACoB,cAAA,EAAA,EAAQ,GAAG,KAAA,EAAO,YAAY,IAAA,EAAM,CAAA;AAAA,IAC9C,CAAA;AAKO,IAAMJ,wBAOR,CAAC;AAAA,MACJ,KAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,GAAY,KAAA;AAAA,MACZ,UAAA,GAAa,IAAA;AAAA,MACb;AAAA,KACF,KAAM;AACJ,MAAA,MAAM,OAAA,GAAmC;AAAA,QACvC,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,SAAA,EAAU;AAAA,QAChC,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,UAAA;AAAW,OACpC;AAEA,MAAA,uBACEhB,cAAAA;AAAA,QAACoB,cAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,OAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA;AAAA,OACF;AAAA,IAEJ,CAAA;AAKO,IAAMF,sBAOR,CAAC;AAAA,MACJ,KAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA;AAAA,KACF,KAAM;AACJ,MAAA,MAAM,OAAA,GAAkC,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,QAC7D,KAAA,EAAO,MAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACT,CAAE,CAAA;AAEF,MAAA,uBACElB,cAAAA;AAAA,QAACoB,cAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,OAAA;AAAA,UACA,KAAA;AAAA,UACA,QAAA;AAAA,UACA,WAAA;AAAA,UACA;AAAA;AAAA,OACF;AAAA,IAEJ,CAAA;AAEA,IAAO,cAAA,GAAQA,cAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACxeR,SAAS,YAAY,OAAA,EASzB;AACD,EAAA,MAAM;AAAA,IACJ,QAAA,GAAW,IAAA;AAAA,IACX,WAAW,EAAC;AAAA,IACZ,KAAA;AAAA,IACA,cAAA,GAAiB;AAAA,GACnB,GAAI,OAAA;AAEJ,EAAA,MAAM,WAAA,GAAclB,cAAO,QAAQ,CAAA;AACnC,EAAA,MAAM,QAAA,GAAWA,cAAO,KAAK,CAAA;AAG7B,EAAAC,iBAAU,MAAM;AACd,IAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AACtB,IAAA,QAAA,CAAS,OAAA,GAAU,KAAA;AAAA,EACrB,CAAA,EAAG,CAAC,QAAA,EAAU,KAAK,CAAC,CAAA;AAGpB,EAAAE,YAAAA;AAAA,IACE,CAAC,OAAO,GAAA,KAAQ;AAEd,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,IAAI,MAAA,EAAQ;AACd,QAAA,OAAA,GAAU,QAAA;AAAA,MACZ,CAAA,MAAA,IAAW,IAAI,MAAA,EAAQ;AACrB,QAAA,OAAA,GAAU,QAAA;AAAA,MACZ,CAAA,MAAA,IAAW,IAAI,GAAA,EAAK;AAClB,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ,CAAA,MAAA,IAAW,IAAI,SAAA,EAAW;AACxB,QAAA,OAAA,GAAU,WAAA;AAAA,MACZ,CAAA,MAAA,IAAW,IAAI,MAAA,EAAQ;AACrB,QAAA,OAAA,GAAU,QAAA;AAAA,MACZ,CAAA,MAAA,IAAW,IAAI,OAAA,EAAS;AACtB,QAAA,OAAA,GAAU,SAAA;AAAA,MACZ,CAAA,MAAA,IAAW,IAAI,SAAA,EAAW;AACxB,QAAA,OAAA,GAAU,WAAA;AAAA,MACZ,CAAA,MAAA,IAAW,IAAI,SAAA,EAAW;AACxB,QAAA,OAAA,GAAU,WAAA;AAAA,MACZ,CAAA,MAAA,IAAW,IAAI,UAAA,EAAY;AACzB,QAAA,OAAA,GAAU,YAAA;AAAA,MACZ,CAAA,MAAA,IAAW,IAAI,MAAA,EAAQ;AACrB,QAAA,OAAA,GAAU,QAAA;AAAA,MACZ,CAAA,MAAA,IAAW,IAAI,QAAA,EAAU;AACvB,QAAA,OAAA,GAAU,UAAA;AAAA,MACZ,CAAA,MAAA,IAAW,IAAI,IAAA,EAAM;AACnB,QAAA,OAAA,GAAU,MAAA;AAAA,MACZ,CAAA,MAAA,IAAW,IAAI,GAAA,EAAK;AAClB,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ,CAAA,MAAO;AAEL,QAAA,OAAA,GAAU,KAAA,IAAS,SAAA;AAAA,MACrB;AAEA,MAAA,MAAM,QAAA,GAA0B;AAAA,QAC9B,GAAA,EAAK,OAAA;AAAA,QACL,IAAA,EAAM,IAAI,IAAA,IAAQ,KAAA;AAAA,QAClB,IAAA,EAAM,IAAI,IAAA,IAAQ,KAAA;AAAA,QAClB,KAAA,EAAO,IAAI,KAAA,IAAS,KAAA;AAAA,QACpB,GAAA,EAAK,IAAI,GAAA,IAAO,KAAA;AAAA,QAChB,QAAA,EAAU,GAAG,GAAA,CAAI,IAAA,GAAO,UAAU,EAAE,CAAA,EAAG,GAAA,CAAI,IAAA,GAAO,OAAA,GAAU,EAAE,GAAG,GAAA,CAAI,KAAA,GAAQ,QAAA,GAAW,EAAE,CAAA,EAAG,GAAA,CAAI,MAAM,MAAA,GAAS,EAAE,CAAA,EAAG,KAAA,IAAS,OAAO,CAAA;AAAA,OACvI;AAGA,MAAA,KAAA,MAAW,OAAA,IAAW,YAAY,OAAA,EAAS;AACzC,QAAA,IAAI,iBAAA,CAAkB,QAAA,EAAU,OAAO,CAAA,EAAG;AACxC,UAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AACvC,UAAA,IAAI,MAAA,KAAW,SAAS,cAAA,EAAgB;AACtC,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,SAAS,OAAA,EAAS;AACpB,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA;AACxC,QAAA,IAAI,WAAW,KAAA,EAAO;AACpB,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,EAAE,QAAA;AAAS,GACb;AAGA,EAAA,MAAM,eAAA,GAAkBD,kBAAAA,CAAY,CAAC,OAAA,KAAwB;AAC3D,IAAA,WAAA,CAAY,OAAA,GAAU,CAAC,GAAG,WAAA,CAAY,SAAS,OAAO,CAAA;AAAA,EACxD,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,iBAAA,GAAoBA,kBAAAA,CAAY,CAAC,GAAA,KAAgB;AACrD,IAAA,WAAA,CAAY,UAAU,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,GAAG,CAAA;AAAA,EACrE,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,aAAA,GAAgBA,mBAAY,MAAM;AACtC,IAAA,WAAA,CAAY,UAAU,EAAC;AAAA,EACzB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO;AAAA,IACL,eAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,mBAAmB,SAAA,EAAuC;AACxE,EAAA,MAAM,QAAA,GAAyB,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CAAE,IAAI,CAAC,CAAC,GAAA,EAAK,OAAO,CAAA,MAAO;AAAA,IAChF,GAAA;AAAA,IACA,SAAS,MAAM;AACb,MAAA,OAAA,EAAQ;AACR,MAAA,OAAO,KAAA;AAAA,IACT,CAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV,CAAE,CAAA;AAEF,EAAA,WAAA,CAAY,EAAE,UAAU,CAAA;AAC1B;AAKO,SAAS,kBAAkB,OAAA,EAY/B;AACD,EAAA,MAAM;AAAA,IACJ,IAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA,GAAW;AAAA,GACb,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAA,GAAyB;AAAA,IAC7B,IAAA,IAAQ,EAAE,GAAA,EAAK,SAAA,EAAW,SAAS,IAAA,EAAK;AAAA,IACxC,MAAA,IAAU,EAAE,GAAA,EAAK,WAAA,EAAa,SAAS,MAAA,EAAO;AAAA,IAC9C,MAAA,IAAU,EAAE,GAAA,EAAK,WAAA,EAAa,SAAS,MAAA,EAAO;AAAA,IAC9C,OAAA,IAAW,EAAE,GAAA,EAAK,YAAA,EAAc,SAAS,OAAA,EAAQ;AAAA,IACjD,MAAA,IAAU,EAAE,GAAA,EAAK,MAAA,EAAQ,SAAS,MAAA,EAAO;AAAA,IACzC,KAAA,IAAS,EAAE,GAAA,EAAK,KAAA,EAAO,SAAS,KAAA,EAAM;AAAA,IACtC,QAAA,IAAY,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,QAAA,EAAS;AAAA,IAC/C,UAAA,IAAc,EAAE,GAAA,EAAK,UAAA,EAAY,SAAS,UAAA,EAAW;AAAA,IACrD,OAAA,IAAW,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,OAAA,EAAQ;AAAA,IAC7C,QAAA,IAAY,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,QAAA;AAAS,GACjD,CAAE,OAAO,OAAO,CAAA;AAEhB,EAAA,WAAA,CAAY,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA;AACpC;AAKO,SAAS,mBAAmB,OAAA,EAQhC;AACD,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA,GAAW;AAAA,GACb,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAA,GAAyB;AAAA,IAC7B,MAAA,IAAU,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,MAAA,EAAO;AAAA,IAC3C,OAAA,IAAW,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,OAAA,EAAQ;AAAA,IAC7C,KAAA,IAAS,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,KAAA,EAAM;AAAA,IACzC,MAAA,IAAU,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,MAAA,EAAO;AAAA,IAC3C,MAAA,IAAU,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,MAAA,EAAO;AAAA,IAC3C,WAAA,IAAe,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,WAAA;AAAY,GACvD,CAAE,OAAO,OAAO,CAAA;AAEhB,EAAA,WAAA,CAAY,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA;AACpC;AAKO,SAAS,YAAY,OAAA,EAMzB;AACD,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA,GAAW;AAAA,GACb,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAA,GAAyB;AAAA,IAC7B,QAAA,IAAY,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,QAAA,EAAS;AAAA,IAC/C,QAAA,IAAY,EAAE,GAAA,EAAK,aAAA,EAAe,SAAS,QAAA,EAAS;AAAA,IACpD,QAAA,IAAY,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,QAAA,EAAS;AAAA,IAC/C,MAAA,IAAU,EAAE,GAAA,EAAK,KAAA,EAAO,SAAS,MAAA,EAAO;AAAA,IACxC,UAAA,IAAc,EAAE,GAAA,EAAK,WAAA,EAAa,SAAS,UAAA;AAAW,GACxD,CAAE,OAAO,OAAO,CAAA;AAEhB,EAAA,WAAA,CAAY,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA;AACpC;AAKO,SAAS,gBAAgB,OAAA,EAO7B;AACD,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA,GAAW;AAAA,GACb,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAA,GAAyB;AAAA,IAC7B,MAAA,IAAU,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,MAAA,EAAO;AAAA,IAC3C,MAAA,IAAU,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,MAAA,EAAO;AAAA,IAC3C,MAAA,IAAU,EAAE,GAAA,EAAK,IAAA,EAAM,SAAS,MAAA,EAAO;AAAA,IACvC,MAAA,IAAU,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,MAAA,EAAO;AAAA,IAC3C,SAAA,IAAa,EAAE,GAAA,EAAK,IAAA,EAAM,SAAS,SAAA,EAAU;AAAA,IAC7C,SAAA,IAAa,EAAE,GAAA,EAAK,QAAA,EAAU,SAAS,SAAA,EAAU;AAAA,IACjD,UAAA,IAAc,EAAE,GAAA,EAAK,YAAA,EAAc,SAAS,UAAA,EAAW;AAAA,IACvD,YAAA,IAAgB,EAAE,GAAA,EAAK,KAAA,EAAO,SAAS,YAAA;AAAa,GACtD,CAAE,OAAO,OAAO,CAAA;AAEhB,EAAA,WAAA,CAAY,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA;AACpC;AASA,SAAS,iBAAA,CAAkB,OAAsB,OAAA,EAA8B;AAC7E,EAAA,MAAM,eAAe,OAAA,CAAQ,GAAA,CAAI,WAAA,EAAY,CAAE,MAAM,GAAG,CAAA;AACxD,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA;AACpD,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAG1C,EAAA,IAAI,KAAA,CAAM,GAAA,CAAI,WAAA,EAAY,KAAM,OAAA,EAAS;AACvC,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA;AACzC,EAAA,MAAM,UAAU,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,IAAK,SAAA,CAAU,SAAS,KAAK,CAAA;AACtE,EAAA,MAAM,QAAA,GAAW,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA;AAC3C,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA;AAEvC,EAAA,OACE,KAAA,CAAM,IAAA,KAAS,OAAA,IACf,KAAA,CAAM,IAAA,KAAS,WACf,KAAA,CAAM,KAAA,KAAU,QAAA,IAChB,KAAA,CAAM,GAAA,KAAQ,MAAA;AAElB;AAKO,SAAS,kBAAkB,KAAA,EAA8B;AAC9D,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AACjC,EAAA,IAAI,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AACjC,EAAA,IAAI,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AACnC,EAAA,IAAI,KAAA,CAAM,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,KAAK,CAAA;AAC/B,EAAA,KAAA,CAAM,IAAA,CAAK,MAAM,GAAG,CAAA;AAEpB,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAKO,SAAS,gBAAgB,OAAA,EAM9B;AACA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,WAAA,EAAY,CAAE,MAAM,GAAG,CAAA;AAC7C,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAClC,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEnC,EAAA,OAAO;AAAA,IACL,GAAA;AAAA,IACA,IAAA,EAAM,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA;AAAA,IAC/B,MAAM,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,IAAK,SAAA,CAAU,SAAS,KAAK,CAAA;AAAA,IAC5D,KAAA,EAAO,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA;AAAA,IACjC,GAAA,EAAK,SAAA,CAAU,QAAA,CAAS,KAAK;AAAA,GAC/B;AACF;AAlWA,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;ACaO,SAAS,WAAA,CACd,YAAA,EACA,OAAA,GAWI,EAAC,EACL;AACA,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA,GAAa,GAAA;AAAA,IACb,QAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAGJ,EAAA,MAAM,kBAAkB,MAAS;AAC/B,IAAA,IAAI,UAAA,IAAc,OAAO,YAAA,KAAiB,WAAA,EAAa;AACrD,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,YAAA,CAAa,OAAA,CAAQ,UAAU,CAAA;AAC9C,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,OAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,QAC1B;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAO,YAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,gBAAY,eAAe,CAAA;AACrD,EAAA,MAAM,CAAC,YAAY,aAAa,CAAA,GAAIA,gBAA0B,EAAE,OAAA,EAAS,MAAM,CAAA;AAC/E,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,cAAcC,aAAAA,EAAuB;AAG3C,EAAA,MAAM,aAAA,GAAgBE,kBAAAA,CAAY,CAAC,GAAA,KAAW;AAC5C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,aAAA,CAAc,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAC/B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAC1B,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpB,SAAS,CAAC,KAAA;AAAA,MACV;AAAA,KACF;AAEA,IAAA,aAAA,CAAc,aAAa,CAAA;AAC3B,IAAA,kBAAA,GAAqB,aAAa,CAAA;AAAA,EACpC,CAAA,EAAG,CAAC,QAAA,EAAU,kBAAkB,CAAC,CAAA;AAGjC,EAAAD,iBAAU,MAAM;AACd,IAAA,IAAI,YAAY,OAAA,EAAS;AACvB,MAAA,YAAA,CAAa,YAAY,OAAO,CAAA;AAAA,IAClC;AAEA,IAAA,WAAA,CAAY,OAAA,GAAU,WAAW,MAAM;AACrC,MAAA,aAAA,CAAc,KAAK,CAAA;AAAA,IACrB,GAAG,UAAU,CAAA;AAEb,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,YAAY,OAAA,EAAS;AACvB,QAAA,YAAA,CAAa,YAAY,OAAO,CAAA;AAAA,MAClC;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,aAAA,EAAe,UAAU,CAAC,CAAA;AAGrC,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,UAAA,IAAc,OAAO,YAAA,KAAiB,WAAA,IAAe,OAAA,EAAS;AAChE,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,OAAA,CAAQ,UAAA,EAAY,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MACxD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,UAAA,EAAY,OAAO,CAAC,CAAA;AAG/B,EAAAA,iBAAU,MAAM;AACd,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,QAAA,GAAW,KAAK,CAAA;AAAA,IAClB;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,QAAA,EAAU,OAAO,CAAC,CAAA;AAE7B,EAAA,MAAM,WAAA,GAAcC,kBAAAA,CAAY,CAAC,QAAA,KAAmC;AAClE,IAAA,QAAA,CAAS,CAAA,IAAA,KAAQ;AACf,MAAA,MAAM,UAAU,OAAO,QAAA,KAAa,UAAA,GAAc,QAAA,CAA4B,IAAI,CAAA,GAAI,QAAA;AACtF,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,KAAA,GAAQA,mBAAY,MAAM;AAC9B,IAAA,QAAA,CAAS,YAAY,CAAA;AACrB,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,aAAA,CAAc,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,EACjC,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAEjB,EAAA,MAAM,gBAAA,GAAmBA,mBAAY,MAAM;AACzC,IAAA,IAAI,UAAA,IAAc,OAAO,YAAA,KAAiB,WAAA,EAAa;AACrD,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,WAAW,UAAU,CAAA;AAAA,MACpC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,QAAA,EAAU,WAAA;AAAA,IACV,UAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,gBAAA;AAAA,IACA,SAAS,UAAA,CAAW;AAAA,GACtB;AACF;AAKO,SAAS,YAAA,CACd,aAAA,EACA,OAAA,GAWI,EAAC,EACL;AACA,EAAA,MAAM;AAAA,IACJ,kBAAkB,EAAC;AAAA,IACnB,YAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIH,gBAAY,aAAa,CAAA;AACrD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAAA,CAA2C,EAAE,CAAA;AACzE,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAAA,CAA4C,EAAE,CAAA;AAC5E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,gBAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAG5C,EAAA,MAAM,aAAA,GAAgBG,kBAAAA,CAAY,CAAC,IAAA,EAAe,KAAA,KAAe;AAC/D,IAAA,MAAM,SAAA,GAAY,gBAAgB,IAAI,CAAA;AACtC,IAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,IAAA,OAAO,UAAU,KAAK,CAAA;AAAA,EACxB,CAAA,EAAG,CAAC,eAAe,CAAC,CAAA;AAGpB,EAAA,MAAM,iBAAA,GAAoBA,mBAAY,MAAM;AAC1C,IAAA,MAAM,YAA8C,EAAC;AAGrD,IAAA,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAA,GAAA,KAAO;AACjC,MAAA,MAAM,QAAA,GAAW,GAAA;AACjB,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,QAAA,EAAU,MAAA,CAAO,QAAQ,CAAC,CAAA;AACtD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,SAAA,CAAU,QAAQ,CAAA,GAAI,KAAA;AAAA,MACxB;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,UAAA,GAAa,aAAa,MAAM,CAAA;AACtC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAA,CAAO,MAAA,CAAO,WAAW,UAAU,CAAA;AAAA,MACrC;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,SAAS,CAAA;AACnB,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA,KAAW,CAAA;AAAA,EAC3C,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAA,EAAe,YAAY,CAAC,CAAA;AAGxC,EAAA,MAAM,aAAA,GAAgBA,kBAAAA,CAAY,CAAC,IAAA,EAAe,KAAA,KAAe;AAC/D,IAAA,SAAA,CAAU,CAAA,IAAA,KAAQ;AAChB,MAAA,MAAM,UAAU,EAAE,GAAG,MAAM,CAAC,IAAI,GAAG,KAAA,EAAM;AACzC,MAAA,UAAA,CAAW,IAAI,CAAA;AACf,MAAA,QAAA,GAAW,OAAO,CAAA;AAClB,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,IAAI,OAAA,CAAQ,IAAI,CAAA,EAAG;AACjB,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAA,EAAM,KAAK,CAAA;AACvC,MAAA,SAAA,CAAU,CAAA,IAAA,MAAS;AAAA,QACjB,GAAG,IAAA;AAAA,QACH,CAAC,IAAI,GAAG,KAAA,IAAS;AAAA,OACnB,CAAE,CAAA;AAAA,IACJ;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,aAAA,EAAe,QAAQ,CAAC,CAAA;AAGrC,EAAA,MAAM,eAAA,GAAkBA,kBAAAA,CAAY,CAAC,IAAA,EAAe,YAAqB,IAAA,KAAS;AAChF,IAAA,UAAA,CAAW,CAAA,IAAA,MAAS,EAAE,GAAG,IAAA,EAAM,CAAC,IAAI,GAAG,WAAU,CAAE,CAAA;AAGnD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,IAAA,EAAM,MAAA,CAAO,IAAI,CAAC,CAAA;AAC9C,MAAA,SAAA,CAAU,CAAA,IAAA,MAAS;AAAA,QACjB,GAAG,IAAA;AAAA,QACH,CAAC,IAAI,GAAG,KAAA,IAAS;AAAA,OACnB,CAAE,CAAA;AAAA,IACJ;AAAA,EACF,CAAA,EAAG,CAAC,MAAA,EAAQ,aAAa,CAAC,CAAA;AAG1B,EAAA,MAAM,aAAA,GAAgBA,kBAAAA,CAAY,CAAC,IAAA,MAAmB;AAAA,IACpD,KAAA,EAAO,OAAO,IAAI,CAAA;AAAA,IAClB,KAAA,EAAO,OAAO,IAAI,CAAA;AAAA,IAClB,OAAA,EAAS,OAAA,CAAQ,IAAI,CAAA,IAAK,KAAA;AAAA,IAC1B,QAAA,EAAU,CAAC,KAAA,KAAe,aAAA,CAAc,MAAM,KAAK,CAAA;AAAA,IACnD,MAAA,EAAQ,MAAM,eAAA,CAAgB,IAAA,EAAM,IAAI;AAAA,MACtC,CAAC,MAAA,EAAQ,QAAQ,OAAA,EAAS,aAAA,EAAe,eAAe,CAAC,CAAA;AAG7D,EAAA,MAAM,YAAA,GAAeA,mBAAY,YAAY;AAE3C,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AACpC,IAAA,MAAM,eAAkD,EAAC;AACzD,IAAA,SAAA,CAAU,QAAQ,CAAA,KAAA,KAAS;AACzB,MAAA,YAAA,CAAa,KAAK,CAAA,GAAI,IAAA;AAAA,IACxB,CAAC,CAAA;AACD,IAAA,UAAA,CAAW,YAAY,CAAA;AAGvB,IAAA,MAAMoB,WAAU,iBAAA,EAAkB;AAClC,IAAA,IAAI,CAACA,QAAAA,EAAS;AACZ,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,MAAM,CAAA;AACrB,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,QAAA,OAAO,KAAA;AAAA,MACT,CAAA,SAAE;AACA,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,EAAG,CAAC,MAAA,EAAQ,iBAAA,EAAmB,QAAQ,CAAC,CAAA;AAGxC,EAAA,MAAM,KAAA,GAAQpB,mBAAY,MAAM;AAC9B,IAAA,SAAA,CAAU,aAAa,CAAA;AACvB,IAAA,SAAA,CAAU,EAAE,CAAA;AACZ,IAAA,UAAA,CAAW,EAAE,CAAA;AACb,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAGlB,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,MAAM,EAAE,MAAA,KAAW,CAAA;AAE/C,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,aACd,YAAA,GAAoB,EAAC,EACrB,OAAA,GAOI,EAAC,EACL;AACA,EAAA,MAAM,EAAE,YAAA,EAAc,QAAA,EAAU,QAAA,EAAS,GAAI,OAAA;AAE7C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,gBAAc,YAAY,CAAA;AACpD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,IAAIA,eAAAA,iBAAsB,IAAI,KAAK,CAAA;AAG7E,EAAA,MAAM,OAAA,GAAUG,kBAAAA,CAAY,CAAC,IAAA,EAAS,KAAA,KAAmB;AACvD,IAAA,QAAA,CAAS,CAAA,IAAA,KAAQ;AACf,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,IAAI,CAAA;AACzB,MAAA,MAAM,WAAA,GAAc,SAAS,QAAA,CAAS,MAAA;AAGtC,MAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,IAAU,QAAA,EAAU;AAC3C,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,QAAA,CAAS,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG,IAAI,CAAA;AACpC,MAAA,QAAA,GAAW,QAAQ,CAAA;AACnB,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA;AAGvB,EAAA,MAAM,UAAA,GAAaA,kBAAAA,CAAY,CAAC,KAAA,KAAkB;AAChD,IAAA,QAAA,CAAS,CAAA,IAAA,KAAQ;AACf,MAAA,MAAM,WAAW,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,MAAM,KAAK,CAAA;AAClD,MAAA,QAAA,GAAW,QAAQ,CAAA;AACnB,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAGD,IAAA,kBAAA,CAAmB,CAAA,IAAA,KAAQ;AACzB,MAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,MAAA,IAAA,CAAK,QAAQ,CAAA,aAAA,KAAiB;AAC5B,QAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,UAAA,WAAA,CAAY,IAAI,aAAa,CAAA;AAAA,QAC/B,CAAA,MAAA,IAAW,gBAAgB,KAAA,EAAO;AAChC,UAAA,WAAA,CAAY,GAAA,CAAI,gBAAgB,CAAC,CAAA;AAAA,QACnC;AAAA,MACF,CAAC,CAAA;AACD,MAAA,OAAO,WAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,UAAA,GAAaA,kBAAAA,CAAY,CAAC,KAAA,EAAe,OAAA,KAAkC;AAC/E,IAAA,QAAA,CAAS,CAAA,IAAA,KAAQ;AACf,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,IAAI,CAAA;AACzB,MAAA,QAAA,CAAS,KAAK,IAAI,OAAO,OAAA,KAAY,aAChC,OAAA,CAA2B,QAAA,CAAS,KAAK,CAAC,CAAA,GAC3C,OAAA;AACJ,MAAA,QAAA,GAAW,QAAQ,CAAA;AACnB,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,QAAA,GAAWA,kBAAAA,CAAY,CAAC,SAAA,EAAmB,OAAA,KAAoB;AACnE,IAAA,QAAA,CAAS,CAAA,IAAA,KAAQ;AACf,MAAA,MAAM,QAAA,GAAW,CAAC,GAAG,IAAI,CAAA;AACzB,MAAA,MAAM,CAAC,SAAS,CAAA,GAAI,QAAA,CAAS,MAAA,CAAO,WAAW,CAAC,CAAA;AAChD,MAAA,QAAA,CAAS,MAAA,CAAO,OAAA,EAAS,CAAA,EAAG,SAAS,CAAA;AACrC,MAAA,QAAA,GAAW,QAAQ,CAAA;AACnB,MAAA,OAAO,QAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,UAAA,GAAaA,mBAAY,MAAM;AACnC,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,kBAAA,iBAAmB,IAAI,KAAK,CAAA;AAC5B,IAAA,QAAA,GAAW,EAAE,CAAA;AAAA,EACf,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,UAAA,GAAaA,kBAAAA,CAAY,CAAC,KAAA,KAAkB;AAChD,IAAA,kBAAA,CAAmB,CAAA,IAAA,yBAAY,GAAA,CAAI,CAAC,GAAG,IAAA,EAAM,KAAK,CAAC,CAAC,CAAA;AAAA,EACtD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,kBAAAA,CAAY,CAAC,KAAA,KAAkB;AAClD,IAAA,kBAAA,CAAmB,CAAA,IAAA,KAAQ;AACzB,MAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,IAAI,CAAA;AAChC,MAAA,WAAA,CAAY,OAAO,KAAK,CAAA;AACxB,MAAA,OAAO,WAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,kBAAAA,CAAY,CAAC,KAAA,KAAkB;AACrD,IAAA,kBAAA,CAAmB,CAAA,IAAA,KAAQ;AACzB,MAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,IAAI,CAAA;AAChC,MAAA,IAAI,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG;AAC1B,QAAA,WAAA,CAAY,OAAO,KAAK,CAAA;AAAA,MAC1B,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,IAAI,KAAK,CAAA;AAAA,MACvB;AACA,MAAA,OAAO,WAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBA,mBAAY,MAAM;AACvC,IAAA,kBAAA,iBAAmB,IAAI,KAAK,CAAA;AAAA,EAC9B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,SAAA,GAAYA,mBAAY,MAAM;AAClC,IAAA,kBAAA,CAAmB,IAAI,IAAI,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,KAAU,KAAK,CAAC,CAAC,CAAA;AAAA,EAC5D,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAGV,EAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,CAAC,GAAG,KAAA,KAAU,eAAA,CAAgB,GAAA,CAAI,KAAK,CAAC,CAAA;AAE3E,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,eAAA,EAAiB,KAAA,CAAM,IAAA,CAAK,eAAe,CAAA;AAAA,IAC3C,aAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,cAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA,EAAS,MAAM,MAAA,KAAW,CAAA;AAAA,IAC1B,OAAO,KAAA,CAAM,MAAA;AAAA,IACb,eAAA,EAAiB,QAAA,GAAW,KAAA,CAAM,MAAA,IAAU,QAAA,GAAW;AAAA,GACzD;AACF;AArcA,IAAA,gBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,8BAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC+CO,SAAS,mBAAA,CACd,IAAA,EACA,cAAA,GAAsC,EAAC,EACxB;AACf,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,IAAI,SAAA,GAAY,CAAA;AAGhB,EAAA,MAAM,aAA+D,EAAC;AAGtE,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,QAAQ,CAAA,EAAG;AAC7D,IAAA,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,YAAY,CAAA;AAAA,EAC7C;AAGA,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,WAAW,CAAA,EAAG;AAChE,IAAA,UAAA,CAAW,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,YAAY,CAAA;AAAA,EAC7C;AAGA,EAAA,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,CAAE,KAAA,CAAM,KAAA,IAAS,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,KAAA,IAAS,CAAA,CAAE,CAAA;AAGrE,EAAA,KAAA,MAAW,EAAE,KAAA,EAAO,IAAA,EAAK,IAAK,UAAA,EAAY;AACxC,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AAG7B,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,KAAK,CAAA;AAAA,QACjC,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,GAAA,EAAK;AAAA,OACN,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,YAAA,GAAe,MAAM,CAAC,CAAA;AAC5B,IAAA,MAAM,UAAU,YAAA,IAAgB,cAAA;AAEhC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MACb,IAAA,EAAM,UAAA;AAAA,MACN,KAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,SAAA,GAAY,GAAA;AAAA,EACd;AAGA,EAAA,IAAI,SAAA,GAAY,KAAK,MAAA,EAAQ;AAC3B,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAAA,MAC1B,IAAA,EAAM,OAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,KAAK,IAAA,CAAK;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,2BAAA,CACd,MACA,SAAA,EACQ;AACR,EAAA,IAAI,MAAA,GAAS,IAAA;AAGb,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,iBAAA,CAAkB,QAAA,EAAU,CAAC,OAAO,OAAA,KAAY;AACtE,IAAA,MAAM,KAAA,GAAQ,UAAU,OAAO,CAAA;AAC/B,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AAGD,EAAA,MAAA,GAAS,OAAO,OAAA,CAAQ,iBAAA,CAAkB,WAAA,EAAa,CAAC,OAAO,OAAA,KAAY;AACzE,IAAA,MAAM,QAAQ,SAAA,CAAU,OAAO,CAAA,IAAK,OAAA,CAAQ,IAAI,OAAO,CAAA;AACvD,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,OAAO,OAAO,KAAK,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAsCO,SAAS,yBAAA,CACd,MACA,cAAA,EAC4E;AAC5E,EAAA,MAAM,SAAqF,EAAC;AAC5F,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE7B,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,SAAA,KAAc;AACjC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,iBAAA,CAAkB,QAAQ,CAAA;AACxD,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,YAAA,GAAe,MAAM,CAAC,CAAA;AAC5B,MAAA,IAAI,EAAE,gBAAgB,cAAA,CAAA,EAAiB;AACrC,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,QAAA,EAAU,YAAA;AAAA,UACV,MAAM,SAAA,GAAY,CAAA;AAAA,UAClB,MAAA,EAAA,CAAS,KAAA,CAAM,KAAA,IAAS,CAAA,IAAK,CAAA;AAAA,UAC7B,OAAA,EAAS,uBAAuB,YAAY,CAAA;AAAA,SAC7C,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AA1MA,IAYa,iBAAA;AAZb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AAYO,IAAM,iBAAA,GAAoB;AAAA;AAAA,MAE/B,QAAA,EAAU,yBAAA;AAAA;AAAA,MAEV,WAAA,EAAa,wCAAA;AAAA;AAAA,MAEb,UAAA,EAAY,kBAAA;AAAA;AAAA,MAEZ,WAAA,EAAa;AAAA,KACf;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACyCO,SAAS,kBAAA,CACd,IAAA,EACA,KAAA,GAAgB,OAAA,EACD;AACf,EAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,KAAK,CAAA,IAAK,iBAAiB,OAAO,CAAA;AAGrE,EAAA,MAAM,YAAY,IAAA,CAAK,MAAA;AACvB,EAAkB,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,OAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAE;AAGpE,EAAA,MAAM,iBAAA,GAAoB,YAAY,SAAA,CAAU,oBAAA;AAGhD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,iBAAA,GAAoB,UAAU,gBAAgB,CAAA;AAG3E,EAAA,MAAM,WAAA,GAAc,aAAa,SAAA,CAAU,QAAA;AAG3C,EAAA,MAAM,eAAe,SAAA,CAAU,eAAA,GAC1B,WAAA,GAAc,GAAA,GAAQ,UAAU,eAAA,GACjC,MAAA;AAEJ,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,WAAA;AAAA,IACP,WAAA,EAAa,IAAA;AAAA,IACb,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAwMO,SAAS,mBAAmB,QAAA,EAAiC;AAClE,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,OAAA,CAAS,CAAA;AAEzC,EAAA,IAAI,SAAS,WAAA,EAAa;AACxB,IAAA,KAAA,CAAM,KAAK,aAAa,CAAA;AAAA,EAC1B;AAEA,EAAA,IAAI,SAAS,YAAA,EAAc;AACzB,IAAA,KAAA,CAAM,KAAK,CAAA,EAAA,EAAK,QAAA,CAAS,aAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,EACpD;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,QAAA,CAAS,KAAK,CAAA,CAAA,CAAG,CAAA;AAEhC,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAlTA,IA0BM,gBAAA;AA1BN,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AA0BA,IAAM,gBAAA,GAAmD;AAAA,MACvD,OAAA,EAAS;AAAA,QACP,gBAAA,EAAkB,CAAA;AAAA,QAClB,oBAAA,EAAsB,GAAA;AAAA,QACtB,QAAA,EAAU,EAAA;AAAA,QACV,eAAA,EAAiB;AAAA;AAAA,OACnB;AAAA,MACA,eAAA,EAAiB;AAAA,QACf,gBAAA,EAAkB,CAAA;AAAA,QAClB,oBAAA,EAAsB,GAAA;AAAA,QACtB,QAAA,EAAU,CAAA;AAAA,QACV,eAAA,EAAiB;AAAA;AAAA,OACnB;AAAA,MACA,UAAA,EAAY;AAAA,QACV,gBAAA,EAAkB,GAAA;AAAA,QAClB,oBAAA,EAAsB,IAAA;AAAA,QACtB,QAAA,EAAU,EAAA;AAAA,QACV,eAAA,EAAiB;AAAA;AAAA,OACnB;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,gBAAA,EAAkB,GAAA;AAAA,QAClB,oBAAA,EAAsB,IAAA;AAAA,QACtB,QAAA,EAAU,CAAA;AAAA,QACV,eAAA,EAAiB;AAAA;AAAA,OACnB;AAAA,MACA,QAAA,EAAU;AAAA,QACR,gBAAA,EAAkB,GAAA;AAAA,QAClB,oBAAA,EAAsB,GAAA;AAAA,QACtB,QAAA,EAAU,EAAA;AAAA,QACV,eAAA,EAAiB;AAAA;AAAA;AACnB,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACaO,SAAS,cAAc,IAAA,EAA8B;AAC1D,EAAA,MAAM,SAAA,GAAY,iBAAiB,IAAI,CAAA;AACvC,EAAA,MAAM,OAAA,GAAU,eAAe,IAAI,CAAA;AACnC,EAAA,MAAM,YAAA,GAAe,oBAAoB,IAAI,CAAA;AAC7C,EAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,IAAA,EAAM,SAAA,EAAW,SAAS,YAAY,CAAA;AAG9E,EAAA,MAAM,eAAe,IAAA,CAAK,KAAA;AAAA,IACvB,UAAU,KAAA,GAAQ,GAAA,GAAM,QAAQ,YAAA,GAAe,GAAA,GAAM,aAAa,KAAA,GAAQ;AAAA,GAC7E;AAEA,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,iBAAiB,IAAA,EAAiC;AAChE,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AAEnC,EAAA,MAAM,aAAa,gBAAA,CAAiB,IAAA,CAAK,aAAW,SAAA,CAAU,QAAA,CAAS,OAAO,CAAC,CAAA;AAC/E,EAAA,MAAM,UAAU,aAAA,CAAc,IAAA,CAAK,aAAW,SAAA,CAAU,QAAA,CAAS,OAAO,CAAC,CAAA;AACzE,EAAA,MAAM,iBAAiB,mBAAA,CAAoB,IAAA,CAAK,aAAW,SAAA,CAAU,QAAA,CAAS,OAAO,CAAC,CAAA;AACtF,EAAA,MAAM,cAAc,gBAAA,CAAiB,IAAA,CAAK,aAAW,SAAA,CAAU,QAAA,CAAS,OAAO,CAAC,CAAA;AAGhF,EAAA,MAAM,UAAA,GAAa,gCAAA,CAAiC,IAAA,CAAK,IAAI,CAAA;AAC7D,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,MAAM,EAAE,MAAA,GAAS,CAAA;AAEhD,EAAA,MAAM,oBAAoB,UAAA,IAAc,WAAA;AAGxC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,mBAAmB,KAAA,IAAS,EAAA;AAChC,EAAA,IAAI,YAAY,KAAA,IAAS,EAAA;AACzB,EAAA,IAAI,SAAS,KAAA,IAAS,EAAA;AACtB,EAAA,IAAI,gBAAgB,KAAA,IAAS,EAAA;AAC7B,EAAA,IAAI,aAAa,KAAA,IAAS,EAAA;AAE1B,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,eAAe,IAAA,EAA+B;AAC5D,EAAA,MAAM,SAAA,GAAY,mBAAmB,IAAI,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,KAAK,EAAE,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA;AAG9D,EAAA,MAAM,mBAAA,GAAsB,UAAU,MAAA,CAAO,CAAC,KAAK,QAAA,KAAa,GAAA,GAAM,QAAA,CAAS,MAAA,EAAQ,CAAC,CAAA;AACxF,EAAA,MAAM,oBAAoB,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,mBAAA,GAAsB,UAAU,MAAA,GAAS,CAAA;AAG1F,EAAA,MAAM,qBAAqB,KAAA,CAAM,MAAA;AAAA,IAAO,UACtC,eAAA,CAAgB,IAAA;AAAA,MAAK,eACnB,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,SAAA,CAAU,aAAa;AAAA;AACrD,GACF,CAAE,MAAA;AAGF,EAAA,IAAI,iBAAA,GAAoB,CAAA;AACxB,EAAA,KAAA,MAAW,WAAW,sBAAA,EAAwB;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAClC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,iBAAA,IAAqB,OAAA,CAAQ,MAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,MAAM,oBAAoB,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,iBAAA,GAAoB,UAAU,MAAA,GAAS,CAAA;AAGxF,EAAA,IAAI,YAAA,GAAe,GAAA;AAGnB,EAAA,IAAI,iBAAA,GAAoB,KAAK,YAAA,IAAgB,EAAA;AAAA,OAAA,IACpC,iBAAA,GAAoB,KAAK,YAAA,IAAgB,EAAA;AAGlD,EAAA,MAAM,iBAAiB,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,kBAAA,GAAqB,MAAM,MAAA,GAAS,CAAA;AAC9E,EAAA,IAAI,cAAA,GAAiB,KAAK,YAAA,IAAgB,EAAA;AAAA,OAAA,IACjC,cAAA,GAAiB,MAAM,YAAA,IAAgB,EAAA;AAGhD,EAAA,IAAI,iBAAA,GAAoB,KAAK,YAAA,IAAgB,EAAA;AAAA,OAAA,IACpC,iBAAA,GAAoB,MAAM,YAAA,IAAgB,CAAA;AAEnD,EAAA,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,YAAY,CAAA;AAEvC,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,kBAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,oBAAoB,IAAA,EAAoC;AACtE,EAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AAEnC,EAAA,MAAM,oBAAoB,aAAA,CAAc,IAAA,CAAK,aAAW,SAAA,CAAU,QAAA,CAAS,OAAO,CAAC,CAAA;AACnF,EAAA,MAAM,aAAa,gBAAA,CAAiB,IAAA,CAAK,aAAW,SAAA,CAAU,QAAA,CAAS,OAAO,CAAC,CAAA;AAG/E,EAAA,MAAM,eAAA,GAAkB,0DAAA,CAA2D,IAAA,CAAK,SAAS,CAAA;AAGjG,EAAA,MAAM,cAAc,gBAAA,CAAiB,IAAA,CAAK,aAAW,SAAA,CAAU,QAAA,CAAS,OAAO,CAAC,CAAA;AAGhF,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,mBAAmB,KAAA,IAAS,EAAA;AAChC,EAAA,IAAI,YAAY,KAAA,IAAS,EAAA;AACzB,EAAA,IAAI,iBAAiB,KAAA,IAAS,EAAA;AAC9B,EAAA,IAAI,aAAa,KAAA,IAAS,EAAA;AAE1B,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,UAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,mBAAA,CACd,IAAA,EACA,SAAA,EACA,OAAA,EACA,YAAA,EACoB;AACpB,EAAA,MAAM,cAAkC,EAAC;AACzC,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,OAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA;AAGpE,EAAA,IAAI,CAAC,UAAU,iBAAA,EAAmB;AAChC,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,8BAAA;AAAA,MACT,UAAA,EAAY,qFAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,gCAAA;AAAA,MACT,UAAA,EAAY,6GAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,SAAA,CAAU,UAAA,IAAc,SAAA,GAAY,EAAA,EAAI;AAC3C,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,WAAA;AAAA,MACN,OAAA,EAAS,yBAAA;AAAA,MACT,UAAA,EAAY,+EAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,OAAA,CAAQ,oBAAoB,GAAA,EAAK;AACnC,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,wBAAA;AAAA,MACT,UAAA,EAAY,4DAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,OAAA,CAAQ,qBAAqB,CAAA,EAAG;AAClC,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,mCAAA;AAAA,MACT,UAAA,EAAY,2FAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,OAAA,CAAQ,oBAAoB,GAAA,EAAK;AACnC,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,+BAAA;AAAA,MACT,UAAA,EAAY,wDAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAC,YAAA,CAAa,eAAA,IAAmB,SAAA,GAAY,GAAA,EAAK;AACpD,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,cAAA;AAAA,MACN,OAAA,EAAS,4BAAA;AAAA,MACT,UAAA,EAAY,yFAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,YAAA,CAAa,WAAA,IAAe,SAAA,GAAY,GAAA,EAAK;AAChD,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,cAAA;AAAA,MACN,OAAA,EAAS,0BAAA;AAAA,MACT,UAAA,EAAY,4EAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,YAAY,EAAA,EAAI;AAClB,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,cAAA;AAAA,MACN,OAAA,EAAS,sBAAA;AAAA,MACT,UAAA,EAAY,kEAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,YAAY,GAAA,EAAK;AAC1B,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS,qBAAA;AAAA,MACT,UAAA,EAAY,sFAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,kBAAA,GAAqB,iDAAA,CAAkD,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA;AACpG,EAAA,IAAI,CAAC,kBAAA,IAAsB,SAAA,GAAY,EAAA,EAAI;AACzC,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,+BAAA;AAAA,MACT,UAAA,EAAY,kFAAA;AAAA,MACZ,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAChC,IAAA,MAAM,gBAAgB,EAAE,IAAA,EAAM,GAAG,MAAA,EAAQ,CAAA,EAAG,KAAK,CAAA,EAAE;AACnD,IAAA,OAAO,cAAc,CAAA,CAAE,QAAQ,CAAA,GAAI,aAAA,CAAc,EAAE,QAAQ,CAAA;AAAA,EAC7D,CAAC,CAAA;AACH;AAKA,SAAS,mBAAmB,IAAA,EAAwB;AAElD,EAAA,OAAO,IAAA,CACJ,KAAA,CAAM,QAAQ,CAAA,CACd,IAAI,CAAA,QAAA,KAAY,QAAA,CAAS,IAAA,EAAM,CAAA,CAC/B,MAAA,CAAO,CAAA,QAAA,KAAY,QAAA,CAAS,SAAS,CAAC,CAAA;AAC3C;AArVA,IAkBM,eAAA,EAUA,sBAAA,EASA,aAAA,EASA,gBAAA,EAQA,mBAAA,EAQA,gBAAA;AA9DN,IAAA,mBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,iCAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AAkBA,IAAM,eAAA,GAAkB;AAAA,MACtB,MAAA;AAAA,MAAQ,SAAA;AAAA,MAAW,MAAA;AAAA,MAAQ,KAAA;AAAA,MAAO,OAAA;AAAA,MAAS,WAAA;AAAA,MAAa,SAAA;AAAA,MACxD,UAAA;AAAA,MAAY,OAAA;AAAA,MAAS,OAAA;AAAA,MAAS,OAAA;AAAA,MAAS,QAAA;AAAA,MAAU,OAAA;AAAA,MACjD,MAAA;AAAA,MAAQ,KAAA;AAAA,MAAO,MAAA;AAAA,MAAQ,aAAA;AAAA,MAAe,UAAA;AAAA,MAAY,YAAA;AAAA,MAClD,SAAA;AAAA,MAAW,QAAA;AAAA,MAAU,WAAA;AAAA,MAAa,UAAA;AAAA,MAAY;AAAA,KAChD;AAKA,IAAM,sBAAA,GAAyB;AAAA,MAC7B,4CAAA;AAAA,MACA,4CAAA;AAAA,MACA;AAAA,KACF;AAKA,IAAM,aAAA,GAAgB;AAAA,MACpB,MAAA;AAAA,MAAQ,WAAA;AAAA,MAAa,MAAA;AAAA,MAAQ,SAAA;AAAA,MAAW,SAAA;AAAA,MAAW,KAAA;AAAA,MACnD,QAAA;AAAA,MAAU,UAAA;AAAA,MAAY,OAAA;AAAA,MAAS,SAAA;AAAA,MAAW,WAAA;AAAA,MAAa,SAAA;AAAA,MACvD,SAAA;AAAA,MAAW,QAAA;AAAA,MAAU,WAAA;AAAA,MAAa,OAAA;AAAA,MAAS,MAAA;AAAA,MAAQ;AAAA,KACrD;AAKA,IAAM,gBAAA,GAAmB;AAAA,MACvB,SAAA;AAAA,MAAW,YAAA;AAAA,MAAc,WAAA;AAAA,MAAa,UAAA;AAAA,MAAY,SAAA;AAAA,MAClD,OAAA;AAAA,MAAS,UAAA;AAAA,MAAY,SAAA;AAAA,MAAW,aAAA;AAAA,MAAe;AAAA,KACjD;AAKA,IAAM,mBAAA,GAAsB;AAAA,MAC1B,YAAA;AAAA,MAAc,aAAA;AAAA,MAAe,YAAA;AAAA,MAAc,aAAA;AAAA,MAAe,MAAA;AAAA,MAC1D,MAAA;AAAA,MAAQ,QAAA;AAAA,MAAU,QAAA;AAAA,MAAU,OAAA;AAAA,MAAS,QAAA;AAAA,MAAU,OAAA;AAAA,MAAS;AAAA,KAC1D;AAKA,IAAM,gBAAA,GAAmB;AAAA,MACvB,SAAA;AAAA,MAAW,QAAA;AAAA,MAAU,UAAA;AAAA,MAAY,cAAA;AAAA,MAAgB,eAAA;AAAA,MACjD,aAAA;AAAA,MAAe,SAAA;AAAA,MAAW,MAAA;AAAA,MAAQ,WAAA;AAAA,MAAa;AAAA,KACjD;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACHO,SAAS,cAAA,CACd,IAAA,EACA,cAAA,GAAsC,EAAC,EACxB;AACf,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAA,MAAM,kBAAyD,EAAC;AAGhE,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,EAAe,GAAA,KAAyB;AAC1D,IAAA,OAAO,eAAA,CAAgB,IAAA;AAAA,MAAK,WACzB,KAAA,IAAS,KAAA,CAAM,KAAA,IAAS,KAAA,GAAQ,MAAM,GAAA,IACtC,GAAA,GAAM,KAAA,CAAM,KAAA,IAAS,OAAO,KAAA,CAAM,GAAA,IAClC,SAAS,KAAA,CAAM,KAAA,IAAS,OAAO,KAAA,CAAM;AAAA,KACxC;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,QAAA,GAAW,CAAC,KAAA,EAAyB,IAAA,EAA2B,OAAA,KAAsB;AAC1F,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,CAAA;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA;AAE7B,IAAA,IAAI,CAAC,UAAA,CAAW,KAAA,EAAO,GAAG,CAAA,EAAG;AAC3B,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,QACb,IAAA;AAAA,QACA,KAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,eAAA,CAAgB,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA;AAAA,IACrC;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,IAAA,EAAM,cAAc,CAAA;AAC/D,EAAA,cAAA,CAAe,QAAQ,CAAA,KAAA,KAAS;AAC9B,IAAA,IAAI,KAAA,CAAM,SAAS,UAAA,EAAY;AAC7B,MAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AACjB,MAAA,eAAA,CAAgB,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,CAAM,OAAO,GAAA,EAAK,KAAA,CAAM,KAAK,CAAA;AAAA,IAC7D;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC5D,IAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,EACxB;AAGA,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,GAAG,CAAA,EAAG;AACtD,IAAA,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,EACvB;AAGA,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC3D,IAAA,QAAA,CAAS,OAAO,MAAM,CAAA;AAAA,EACxB;AAGA,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,KAAK,CAAA,EAAG;AACxD,IAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AAAA,EAC1B;AAGA,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC3D,IAAA,QAAA,CAAS,OAAO,SAAS,CAAA;AAAA,EAC3B;AAGA,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,MAAM,CAAA,EAAG;AACzD,IAAA,QAAA,CAAS,OAAO,QAAQ,CAAA;AAAA,EAC1B;AAGA,EAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,QAAA,CAAS,eAAA,CAAgB,OAAO,CAAA,EAAG;AAC1D,IAAA,QAAA,CAAS,OAAO,SAAS,CAAA;AAAA,EAC3B;AAGA,EAAA,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAEvC,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,cACd,IAAA,EACA,UAAA,GAAqB,CAAA,EACrB,cAAA,GAAsC,EAAC,EAC/B;AACR,EAAA,MAAM,MAAA,GAAS,cAAA,CAAe,IAAA,EAAM,cAAc,CAAA;AAElD,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAE1B,IAAA,IAAI,KAAA,CAAM,QAAQ,OAAA,EAAS;AACzB,MAAA,MAAA,IAAU,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA;AAAA,IAC3C;AAGA,IAAA,MAAA,IAAU,gBAAgB,KAAK,CAAA;AAE/B,IAAA,OAAA,GAAU,KAAA,CAAM,GAAA;AAAA,EAClB;AAGA,EAAA,IAAI,OAAA,GAAU,KAAK,MAAA,EAAQ;AACzB,IAAA,MAAA,IAAU,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,gBAAgB,KAAA,EAA4B;AACnD,EAAA,IAAI,KAAA;AAEJ,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,UAAA;AACH,MAAA,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,aAAA,CAAc,QAAA,GAAW,aAAA,CAAc,eAAA;AAC/D,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,KAAA,GAAQ,aAAA,CAAc,OAAA;AACtB,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,KAAA,GAAQ,aAAA,CAAc,MAAA;AACtB,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,KAAA,GAAQ,aAAA,CAAc,OAAA;AACtB,MAAA;AAAA,IACF,KAAK,KAAA;AACH,MAAA,KAAA,GAAQ,aAAA,CAAc,GAAA;AACtB,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,KAAA,GAAQ,aAAA,CAAc,IAAA;AACtB,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,KAAA,GAAQ,aAAA,CAAc,IAAA;AACtB,MAAA;AAAA,IACF;AACE,MAAA,KAAA,GAAQ,aAAA,CAAc,KAAA;AAAA;AAI1B,EAAA,MAAM,SAAA,GAAY,UAAU,KAAK,CAAA;AACjC,EAAA,OAAO,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,EAAI,KAAA,CAAM,IAAI,CAAA,QAAA,CAAA;AACxC;AAKA,SAAS,UAAU,GAAA,EAAqB;AAEtC,EAAA,MAAM,QAAA,GAAmC;AAAA,IACvC,SAAA,EAAW,IAAA;AAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA;AAAA,IACX,SAAA,EAAW,IAAA;AAAA;AAAA,IACX,SAAA,EAAW;AAAA;AAAA,GACb;AAEA,EAAA,OAAO,QAAA,CAAS,GAAG,CAAA,IAAK,IAAA;AAC1B;AAlPA,IAcM,eAAA,EA2BO,aAAA;AAzCb,IAAA,sBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,oCAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AASA,IAAA,sBAAA,EAAA;AAKA,IAAM,eAAA,GAAkB;AAAA;AAAA,MAEtB,SAAA,EAAW,yBAAA;AAAA;AAAA,MAEX,GAAA,EAAK,sBAAA;AAAA;AAAA,MAEL,QAAA,EAAU,yCAAA;AAAA;AAAA,MAEV,KAAA,EAAO,sDAAA;AAAA;AAAA,MAEP,MAAA,EAAQ,oBAAA;AAAA;AAAA,MAER,QAAA,EAAU,0HAAA;AAAA;AAAA,MAEV,IAAA,EAAM,kBAAA;AAAA,MACN,MAAA,EAAQ,cAAA;AAAA;AAAA,MAER,IAAA,EAAM,eAAA;AAAA;AAAA,MAEN,MAAA,EAAQ,WAAA;AAAA;AAAA,MAER,OAAA,EAAS;AAAA,KACX;AAKO,IAAM,aAAA,GAAgB;AAAA,MAC3B,QAAA,EAAU,SAAA;AAAA;AAAA,MACV,eAAA,EAAiB,SAAA;AAAA;AAAA,MACjB,OAAA,EAAS,SAAA;AAAA;AAAA,MACT,MAAA,EAAQ,SAAA;AAAA;AAAA,MACR,OAAA,EAAS,SAAA;AAAA;AAAA,MACT,GAAA,EAAK,SAAA;AAAA;AAAA,MACL,IAAA,EAAM,SAAA;AAAA;AAAA,MACN,IAAA,EAAM,SAAA;AAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA;AAAA,MACN,MAAA,EAAQ,SAAA;AAAA;AAAA,MACR,MAAA,EAAQ,SAAA;AAAA;AAAA,MACR,IAAA,EAAM,SAAA;AAAA;AAAA,MACN,KAAA,EAAO;AAAA;AAAA,KACT;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACzDA,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,YAAA,EAAA,MAAAqB,oBAAA;AAAA,EAAA,kBAAA,EAAA,MAAAC,0BAAA;AAAA,EAAA,OAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAwmBA,SAASC,oBAAAA,CAAoB,MAAc,cAAA,EAAgC;AACzE,EAAA,OAAO,IAAA,CAAK,MAAM,CAAA,EAAG,cAAc,EAAE,KAAA,CAAM,IAAI,EAAE,MAAA,GAAS,CAAA;AAC5D;AAEA,SAAS,qBAAA,CAAsB,MAAc,cAAA,EAAgC;AAC3E,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA;AACjD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,CAAM,IAAI,CAAA;AACrC,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA;AACjC;AAEA,SAASC,qBAAAA,CAAqB,MAAc,cAAA,EAAgC;AAC1E,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA;AACjD,EAAA,MAAM,gBAAA,GAAmB,YAAA,CAAa,WAAA,CAAY,IAAI,CAAA;AACtD,EAAA,OAAO,gBAAA,KAAqB,EAAA,GAAK,CAAA,GAAI,gBAAA,GAAmB,CAAA;AAC1D;AAEA,SAASC,mBAAAA,CAAmB,MAAc,cAAA,EAAgC;AACxE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA;AAC7C,EAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAA;AACjD,EAAA,OAAO,gBAAA,KAAqB,EAAA,GAAK,IAAA,CAAK,MAAA,GAAS,cAAA,GAAiB,gBAAA;AAClE;AAEA,SAAS,yBAAA,CAA0B,IAAA,EAAc,SAAA,EAAmB,WAAA,EAA6B;AAC/F,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,aAAa,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACtD,IAAA,QAAA,IAAY,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,EAChC;AAEA,EAAA,IAAI,SAAA,GAAY,MAAM,MAAA,EAAQ;AAC5B,IAAA,QAAA,IAAY,KAAK,GAAA,CAAI,WAAA,EAAa,KAAA,CAAM,SAAS,EAAE,MAAM,CAAA;AAAA,EAC3D;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,gBAAgB,QAAA,EAAkC;AACzD,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,uBAAA,EAA0B,SAAS,YAAY,CAAA,IAAA,CAAA;AAAA,IAC/C,EAAA;AAAA,IACA,CAAA,oBAAA,EAAuB,QAAA,CAAS,SAAA,CAAU,KAAK,CAAA,MAAA,CAAA;AAAA,IAC/C,CAAA,wBAAA,EAAsB,QAAA,CAAS,SAAA,CAAU,iBAAA,GAAoB,QAAQ,IAAI,CAAA,CAAA;AAAA,IACzE,CAAA,oBAAA,EAAkB,QAAA,CAAS,SAAA,CAAU,UAAA,GAAa,QAAQ,IAAI,CAAA,CAAA;AAAA,IAC9D,CAAA,4BAAA,EAA0B,QAAA,CAAS,SAAA,CAAU,OAAA,GAAU,QAAQ,IAAI,CAAA,CAAA;AAAA,IACnE,CAAA,wBAAA,EAAsB,QAAA,CAAS,SAAA,CAAU,cAAA,GAAiB,QAAQ,IAAI,CAAA,CAAA;AAAA,IACtE,CAAA,qBAAA,EAAmB,QAAA,CAAS,SAAA,CAAU,WAAA,GAAc,QAAQ,IAAI,CAAA,CAAA;AAAA,IAChE,EAAA;AAAA,IACA,CAAA,kBAAA,EAAqB,QAAA,CAAS,OAAA,CAAQ,YAAY,CAAA,MAAA,CAAA;AAAA,IAClD,mCAA8B,IAAA,CAAK,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,iBAAiB,CAAC,CAAA,WAAA,CAAA;AAAA,IAC5E,CAAA,wBAAA,EAAsB,QAAA,CAAS,OAAA,CAAQ,kBAAkB,CAAA,CAAA;AAAA,IACzD,+BAA0B,IAAA,CAAK,KAAA,CAAM,SAAS,OAAA,CAAQ,iBAAA,GAAoB,GAAG,CAAC,CAAA,CAAA,CAAA;AAAA,IAC9E,EAAA;AAAA,IACA,CAAA,uBAAA,EAA0B,QAAA,CAAS,YAAA,CAAa,KAAK,CAAA,MAAA,CAAA;AAAA,IACrD,CAAA,wBAAA,EAAsB,QAAA,CAAS,YAAA,CAAa,iBAAA,GAAoB,QAAQ,IAAI,CAAA,CAAA;AAAA,IAC5E,CAAA,yBAAA,EAAuB,QAAA,CAAS,YAAA,CAAa,UAAA,GAAa,QAAQ,IAAI,CAAA,CAAA;AAAA,IACtE,CAAA,sBAAA,EAAoB,QAAA,CAAS,YAAA,CAAa,eAAA,GAAkB,QAAQ,IAAI,CAAA,CAAA;AAAA,IACxE,CAAA,iBAAA,EAAe,QAAA,CAAS,YAAA,CAAa,WAAA,GAAc,QAAQ,IAAI,CAAA;AAAA,GACjE;AAEA,EAAA,IAAI,QAAA,CAAS,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACnC,IAAA,KAAA,CAAM,IAAA,CAAK,IAAI,2BAA2B,CAAA;AAC1C,IAAA,QAAA,CAAS,WAAA,CAAY,MAAM,CAAA,EAAG,CAAC,EAAE,OAAA,CAAQ,CAAC,YAAY,KAAA,KAAU;AAC9D,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAA,GAAA,EAAM,UAAA,CAAW,QAAA,CAAS,WAAA,EAAa,CAAA,EAAA,EAAK,UAAA,CAAW,OAAO,CAAA,CAAE,CAAA;AACvF,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,UAAA,CAAW,UAAU,CAAA,CAAE,CAAA;AAAA,IAC1C,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,gBAAA,CACP,mBACA,MAAA,EACQ;AACR,EAAA,MAAM,QAAQ,EAAC;AAGf,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,IAAA,CAAK,iBAAiB,CAAA;AAClD,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,KAAA,CAAM,KAAK,qBAAqB,CAAA;AAChC,IAAA,YAAA,CAAa,QAAQ,CAAA,OAAA,KAAW;AAC9B,MAAA,MAAM,KAAA,GAAQ,kBAAkB,OAAO,CAAA;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAK,OAAO,CAAA,EAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA,EAAA,EAAK,OAAO,KAAK,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/D,CAAC,CAAA;AAAA,EACH,CAAA,MAAO;AACL,IAAA,KAAA,CAAM,KAAK,gCAAgC,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,IAAI,kBAAkB,CAAA;AACjC,IAAA,MAAA,CAAO,QAAQ,CAAA,KAAA,KAAS;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAU,KAAA,CAAM,IAAI,CAAA,SAAA,EAAY,MAAM,MAAM,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC7E,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,CAAM,IAAA,CAAK,IAAI,kBAAkB,CAAA;AACjC,EAAA,KAAA,CAAM,KAAK,kCAA6B,CAAA;AACxC,EAAA,KAAA,CAAM,KAAK,oCAA+B,CAAA;AAC1C,EAAA,KAAA,CAAM,KAAK,qDAAgD,CAAA;AAE3D,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,WAAA,GAAsB;AAC7B,EAAA,OAAO;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,4BAAA,EAiCgB,GAAG,CAAA;AAAA;;AAAA;AAAA;AAAA,EAAA,CAAA,CAKxB,IAAA,EAAK;AACT;AAzvBA,IAmCM,oBAAA,CAAA,CA8gBOJ,+BAeAC,mCAAA,CAAA,KA2LN;AA3vBP,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,+BAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AASA,IAAA,WAAA,EAAA;AACA,IAAA,UAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,WAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AACA,IAAA,gBAAA,EAAA;AASA,IAAA,sBAAA,EAAA;AAKA,IAAA,mBAAA,EAAA;AACA,IAAA,mBAAA,EAAA;AACA,IAAA,sBAAA,EAAA;AAKA,IAAM,uBAAoD,CAAC;AAAA,MACzD,YAAA,GAAe,EAAA;AAAA,MACf,QAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA,GAAW,IAAA;AAAA,MACX,wBAAA,GAA2B,KAAA;AAAA,MAC3B,SAAA,GAAY,GAAA;AAAA,MACZ,oBAAoB,EAAC;AAAA,MACrB,WAAA,GAAc,KAAA;AAAA,MACd,cAAA,GAAiB,IAAA;AAAA,MACjB,WAAA,GAAc,OAAA;AAAA,MACd,YAAA,GAAe,KAAA;AAAA,MACf;AAAA,KACF,KAAM;AACJ,MAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAI/B,qBAAA,EAAc;AAG5C,MAAA,MAAM;AAAA,QACJ,KAAA,EAAO,IAAA;AAAA,QACP,QAAA,EAAU,OAAA;AAAA,QACV;AAAA,OACF,GAAI,YAAY,YAAA,EAAc;AAAA,QAC5B,QAAA,EAAU,CAAC,KAAA,KAAkB;AAC3B,UAAA,IAAI,KAAA,CAAM,SAAS,SAAA,EAAW;AAC5B,YAAA,OAAO,CAAA,iBAAA,EAAoB,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,YAAA,CAAA;AAAA,UACtD;AACA,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,OACD,CAAA;AAED,MAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIM,eAAAA,CAAS,aAAa,MAAM,CAAA;AACxE,MAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,gBAAS,KAAK,CAAA;AACpD,MAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAC5D,MAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIA,gBAAS,CAAC,CAAA;AACpD,MAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAC1D,MAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAC5D,MAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,gBAAS,KAAK,CAAA;AAG9D,MAAA,MAAM,aAAA,GAAgBqB,eAAQ,MAAM;AAClC,QAAA,IAAI,CAAC,gBAAgB,OAAO,MAAA;AAC5B,QAAA,OAAO,kBAAA,CAAmB,MAAM,WAAW,CAAA;AAAA,MAC7C,CAAA,EAAG,CAAC,IAAA,EAAM,WAAA,EAAa,cAAc,CAAC,CAAA;AAEtC,MAAA,MAAM,cAAA,GAAiBA,eAAQ,MAAM;AACnC,QAAA,IAAI,CAAC,cAAc,OAAO,MAAA;AAC1B,QAAA,OAAO,cAAc,IAAI,CAAA;AAAA,MAC3B,CAAA,EAAG,CAAC,IAAA,EAAM,YAAY,CAAC,CAAA;AAEvB,MAAA,MAAM,WAAA,GAAcA,eAAQ,MAAM;AAChC,QAAA,IAAI,CAAC,aAAa,OAAO,MAAA;AACzB,QAAA,OAAO,2BAAA,CAA4B,MAAM,iBAAiB,CAAA;AAAA,MAC5D,CAAA,EAAG,CAAC,IAAA,EAAM,iBAAA,EAAmB,WAAW,CAAC,CAAA;AAEzC,MAAA,MAAM,sBAAA,GAAyBA,eAAQ,MAAM;AAC3C,QAAA,OAAO,yBAAA,CAA0B,MAAM,iBAAiB,CAAA;AAAA,MAC1D,CAAA,EAAG,CAAC,IAAA,EAAM,iBAAiB,CAAC,CAAA;AAG5B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAG7B,MAAA,MAAM,SAAA,GAAY,CAAA;AAClB,MAAA,MAAM,SAAA,GAAY,WAAW,MAAA,GAAS,CAAA;AACtC,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,QAAQ,SAAS,CAAA;AACtD,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,SAAS,CAAA;AACtD,MAAoB,WAAW,KAAA,GAAQ;AACvC,MAAA,MAAM,gBAAA,GAAmBK,oBAAAA,CAAoB,IAAA,EAAM,cAAc,CAAA;AACjE,MAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,IAAA,EAAM,cAAc,CAAA;AAGrE,MAAAxB,iBAAU,MAAM;AAEd,QAAA,IAAI,mBAAmB,aAAA,EAAe;AACpC,UAAA,gBAAA,CAAiB,gBAAgB,CAAA;AAAA,QACnC,CAAA,MAAA,IAAW,gBAAA,IAAoB,aAAA,GAAgB,YAAA,EAAc;AAC3D,UAAA,gBAAA,CAAiB,gBAAA,GAAmB,eAAe,CAAC,CAAA;AAAA,QACtD;AAAA,MACF,CAAA,EAAG,CAAC,gBAAA,EAAkB,aAAA,EAAe,YAAY,CAAC,CAAA;AAGlD,MAAA,MAAM,UAAA,GAAaC,kBAAAA,CAAY,CAAC,YAAA,KAAyB;AACvD,QAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA,GAAI,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA;AACxF,QAAA,OAAA,CAAQ,OAAO,CAAA;AACf,QAAA,iBAAA,CAAkB,cAAA,GAAiB,aAAa,MAAM,CAAA;AAAA,MACxD,CAAA,EAAG,CAAC,IAAA,EAAM,cAAA,EAAgB,OAAO,CAAC,CAAA;AAGlC,MAAA,MAAM,UAAA,GAAaA,kBAAAA,CAAY,CAAC,WAAA,EAAqB,YAAoC,UAAA,KAAe;AACtG,QAAA,IAAI,QAAA;AACJ,QAAA,IAAI,MAAA;AAEJ,QAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,UAAA,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,cAAA,GAAiB,WAAW,CAAA;AACnD,UAAA,MAAA,GAAS,cAAA;AACT,UAAA,iBAAA,CAAkB,QAAQ,CAAA;AAAA,QAC5B,CAAA,MAAO;AACL,UAAA,QAAA,GAAW,cAAA;AACX,UAAA,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,iBAAiB,WAAW,CAAA;AAAA,QAC7D;AAEA,QAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,CAAA,EAAG,QAAQ,CAAA,GAAI,IAAA,CAAK,MAAM,MAAM,CAAA;AAC3D,QAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,MACjB,CAAA,EAAG,CAAC,IAAA,EAAM,cAAA,EAAgB,OAAO,CAAC,CAAA;AAGlC,MAAA,MAAM,UAAA,GAAaA,kBAAAA,CAAY,CAAC,WAAA,KAAwB;AACtD,QAAA,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,IAAI,IAAA,CAAK,MAAA,EAAQ,WAAW,CAAC,CAAC,CAAA;AAAA,MACnE,CAAA,EAAG,CAAC,IAAA,CAAK,MAAM,CAAC,CAAA;AAEhB,MAAA,MAAM,iBAAA,GAAoBA,kBAAAA,CAAY,CAAC,UAAA,KAAuB;AAC5D,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,gBAAA,GAAmB,UAAU,CAAC,CAAA;AACxF,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,UAAU,CAAA,EAAG,MAAA,IAAU,CAAA;AACtD,QAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAoB,gBAAgB,CAAA;AAElE,QAAA,MAAM,WAAA,GAAc,yBAAA,CAA0B,IAAA,EAAM,UAAA,EAAY,YAAY,CAAA;AAC5E,QAAA,UAAA,CAAW,WAAW,CAAA;AAAA,MACxB,GAAG,CAAC,IAAA,EAAM,OAAO,gBAAA,EAAkB,kBAAA,EAAoB,UAAU,CAAC,CAAA;AAGlE,MAAA,WAAA,CAAY;AAAA,QACV,KAAA,EAAO,CAAC,KAAA,KAAU;AAEhB,UAAA,IAAI,eAAe,eAAA,EAAiB;AAEpC,UAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAI,GAAI,KAAA;AAGxC,UAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,YAAA,IAAI,IAAA,CAAK,MAAK,EAAG;AACf,cAAA,QAAA,CAAS,IAAI,CAAA;AAAA,YACf;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,YAAA,UAAA,CAAW,IAAI,CAAA;AACf,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,YAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,cAAA,UAAA,CAAW,GAAG,UAAU,CAAA;AAAA,YAC1B;AACA,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,YAAA,IAAI,cAAA,GAAiB,KAAK,MAAA,EAAQ;AAChC,cAAA,UAAA,CAAW,GAAG,SAAS,CAAA;AAAA,YACzB;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,YAAA,UAAA,CAAW,iBAAiB,CAAC,CAAA;AAC7B,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,YAAA,UAAA,CAAW,iBAAiB,CAAC,CAAA;AAC7B,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,YAAA,iBAAA,CAAkB,EAAE,CAAA;AACpB,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,YAAA,iBAAA,CAAkB,CAAC,CAAA;AACnB,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,YAAA,MAAM,SAAA,GAAYwB,qBAAAA,CAAqB,IAAA,EAAM,cAAc,CAAA;AAC3D,YAAA,UAAA,CAAW,SAAS,CAAA;AACpB,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,YAAA,MAAM,OAAA,GAAUC,mBAAAA,CAAmB,IAAA,EAAM,cAAc,CAAA;AACvD,YAAA,UAAA,CAAW,OAAO,CAAA;AAClB,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,YAAA,iBAAA,CAAkB,CAAC,YAAY,CAAA;AAC/B,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,YAAA,iBAAA,CAAkB,YAAY,CAAA;AAC9B,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,QAAQ,GAAA;AAAK,cACX,KAAK,GAAA;AACH,gBAAA,UAAA,CAAW,KAAK,MAAM,CAAA;AACtB,gBAAA;AAAA,cACF,KAAK,MAAA;AACH,gBAAA,UAAA,CAAW,CAAC,CAAA;AACZ,gBAAA;AAAA,cACF,KAAK,KAAA;AACH,gBAAA,UAAA,CAAW,KAAK,MAAM,CAAA;AACtB,gBAAA;AAAA,cACF,KAAK,GAAA;AACH,gBAAA,UAAA,CAAW,IAAI,CAAA;AACf,gBAAA;AAAA,cACF,KAAK,GAAA;AACH,gBAAA;AAAA,cACF,KAAK,GAAA;AACH,gBAAA;AAAA;AACJ,UACF;AAGA,UAAA,IAAI,CAAC,QAAQ,CAAC,IAAA,IAAQ,CAAC,GAAA,IAAO,GAAA,KAAQ,aAClC,CAAC;AAAA,YAAC,QAAA;AAAA,YAAU,QAAA;AAAA,YAAU,KAAA;AAAA,YAAO,WAAA;AAAA,YAAa,QAAA;AAAA,YAAU,SAAA;AAAA,YAClD,WAAA;AAAA,YAAa,WAAA;AAAA,YAAa,YAAA;AAAA,YAAc,QAAA;AAAA,YAAU,UAAA;AAAA,YAClD,MAAA;AAAA,YAAQ;AAAA,WAAK,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AAClC,YAAA,UAAA,CAAW,GAAG,CAAA;AACd,YAAA;AAAA,UACF;AAAA,QACF;AAAA,OACD,CAAA;AAGD,MAAA,WAAA,CAAY;AAAA,QACV,QAAA,EAAU;AAAA,UACR;AAAA,YACE,GAAA,EAAK,QAAA;AAAA,YACL,SAAS,MAAM;AACb,cAAA,IAAI,WAAA,IAAe,cAAA,IAAkB,eAAA,IAAmB,gBAAA,EAAkB;AACxE,gBAAA,cAAA,CAAe,KAAK,CAAA;AACpB,gBAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,gBAAA,kBAAA,CAAmB,KAAK,CAAA;AACxB,gBAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,cAC3B,WAAW,OAAA,EAAS;AAClB,gBAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,cACzB,CAAA,MAAO;AACL,gBAAA,QAAA,EAAS;AAAA,cACX;AAAA,YACF;AAAA,WACF;AAAA,UACA;AAAA,YACE,GAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,MAAM,cAAA,CAAe,IAAI;AAAA,WACpC;AAAA,UACA;AAAA,YACE,GAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,MAAM,WAAA,IAAe,iBAAA,CAAkB,CAAC,cAAc;AAAA,WACjE;AAAA,UACA;AAAA,YACE,GAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,MAAM,YAAA,IAAgB,kBAAA,CAAmB,CAAC,eAAe;AAAA,WACpE;AAAA,UACA;AAAA,YACE,GAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,MAAM,mBAAA,CAAoB,CAAC,gBAAgB;AAAA,WACtD;AAAA,UACA;AAAA,YACE,GAAA,EAAK,QAAA;AAAA,YACL,SAAS,MAAM;AACb,cAAA,IAAI,IAAA,CAAK,MAAK,EAAG;AACf,gBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,cACf;AAAA,YACF;AAAA;AACF;AACF,OACD,CAAA;AAGD,MAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,CAAM,aAAA,EAAe,gBAAgB,YAAY,CAAA;AAG5E,MAAA,OAAO,YAAA,CAAa,SAAS,SAAA,IAAa,aAAA,GAAgB,aAAa,MAAA,GAAS,KAAA,CAAM,SAAS,SAAA,EAAW;AACxG,QAAA,YAAA,CAAa,KAAK,EAAE,CAAA;AAAA,MACtB;AAEA,MAAA,MAAM,eAAA,GAAkB,KAAK,GAAA,CAAI,MAAA,CAAO,MAAM,MAAM,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,CAAC,CAAA;AAEnE,MAAA,uBACEhC,eAAAA,CAAA0B,mBAAAA,EAAA,EAEE,QAAA,EAAA;AAAA,wBAAA1B,eAAAA;AAAA,UAACC,OAAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAc,QAAA;AAAA,YACd,YAAA,EAAc,CAAA;AAAA,YACd,QAAA,EAAU,CAAA;AAAA,YACV,QAAA,EAAU,CAAA;AAAA,YACV,WAAA,EAAY,OAAA;AAAA,YACZ,aAAa,KAAA,CAAM,OAAA;AAAA,YAEnB,QAAA,EAAA;AAAA,8BAAAD,gBAACC,OAAAA,EAAA,EAAI,cAAA,EAAe,eAAA,EAAgB,cAAc,CAAA,EAChD,QAAA,EAAA;AAAA,gCAAAD,gBAACC,OAAAA,EAAA,EAAI,aAAA,EAAc,KAAA,EAAM,KAAK,CAAA,EAC5B,QAAA,EAAA;AAAA,kCAAAE,cAAAA,CAACD,UAAA,EAAK,KAAA,EAAO,MAAM,OAAA,EAAS,IAAA,EAAI,MAAC,QAAA,EAAA,yBAAA,EAAgB,CAAA;AAAA,kCACjDF,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAChB,QAAA,EAAA;AAAA,oBAAA,gBAAA,GAAmB,CAAA;AAAA,oBAAE,GAAA;AAAA,oBAAE,kBAAA,GAAqB;AAAA,mBAAA,EAC/C;AAAA,iBAAA,EACF,CAAA;AAAA,gCACAC,eAACF,OAAAA,EAAA,EAAI,eAAc,KAAA,EAAM,GAAA,EAAK,GAC5B,QAAA,kBAAAE,cAAAA,CAACD,UAAA,EAAK,KAAA,EAAO,UAAU,KAAA,CAAM,OAAA,GAAU,MAAM,OAAA,EAC1C,QAAA,EAAA,OAAA,GAAU,gBAAA,GAAc,cAAA,EAC3B,CAAA,EACF;AAAA,eAAA,EACF,CAAA;AAAA,8BAEAF,eAAAA,CAACC,OAAAA,EAAA,EAAI,gBAAe,eAAA,EAClB,QAAA,EAAA;AAAA,gCAAAD,gBAACC,OAAAA,EAAA,EAAI,aAAA,EAAc,KAAA,EAAM,KAAK,CAAA,EAC3B,QAAA,EAAA;AAAA,kBAAA,sBAAA,CAAuB,MAAA,GAAS,qBAC/BD,eAAAA,CAACE,UAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,oBAAA,SAAA;AAAA,oBACrB,sBAAA,CAAuB,MAAA;AAAA,oBAAO,iBAAA;AAAA,oBAAgB,sBAAA,CAAuB,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM;AAAA,mBAAA,EAC7F,CAAA;AAAA,kBAED,aAAA,oBACCC,cAAAA,CAACD,QAAAA,EAAA,EAAK,OAAO,KAAA,CAAM,KAAA,EAChB,QAAA,EAAA,kBAAA,CAAmB,aAAa,CAAA,EACnC,CAAA;AAAA,kBAED,kCACCF,eAAAA,CAACE,QAAAA,EAAA,EAAK,OAAO,cAAA,CAAe,YAAA,IAAgB,EAAA,GAAK,KAAA,CAAM,UACzC,cAAA,CAAe,YAAA,IAAgB,KAAK,KAAA,CAAM,OAAA,GAAU,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,oBAAA,WAAA;AAAA,oBACnE,cAAA,CAAe,YAAA;AAAA,oBAAa;AAAA,mBAAA,EACxC;AAAA,iBAAA,EAEJ,CAAA;AAAA,gCACAF,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAChB,QAAA,EAAA;AAAA,kBAAA,IAAA,CAAK,MAAA;AAAA,kBAAO,GAAA;AAAA,kBAAE,SAAA;AAAA,kBAAU;AAAA,iBAAA,EAC3B;AAAA,eAAA,EACF;AAAA;AAAA;AAAA,SACF;AAAA,wBAGAF,eAAAA;AAAA,UAACC,OAAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAc,QAAA;AAAA,YACd,WAAA,EAAY,QAAA;AAAA,YACZ,WAAA,EAAa,OAAA,GAAU,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,OAAA;AAAA,YAC7C,KAAA,EAAM,MAAA;AAAA,YACN,WAAW,YAAA,GAAe,CAAA;AAAA,YAC1B,QAAA,EAAU,CAAA;AAAA,YACV,eAAA,EAAiB,MAAA;AAAA,YAEhB,QAAA,EAAA;AAAA,cAAA,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU;AACjC,gBAAA,MAAM,kBAAkB,aAAA,GAAgB,KAAA;AACxC,gBAAA,MAAM,gBAAgB,eAAA,KAAoB,gBAAA;AAG1C,gBAAA,IAAI,WAAA,GAAc,IAAA;AAClB,gBAAA,IAAI,UAAA,GAAa,EAAA;AAEjB,gBAAA,IAAI,aAAA,EAAe;AACjB,kBAAA,MAAM,YAAA,GAAe8B,qBAAAA,CAAqB,IAAA,EAAM,cAAc,CAAA;AAC9D,kBAAA,MAAM,oBAAoB,cAAA,GAAiB,YAAA;AAE3C,kBAAA,IAAI,iBAAA,IAAqB,KAAK,MAAA,EAAQ;AACpC,oBAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,iBAAiB,CAAA;AACpD,oBAAA,MAAM,QAAA,GAAW,IAAA,CAAK,iBAAiB,CAAA,IAAK,GAAA;AAC5C,oBAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,iBAAA,GAAoB,CAAC,CAAA;AAEpD,oBAAA,WAAA,GAAc,YAAA,GAAe,WAAA;AAC7B,oBAAA,UAAA,GAAa,QAAA;AAAA,kBACf;AAAA,gBACF;AAEA,gBAAA,uBACE/B,eAAAA,CAACC,OAAAA,EAAA,EAA0B,SAAS,CAAA,EAElC,QAAA,EAAA;AAAA,kCAAAD,eAAAA;AAAA,oBAACE,QAAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAO,aAAA,GAAgB,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,KAAA;AAAA,sBAC7C,KAAA,EAAO,eAAA;AAAA,sBACP,eAAA,EAAiB,gBAAgB,MAAA,GAAY,MAAA;AAAA,sBAE5C,QAAA,EAAA;AAAA,wBAAA,MAAA,CAAO,kBAAkB,CAAC,CAAA,CAAE,QAAA,CAAS,eAAA,GAAkB,GAAG,GAAG,CAAA;AAAA,wBAC7D,gBAAgB,QAAA,GAAM;AAAA;AAAA;AAAA,mBACzB;AAAA,kCAGAF,eAAAA;AAAA,oBAACE,QAAAA;AAAA,oBAAA;AAAA,sBACC,KAAA,EAAO,aAAA,GAAgB,KAAA,CAAM,IAAA,GAAO,KAAA,CAAM,KAAA;AAAA,sBAC1C,eAAA,EAAiB,gBAAgB,MAAA,GAAY,MAAA;AAAA,sBAE5C,QAAA,EAAA;AAAA,wBAAA,wBAAA,GACC,aAAA,CAAc,WAAA,EAAa,CAAA,EAAG,iBAAiB,CAAA,GAC/C,WAAA;AAAA,wBACD,aAAA,oBACCC,cAAAA,CAACD,QAAAA,EAAA,EAAK,SAAO,IAAA,EAAC,eAAA,EAAiB,KAAA,CAAM,OAAA,EAAU,QAAA,EAAA,UAAA,EAAW;AAAA;AAAA;AAAA;AAE9D,iBAAA,EAAA,EAtBQ,eAuBV,CAAA;AAAA,cAEJ,CAAC,CAAA;AAAA,cAGA,aAAa,MAAA,KAAW,CAAA,oBACvBF,eAAAA,CAACC,OAAAA,EAAA,EAAI,cAAA,EAAe,QAAA,EAAS,UAAA,EAAW,QAAA,EAAS,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,YAAY,CAAA,EAAG,eAAc,QAAA,EAChG,QAAA,EAAA;AAAA,gCAAAE,cAAAA,CAACD,UAAA,EAAK,KAAA,EAAO,MAAM,OAAA,EAAS,IAAA,EAAI,MAAC,QAAA,EAAA,wBAAA,EAAiB,CAAA;AAAA,gCAClDC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,OAAO,QAAA,EAAA,kCAAA,EAAgC,CAAA;AAAA,gCAC1DF,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,kBAAA,QAAA;AAAA,kCAAMC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,kBAAO,gBAAA;AAAA,kCAAcC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,kBAAO;AAAA,iBAAA,EAAc;AAAA,eAAA,EAC/I;AAAA;AAAA;AAAA,SAEJ;AAAA,wBAGAF,eAAAA;AAAA,UAACC,OAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA;AAAA,YACX,QAAA,EAAU,CAAA;AAAA,YACV,QAAA,EAAU,CAAA;AAAA,YACV,WAAA,EAAY,QAAA;AAAA,YACZ,aAAa,KAAA,CAAM,KAAA;AAAA,YACnB,cAAA,EAAe,eAAA;AAAA,YAEf,QAAA,EAAA;AAAA,8BAAAD,eAAAA,CAACC,OAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EACjB,QAAA,EAAA;AAAA,gCAAAE,cAAAA,CAACD,UAAA,EAAK,KAAA,EAAO,MAAM,OAAA,EAAS,IAAA,EAAI,MAAC,QAAA,EAAA,aAAA,EAAW,CAAA;AAAA,gCAC5CF,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EACjB,QAAA,EAAA;AAAA,kCAAAC,eAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,QAAA,EAAA,OAAA,EAAK,CAAA;AAAA,kBAAO,iBAAA;AAAA,kCAAUC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,kBAAO,mBAAA;AAAA,kCAAYC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,kBAAO,eAAA;AAAA,kCAAQC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,QAAA,EAAA,KAAA,EAAG,CAAA;AAAA,kBAAO;AAAA,iBAAA,EAChM,CAAA;AAAA,gBAAA,CACE,WAAA,IAAe,iCACfF,eAAAA,CAACE,UAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAChB,QAAA,EAAA;AAAA,kBAAA,WAAA,oBAAeF,eAAAA,CAAA0B,mBAAAA,EAAA,EAAE,QAAA,EAAA;AAAA,oCAAAvB,eAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,oBAAO;AAAA,mBAAA,EAAQ,CAAA;AAAA,kBAC9D,eAAe,YAAA,IAAgB,UAAA;AAAA,kBAC/B,YAAA,oBAAgBF,eAAAA,CAAA0B,mBAAAA,EAAA,EAAE,QAAA,EAAA;AAAA,oCAAAvB,eAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,oBAAO;AAAA,mBAAA,EAAS,CAAA;AAAA,kBAChE,UAAA;AAAA,kCAAMC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,kBAAO,oBAAA;AAAA,kCAAaC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,QAAA,EAAA,IAAA,EAAE,CAAA;AAAA,kBAAO;AAAA,iBAAA,EAChG;AAAA,eAAA,EAEJ,CAAA;AAAA,8BACAF,eAAAA,CAACC,OAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,YAAW,UAAA,EACrC,QAAA,EAAA;AAAA,gCAAAE,eAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,IAAA,EAAI,IAAA,EAC7B,QAAA,EAAA,WAAA,GAAc,gBAAA,GACd,iBAAiB,oBAAA,GACjB,eAAA,GAAkB,oBAAA,GAClB,gBAAA,GAAmB,wBAAiB,sBAAA,EACvC,CAAA;AAAA,gCACAC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,OAAO,QAAA,EAAA,MAAA,EAE1B;AAAA,eAAA,EACF;AAAA;AAAA;AAAA,SACF;AAAA,QAGC,WAAA,IAAe,cAAA,IAAkB,WAAA,oBAChCC,cAAAA;AAAA,UAACY,cAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,kBAAA;AAAA,YACN,OAAA,EAAS,CAAA;;AAAA,EAA0C,WAAW,CAAA,CAAA;AAAA,YAC9D,SAAA,EAAW,cAAA;AAAA,YACX,OAAA,EAAS,MAAM,iBAAA,CAAkB,KAAK,CAAA;AAAA,YACtC,IAAA,EAAK;AAAA;AAAA,SACP;AAAA,QAID,YAAA,IAAgB,eAAA,IAAmB,cAAA,oBAClCZ,cAAAA;AAAA,UAACY,cAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,yBAAA;AAAA,YACN,OAAA,EAAS,gBAAgB,cAAc,CAAA;AAAA,YACvC,SAAA,EAAW,eAAA;AAAA,YACX,OAAA,EAAS,MAAM,kBAAA,CAAmB,KAAK,CAAA;AAAA,YACvC,IAAA,EAAM,cAAA,CAAe,YAAA,IAAgB,EAAA,GAAK,MAAA,GAAS;AAAA;AAAA,SACrD;AAAA,QAID,oCACCZ,cAAAA;AAAA,UAACY,cAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,oBAAA;AAAA,YACN,OAAA,EAAS,gBAAA,CAAiB,iBAAA,EAAmB,sBAAsB,CAAA;AAAA,YACnE,SAAA,EAAW,gBAAA;AAAA,YACX,OAAA,EAAS,MAAM,mBAAA,CAAoB,KAAK,CAAA;AAAA,YACxC,IAAA,EAAM,sBAAA,CAAuB,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY;AAAA;AAAA,SACxD;AAAA,QAID,QAAA,IAAY,+BACXZ,cAAAA;AAAA,UAACY,cAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,oBAAA;AAAA,YACN,SAAS,WAAA,EAAY;AAAA,YACrB,SAAA,EAAW,WAAA;AAAA,YACX,OAAA,EAAS,MAAM,cAAA,CAAe,KAAK,CAAA;AAAA,YACnC,IAAA,EAAK;AAAA;AAAA,SACP;AAAA,wBAIFZ,cAAAA;AAAA,UAACY,cAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,cAAA;AAAA,YACN,OAAA,EAAQ,yEAAA;AAAA,YACR,SAAA,EAAW,eAAA;AAAA,YACX,OAAA,EAAS,MAAM,kBAAA,CAAmB,KAAK,CAAA;AAAA,YACvC,OAAA,EAAS;AAAA,cACP;AAAA,gBACE,KAAA,EAAO,aAAA;AAAA,gBACP,QAAQ,MAAM;AACZ,kBAAA,IAAI,IAAA,CAAK,MAAK,EAAG;AACf,oBAAA,QAAA,CAAS,IAAI,CAAA;AAAA,kBACf,CAAA,MAAO;AACL,oBAAA,QAAA,EAAS;AAAA,kBACX;AAAA,gBACF,CAAA;AAAA,gBACA,OAAA,EAAS,SAAA;AAAA,gBACT,SAAA,EAAW;AAAA,eACb;AAAA,cACA;AAAA,gBACE,KAAA,EAAO,qBAAA;AAAA,gBACP,MAAA,EAAQ,QAAA;AAAA,gBACR,OAAA,EAAS;AAAA,eACX;AAAA,cACA;AAAA,gBACE,KAAA,EAAO,QAAA;AAAA,gBACP,MAAA,EAAQ,MAAM,kBAAA,CAAmB,KAAK,CAAA;AAAA,gBACtC,OAAA,EAAS;AAAA;AACX,aACF;AAAA,YACA,IAAA,EAAK;AAAA;AAAA;AACP,OAAA,EACF,CAAA;AAAA,IAEJ,CAAA;AAMO,IAAMa,oBAAA,GAA4C,CAAC,KAAA,KAAU;AAClE,MAAA,uBACEzB,cAAAA;AAAA,QAACT,cAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,eAAA;AAAA,UACN,YAAA,EAAc,KAAA;AAAA,UACd,QAAQ,KAAA,CAAM,MAAA;AAAA,UAEd,QAAA,kBAAAS,cAAAA,CAAC,oBAAA,EAAA,EAAsB,GAAG,KAAA,EAAO;AAAA;AAAA,OACnC;AAAA,IAEJ,CAAA;AAKO,IAAM0B,6BAMR,CAAC;AAAA,MACJ,YAAA,GAAe,EAAA;AAAA,MACf,QAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA,GAAc,sBAAA;AAAA,MACd;AAAA,KACF,KAAM;AACJ,MAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIzB,gBAAS,YAAY,CAAA;AAEjD,MAAA,uBACED,cAAAA,CAACT,cAAA,EAAA,EAAO,KAAA,EAAM,cAAA,EAAe,MAAA,EAC3B,QAAA,kBAAAM,eAAAA,CAACC,OAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,SAAS,CAAA,EACnC,QAAA,EAAA;AAAA,wBAAAE,cAAAA;AAAA,UAACM,aAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAM,QAAA;AAAA,YACN,KAAA,EAAO,MAAA;AAAA,YACP,QAAA,EAAU,SAAA;AAAA,YACV,QAAA;AAAA,YACA,WAAA;AAAA,YACA,SAAA,EAAW,IAAA;AAAA,YACX,SAAA,EAAW;AAAA;AAAA,SACb;AAAA,wBAEAN,cAAAA,CAACF,OAAAA,EAAA,EAAI,SAAA,EAAW,GAAG,cAAA,EAAe,UAAA,EAAW,GAAA,EAAK,CAAA,EAChD,0BAAAE,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAM,MAAA,EAAO,uDAAoC,CAAA,EACzD;AAAA,OAAA,EACF,CAAA,EACF,CAAA;AAAA,IAEJ,CAAA;AAyJA,IAAO,oBAAA,GAAQ0B,oBAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;AC3vBf,IAAA,gBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,WAAA,EAAA,MAAAK,mBAAA;AAAA,EAAA,qBAAA,EAAA,MAAA,qBAAA;AAAA,EAAA,cAAA,EAAA,MAAA,cAAA;AAAA,EAAA,uBAAA,EAAA,MAAA,uBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,WAAA,EAAA,MAAAC;AAAA,CAAA,CAAA;AA4NA,eAAsB,SAAA,CACpB,SAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,EAAA,OAAOA,mBAAA,CAAY,MAAA,CAAO,SAAA,EAAW,OAAO,CAAA;AAC9C;AAKA,eAAsB,aAAA,CACpB,SAAA,EACA,OAAA,GAA4B,EAAC,EACd;AACf,EAAA,MAAM,MAAA,GAAS,MAAMA,mBAAA,CAAY,MAAA,CAAO,SAAA,EAAW;AAAA,IACjD,GAAG,OAAA;AAAA,IACH,aAAA,EAAe;AAAA,GAChB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,aAAA,EAAc;AAAA,EAC7B,CAAA,SAAE;AACA,IAAA,MAAM,OAAO,OAAA,EAAQ;AAAA,EACvB;AACF;AAKA,eAAsB,aACpB,OAAA,EACA,QAAA,GAAmB,GAAA,EACnB,OAAA,GAA4B,EAAC,EACd;AACf,EAAA,MAAM,iBAAiBnC,uBAAAA,CAAM,aAAA;AAAA,IAC3B,KAAA;AAAA,IACA,EAAC;AAAA,IACDA,wBAAM,aAAA,CAAc,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,IAAU,OAAO;AAAA,GACxD;AAEA,EAAA,MAAMmC,mBAAA,CAAY,eAAA,CAAgB,cAAA,EAAgB,QAAA,EAAU,OAAO,CAAA;AACrE;AAKO,SAAS,cAAA,GAA0B;AACxC,EAAA,OAAO,CAAC,qBAAA,EAAsB,IAAK,OAAA,CAAQ,MAAA,CAAO,KAAA;AACpD;AAKA,eAAsB,aAAA,CACpB,SAAA,EACA,UAAA,EACA,OAAA,GAA4B,EAAC,EACC;AAC9B,EAAA,IAAI,CAAC,gBAAe,EAAG;AACrB,IAAA,OAAO,UAAA,EAAW;AAAA,EACpB;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,MAAMA,mBAAA,CAAY,MAAA,CAAO,SAAA,EAAW,OAAO,CAAA;AAAA,EACpD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,oCAAoC,KAAK,CAAA;AACtD,IAAA,OAAO,UAAA,EAAW;AAAA,EACpB;AACF;AAOO,SAAS,uBAAA,GAAgC;AAC9C,EAAA,IAAI,iBAAA,EAAmB;AAEvB,EAAA,MAAM,UAAU,YAAY;AAC1B,IAAA,MAAMA,oBAAY,UAAA,EAAW;AAAA,EAC/B,CAAA;AAEA,EAAA,OAAA,CAAQ,EAAA,CAAG,UAAU,OAAO,CAAA;AAC5B,EAAA,OAAA,CAAQ,EAAA,CAAG,WAAW,OAAO,CAAA;AAC7B,EAAA,OAAA,CAAQ,EAAA,CAAG,QAAQ,OAAO,CAAA;AAC1B,EAAA,OAAA,CAAQ,EAAA,CAAG,mBAAA,EAAqB,OAAO,KAAA,KAAU;AAC/C,IAAA,OAAA,CAAQ,KAAA,CAAM,uBAAuB,KAAK,CAAA;AAC1C,IAAA,MAAM,OAAA,EAAQ;AACd,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AAED,EAAA,iBAAA,GAAoB,IAAA;AACtB;AAKO,SAAS,qBAAA,GAAqC;AACnD,EAAA,uBAAA,EAAwB;AACxB,EAAA,OAAOA,mBAAA;AACT;AA/RaD,8BAsLAC,4BAAA,CAAA,KA8ET;AArSJ,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AASA,IAAA,gBAAA,EAAA;AAwBO,IAAMD,sBAAN,MAAkB;AAAA,MACf,SAAA,uBAAuC,GAAA,EAAI;AAAA,MAC3C,eAAA,uBAAwD,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA,MAKpE,MAAM,MAAA,CACJ,SAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,QAAA,MAAM;AAAA,UACJ,WAAA,GAAc,IAAA;AAAA,UACd,KAAA,GAAQ,KAAA;AAAA,UACR,MAAA,EAAAE,UAAS,OAAA,CAAQ,MAAA;AAAA,UACjB,KAAA,EAAAC,SAAQ,OAAA,CAAQ,KAAA;AAAA,UAChB,aAAA,GAAgB;AAAA,SAClB,GAAI,OAAA;AAGJ,QAAA,IAAI,uBAAsB,EAAG;AAC3B,UAAA,MAAM,IAAI,QAAA;AAAA,YACR,2CAAA;AAAA,YACA;AAAA,WACF;AAAA,QACF;AAGA,QAAA,MAAM,aAAA,GAA+B;AAAA,UACnC,WAAA;AAAA,UACA,KAAA;AAAA,UACA,MAAA,EAAAD,OAAAA;AAAA,UACA,KAAA,EAAAC;AAAA,SACF;AAEA,QAAA,IAAI;AAEF,UAAA,MAAM,QAAA,GAAWC,UAAA,CAAO,SAAA,EAAW,aAAa,CAAA;AAChD,UAAA,MAAM,UAAA,GAAa,KAAK,kBAAA,EAAmB;AAG3C,UAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,UAAA,EAAY,QAAQ,CAAA;AAGvC,UAAA,MAAM,UAAU,YAAY;AAC1B,YAAA,IAAI;AACF,cAAA,QAAA,CAAS,OAAA,EAAQ;AACjB,cAAA,IAAA,CAAK,SAAA,CAAU,OAAO,UAAU,CAAA;AAChC,cAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,UAAU,CAAA;AAAA,YACxC,SAAS,KAAA,EAAO;AACd,cAAA,IAAI,KAAA,EAAO;AACT,gBAAA,OAAA,CAAQ,KAAA,CAAM,kBAAkB,KAAK,CAAA;AAAA,cACvC;AAAA,YACF;AAAA,UACF,CAAA;AAEA,UAAA,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,UAAA,EAAY,OAAO,CAAA;AAG5C,UAAA,MAAM,MAAA,GAA0B;AAAA,YAC9B,QAAA;AAAA,YACA,OAAA;AAAA,YACA,aAAA,EAAe,MAAM,QAAA,CAAS,aAAA,EAAc;AAAA,YAC5C,QAAA,EAAU,CAAC,YAAA,KAAqC;AAC9C,cAAA,QAAA,CAAS,SAAS,YAAY,CAAA;AAAA,YAChC,CAAA;AAAA,YACA,OAAO,MAAM;AACX,cAAA,IAAIF,QAAO,KAAA,EAAO;AAChB,gBAAAA,OAAAA,CAAO,MAAM,sBAAsB,CAAA;AAAA,cACrC;AAAA,YACF,CAAA;AAAA,YACA,SAAS,MAAM;AACb,cAAA,QAAA,CAAS,OAAA,EAAQ;AACjB,cAAA,IAAA,CAAK,SAAA,CAAU,OAAO,UAAU,CAAA;AAChC,cAAA,IAAA,CAAK,eAAA,CAAgB,OAAO,UAAU,CAAA;AAAA,YACxC;AAAA,WACF;AAGA,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,MAAM,SAAS,aAAA,EAAc;AAAA,UAC/B;AAEA,UAAA,OAAO,MAAA;AAAA,QAET,SAAS,KAAA,EAAO;AACd,UAAA,MAAM,IAAI,QAAA;AAAA,YACR,mCAAmC,KAAK,CAAA,CAAA;AAAA,YACxC;AAAA,WACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,eAAA,CACJ,SAAA,EACA,QAAA,EACA,OAAA,GAA4B,EAAC,EACd;AACf,QAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,WAAW,OAAO,CAAA;AAEnD,QAAA,IAAI;AACF,UAAA,IAAI,QAAA,EAAU;AAEZ,YAAA,UAAA,CAAW,YAAY;AACrB,cAAA,MAAM,OAAO,OAAA,EAAQ;AAAA,YACvB,GAAG,QAAQ,CAAA;AAAA,UACb,CAAA,MAAO;AAEL,YAAA,MAAM,OAAO,aAAA,EAAc;AAAA,UAC7B;AAAA,QACF,CAAA,SAAE;AACA,UAAA,MAAM,OAAO,OAAA,EAAQ;AAAA,QACvB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,UAAA,CACJ,SAAA,EACA,OAAA,GAA4B,EAAC,EACH;AAC1B,QAAA,MAAM,WAAA,GAAgC;AAAA,UACpC,GAAG,OAAA;AAAA,UACH,KAAA,EAAO,IAAA;AAAA,UACP,WAAA,EAAa,KAAA;AAAA,UACb,aAAA,EAAe;AAAA,SACjB;AAEA,QAAA,OAAO,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,WAAW,CAAA;AAAA,MAC3C;AAAA;AAAA;AAAA;AAAA,MAKA,uBACE,UAAA,EACY;AACZ,QAAA,IAAI,uBAAsB,EAAG;AAC3B,UAAA,OAAO,UAAA,EAAW;AAAA,QACpB;AAEA,QAAA,MAAM,IAAI,QAAA;AAAA,UACR,qDAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA,MAKA,MAAM,UAAA,GAA4B;AAChC,QAAA,MAAM,kBAAkB,KAAA,CAAM,IAAA,CAAK,KAAK,eAAA,CAAgB,MAAA,EAAQ,CAAA,CAAE,GAAA;AAAA,UAChE,aAAW,OAAA;AAAQ,SACrB;AAEA,QAAA,MAAM,OAAA,CAAQ,WAAW,eAAe,CAAA;AACxC,QAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AACrB,QAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,MAC7B;AAAA;AAAA;AAAA;AAAA,MAKA,sBAAA,GAAiC;AAC/B,QAAA,OAAO,KAAK,SAAA,CAAU,IAAA;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKQ,kBAAA,GAA6B;AACnC,QAAA,OAAO,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,MACrE;AAAA,KACF;AAKO,IAAMD,mBAAA,GAAc,IAAID,mBAAA,EAAY;AA8E3C,IAAI,iBAAA,GAAoB,KAAA;AA8BxB,IAAA,uBAAA,EAAwB;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACnUxB,IAAA,gBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,gBAAA,EAAA;AAAA,EAAA,sBAAA,EAAA,MAAA,sBAAA;AAAA,EAAA,OAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,aAAA,EAAA,MAAA,aAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA,iBAAA;AAAA,EAAA,iBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAaA,eAAsB,qBAAqB,OAAA,EAIhB;AACzB,EAAA,MAAM,EAAE,YAAA,GAAe,EAAA,EAAI,QAAQ,cAAA,EAAgB,SAAA,GAAY,KAAM,GAAI,OAAA;AAEzE,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA;AACzB,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,eAAA,EAAkB,YAAY,CAAA,CAAE,CAAA;AAAA,EAC9C;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,gBAAA,EAAmB,SAAS,CAAA,WAAA,CAAa,CAAA;AACrD,EAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAE/D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACK,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,IAAI,KAAA,GAAQ,YAAA;AAEZ,IAAA,OAAA,CAAQ,KAAA,CAAM,YAAY,MAAM,CAAA;AAChC,IAAA,OAAA,CAAQ,MAAM,MAAA,EAAO;AAErB,IAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAU;AAClC,MAAA,KAAA,IAAS,KAAA;AAAA,IACX,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,KAAA,EAAO,MAAM;AAC5B,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,EAAK;AAC3B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAAA,SAAQ,IAAI,CAAA;AAAA,MACd,CAAA,MAAA,IAAW,OAAA,CAAQ,MAAA,GAAS,SAAA,EAAW;AACrC,QAAA,OAAA,CAAQ,KAAA,CAAM;AAAA,wBAAA,EAA6B,OAAA,CAAQ,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,YAAA,CAAc,CAAA;AACpF,QAAAA,SAAQ,IAAI,CAAA;AAAA,MACd,CAAA,MAAO;AACL,QAAAA,SAAQ,OAAO,CAAA;AAAA,MACjB;AAAA,IACF,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AACnC,MAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,MAAAA,SAAQ,IAAI,CAAA;AAAA,IACd,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAKA,eAAsB,qBAAqB,OAAA,EAGtB;AACnB,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,GAAe,KAAA,EAAM,GAAI,OAAA;AAE1C,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAC1B,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wCAAA,EAA2C,YAAA,GAAe,GAAA,GAAM,GAAG,CAAA,EAAA,CAAI,CAAA;AAEnF,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,KAAY;AAC9B,IAAA,MAAM,KAAcC,mBAAA,CAAA,eAAA,CAAgB;AAAA,MAClC,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAED,IAAA,EAAA,CAAG,QAAA,CAAS,IAAA,EAAM,CAAC,MAAA,KAAmB;AACpC,MAAA,EAAA,CAAG,KAAA,EAAM;AAET,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,EAAK,CAAE,WAAA,EAAY;AAC1C,MAAA,IAAI,OAAA,KAAY,GAAA,IAAO,OAAA,KAAY,KAAA,EAAO;AACxC,QAAAD,SAAQ,IAAI,CAAA;AAAA,MACd,CAAA,MAAA,IAAW,OAAA,KAAY,GAAA,IAAO,OAAA,KAAY,IAAA,EAAM;AAC9C,QAAAA,SAAQ,KAAK,CAAA;AAAA,MACf,CAAA,MAAO;AACL,QAAAA,SAAQ,YAAY,CAAA;AAAA,MACtB;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAKA,eAAsB,kBAAqB,OAAA,EAIf;AAC1B,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,QAAA,GAAW,OAAM,GAAI,OAAA;AAE/C,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAC1B,EAAA,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AAEhC,EAAA,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,EAAQ,KAAA,KAAU;AACjC,IAAA,MAAM,cAAc,MAAA,CAAO,WAAA,GAAc,CAAA,GAAA,EAAM,MAAA,CAAO,WAAW,CAAA,CAAA,GAAK,EAAA;AACtE,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,KAAA,GAAQ,CAAC,KAAK,MAAA,CAAO,KAAK,CAAA,EAAG,WAAW,CAAA,CAAE,CAAA;AAAA,EAC7D,CAAC,CAAA;AAED,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAA,CAAQ,IAAI,oDAAoD,CAAA;AAAA,EAClE,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAAA,EAClD;AAEA,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,KAAY;AAC9B,IAAA,MAAM,KAAcC,mBAAA,CAAA,eAAA,CAAgB;AAAA,MAClC,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ;AAAA,KACjB,CAAA;AAED,IAAA,EAAA,CAAG,QAAA,CAAS,IAAA,EAAM,CAAC,MAAA,KAAmB;AACpC,MAAA,EAAA,CAAG,KAAA,EAAM;AAET,MAAA,IAAI;AACF,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,MAAM,OAAA,GAAU,OACb,KAAA,CAAM,GAAG,EACT,GAAA,CAAI,CAAA,CAAA,KAAK,SAAS,CAAA,CAAE,IAAA,EAAM,CAAA,GAAI,CAAC,EAC/B,MAAA,CAAO,CAAA,CAAA,KAAK,KAAK,CAAA,IAAK,CAAA,GAAI,QAAQ,MAAM,CAAA;AAE3C,UAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,YAAAD,SAAQ,IAAI,CAAA;AAAA,UACd,CAAA,MAAO;AACL,YAAA,MAAM,iBAAiB,OAAA,CAAQ,GAAA,CAAI,OAAK,OAAA,CAAQ,CAAC,EAAE,KAAK,CAAA;AACxD,YAAAA,SAAQ,cAAc,CAAA;AAAA,UACxB;AAAA,QACF,CAAA,MAAO;AACL,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,MAAA,CAAO,IAAA,EAAM,CAAA,GAAI,CAAA;AACxC,UAAA,IAAI,KAAA,IAAS,CAAA,IAAK,KAAA,GAAQ,OAAA,CAAQ,MAAA,EAAQ;AACxC,YAAAA,QAAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,CAAE,KAAK,CAAA;AAAA,UAC9B,CAAA,MAAO;AACL,YAAAA,SAAQ,IAAI,CAAA;AAAA,UACd;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAAA,SAAQ,IAAI,CAAA;AAAA,MACd;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAKO,SAAS,cAAc,OAAA,EAIrB;AACP,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,GAAO,QAAO,GAAI,OAAA;AAE1C,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,IAAA,EAAM,QAAA;AAAA,IACN,OAAA,EAAS,QAAA;AAAA,IACT,OAAA,EAAS,QAAA;AAAA,IACT,KAAA,EAAO;AAAA,GACT;AAEA,EAAA,MAAM,IAAA,GAAO,UAAU,IAAI,CAAA;AAC3B,EAAA,MAAM,cAAc,KAAA,GAAQ,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,GAAK,OAAA;AAErD,EAAA,OAAA,CAAQ,GAAA,CAAI;AAAA,EAAK,IAAI,IAAI,WAAW;AAAA,CAAI,CAAA;AAC1C;AAKO,SAAS,kBAAA,GAOd;AACA,EAAA,MAAM,aAAA,GAAgB,CAAC,qBAAA,EAAsB,IAAK,QAAQ,MAAA,CAAO,KAAA;AAEjE,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,aAAA,IAAiB,OAAA,CAAQ,GAAA,CAAI,IAAA,KAAS,MAAA;AAAA,IACjD,UAAA,EAAY,aAAA,IAAiB,CAAC,OAAA,CAAQ,GAAA,CAAI,UAAA;AAAA,IAC1C,aAAA,EAAe,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AAAA,IACzC,cAAA,EAAgB,OAAA,CAAQ,MAAA,CAAO,IAAA,IAAQ,EAAA;AAAA,IACvC,aAAA;AAAA,IACA,gBAAA,EAAkB,aAAA,IAAiB,CAAC,OAAA,CAAQ,GAAA,CAAI;AAAA,GAClD;AACF;AAKO,SAAS,mBAAmB,OAAA,EAKxB;AACT,EAAA,MAAM,eAAe,kBAAA,EAAmB;AAExC,EAAA,IAAI,YAAA,CAAa,gBAAA,IAAoB,OAAA,CAAQ,IAAA,EAAM;AACjD,IAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,EACjB;AAEA,EAAA,IAAI,YAAA,CAAa,UAAA,IAAc,OAAA,CAAQ,OAAA,EAAS;AAC9C,IAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,EACjB;AAEA,EAAA,IAAI,YAAA,CAAa,SAAA,IAAa,OAAA,CAAQ,OAAA,EAAS;AAC7C,IAAA,OAAO,OAAA,CAAQ,OAAA;AAAA,EACjB;AAEA,EAAA,OAAO,OAAA,CAAQ,KAAA;AACjB;AAKO,SAAS,iBAAA,CACd,OAAA,EACA,OAAA,GAII,EAAC,EACC;AACN,EAAA,MAAM,EAAE,IAAA,GAAO,KAAA,EAAO,KAAA,EAAO,MAAK,GAAI,OAAA;AACtC,EAAA,MAAM,eAAe,kBAAA,EAAmB;AAExC,EAAA,IAAI,MAAA,GAAS,OAAA;AAGb,EAAA,IAAI,YAAA,CAAa,SAAA,KAAc,KAAA,IAAS,IAAA,CAAA,EAAO;AAC7C,IAAA,MAAM3B,MAAAA,GAAQ,UAAQ,OAAO,CAAA;AAE7B,IAAA,IAAI,KAAA,IAASA,MAAAA,CAAM,KAAK,CAAA,EAAG;AACzB,MAAA,MAAA,GAASA,MAAAA,CAAM,KAAK,CAAA,CAAE,MAAM,CAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAA,GAASA,MAAAA,CAAM,KAAK,MAAM,CAAA;AAAA,IAC5B;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,IAAI,EAAE,MAAM,CAAA;AACtB;AAKO,SAAS,uBAAuB,OAAA,EAQrC;AACA,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,GAAQ,UAAA,EAAY,cAAA,GAAiB,MAAK,GAAI,OAAA;AAC7D,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,CAAC,OAAA,EAAiB,OAAA,KAAqB;AAE7C,MAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,MAAA,IAAI,GAAA,GAAM,aAAa,GAAA,EAAK;AAC5B,MAAA,UAAA,GAAa,GAAA;AAEb,MAAA,IAAI,MAAA,GAAS,GAAG,KAAK,CAAA,EAAA,CAAA;AAErB,MAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAO,OAAA,GAAU,QAAS,GAAG,CAAA;AACrD,QAAA,MAAA,IAAU,GAAG,UAAU,CAAA,EAAA,CAAA;AAAA,MACzB;AAEA,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAA,IAAU,OAAA;AAAA,MACZ,WAAW,KAAA,EAAO;AAChB,QAAA,MAAA,IAAU,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA,MAC/B,CAAA,MAAO;AACL,QAAA,MAAA,IAAU,QAAQ,QAAA,EAAS;AAAA,MAC7B;AAGA,MAAA,OAAA,CAAQ,OAAO,KAAA,CAAM,CAAA,EAAA,EAAK,OAAO,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/C,CAAA;AAAA,IAEA,QAAA,EAAU,CAAC,OAAA,KAAqB;AAC9B,MAAA,MAAM,MAAA,GAAS,OAAA,IAAW,CAAA,EAAG,KAAK,CAAA,UAAA,CAAA;AAClC,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,IACtC,CAAA;AAAA,IAEA,IAAA,EAAM,CAAC,OAAA,KAAqB;AAC1B,MAAA,MAAM,MAAA,GAAS,OAAA,IAAW,CAAA,EAAG,KAAK,CAAA,QAAA,CAAA;AAClC,MAAA,OAAA,CAAQ,MAAM,CAAA,EAAA,EAAK,MAAA,CAAO,MAAA,CAAO,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,IACxC;AAAA,GACF;AACF;AAKO,SAAS,kBAAA,GAAwD;AACtE,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,EAAA,IAAM,OAAA,CAAQ,IAAI,sBAAA,EAAwB;AACxD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,uBAAsB,EAAG;AAC3B,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAQ,MAAA,CAAO,KAAA,IAAS,OAAA,CAAQ,GAAA,CAAI,SAAS,MAAA,EAAQ;AACvD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AArUA,IAuUO,gBAAA;AAvUP,IAAA,aAAA,GAAA,KAAA,CAAA;AAAA,EAAA,2BAAA,GAAA;AAAA,IAAA,YAAA,EAAA;AAQA,IAAA,gBAAA,EAAA;AA+TA,IAAO,gBAAA,GAAQ;AAAA,MACb,oBAAA;AAAA,MACA,oBAAA;AAAA,MACA,iBAAA;AAAA,MACA,aAAA;AAAA,MACA,kBAAA;AAAA,MACA,kBAAA;AAAA,MACA,iBAAA;AAAA,MACA,sBAAA;AAAA,MACA;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACjVA,YAAA,EAAA;;;ACAA,YAAA,EAAA;;;ACAA,YAAA,EAAA;AAgEA,IAAM,2BAAA,GAA8B6B,MAAE,MAAA,CAAO;AAAA,EAC3C,eAAA,EAAiBA,KAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,UAAU,OAAA,EAAS,QAAQ,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC1E,oBAAA,EAAsBA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EACjE,YAAA,EAAcA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,QAAA,EAAUA,KAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EACvE,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,OAAA,EAASA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC9B,KAAA,EAAOA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC5B,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,GAAI,CAAA,CAAE,GAAA,CAAI,GAAM,CAAA,CAAE,QAAA,EAAS;AAAA,EAC5D,UAAA,EAAYA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA,CAAE,QAAA,EAAS;AAAA,EACrD,aAAA,EAAeA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACnC,WAAA,EAAaA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAClC,YAAA,EAAcA,KAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACnC,gBAAA,EAAkBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACtC,gBAAA,EAAkBA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC/B,CAAC,EAAE,OAAA,EAAQ;AAKX,IAAM,qBAAA,GAAwBA,MAAE,MAAA,CAAO;AAAA,EACrC,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,MAAMA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACnC,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAC1B,CAAC,CAAA;AAED,IAAM,mBAAA,GAAsBA,MAAE,MAAA,CAAO;AAAA,EACnC,IAAA,EAAMA,KAAA,CAAE,MAAA,EAAO,CACZ,GAAA,CAAI,CAAC,CAAA,CACL,GAAA,CAAI,EAAE,CAAA,CACN,KAAA,CAAM,kBAAA,EAAoB,kFAAkF,CAAA;AAAA,EAC/G,WAAA,EAAaA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,UAAUA,KAAA,CAAE,KAAA,CAAMA,MAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,EACvC,MAAA,EAAQ,2BAAA;AAAA,EACR,QAAA,EAAU,sBAAsB,QAAA;AAClC,CAAC,CAAA;AAED,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA,EACpC,OAAA,EAAS,mBAAA;AAAA,EACT,OAAA,EAASA,MAAE,MAAA,EAAO;AAAA,EAClB,cAAA,EAAgB,4BAA4B,QAAA;AAC9C,CAAC,CAAA;AAQM,IAAM,iBAAN,MAAqB;AAAA,EACT,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACT,YAAA,uBAAmB,GAAA,EAA2B;AAAA,EAC9C,aAAA,GAA+B,IAAA;AAAA,EAEvC,YAAY,SAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,WAAA,GAAmBC,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AAClD,IAAA,IAAA,CAAK,iBAAA,GAAyBA,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,oBAAoB,CAAA;AAClE,IAAA,IAAA,CAAK,iBAAA,GAAyBA,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAEhC,IAAA,MAAMC,gBAAW,KAAA,CAAM,IAAA,CAAK,aAAa,EAAE,SAAA,EAAW,MAAM,CAAA;AAG5D,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,aAAA,CAAc,SAAS,CAAA,EAAG;AACxC,MAAA,MAAM,KAAK,oBAAA,EAAqB;AAAA,IAClC;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,uBAAuB,MAAMA,eAAA,CAAW,QAAA,CAAS,IAAA,CAAK,mBAAmB,OAAO,CAAA;AACtF,MAAA,IAAA,CAAK,aAAA,GAAgB,qBAAqB,IAAA,EAAK;AAG/C,MAAA,IAAI,CAAC,MAAM,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,aAAa,CAAA,EAAG;AACjD,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmB,IAAA,CAAK,aAAa,CAAA,iCAAA,CAAmC,CAAA;AACrF,QAAA,MAAM,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAAA,MACvC;AAAA,IACF,CAAA,CAAA,MAAQ;AAEN,MAAA,MAAM,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAAA,IACvC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,GAAkC;AACtC,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAMA,eAAA,CAAW,OAAA,CAAQ,KAAK,WAAW,CAAA;AACvD,MAAA,MAAM,WAAqB,EAAC;AAE5B,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAI,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AAC7E,UAAA,MAAM,WAAA,GAAc,IAAA,CAAK,sBAAA,CAAuB,IAAI,CAAA;AACpD,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,QAAA,CAAS,KAAK,WAAW,CAAA;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAEA,MAAA,OAAO,SAAS,IAAA,EAAK;AAAA,IACvB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,IAAA,EAA6C;AAE5D,IAAA,IAAI,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAG;AAC/B,MAAA,OAAO,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAAA,IACnC;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AACnD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAMA,eAAA,CAAW,QAAA,CAAS,aAAa,OAAO,CAAA;AAC9D,MAAA,MAAM,IAAA,GAAO,WAAA,CAAY,QAAA,CAAS,OAAO,CAAA,GACrC,KAAK,KAAA,CAAM,OAAO,CAAA,GACbC,eAAA,CAAA,IAAA,CAAK,OAAO,CAAA;AAErB,MAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,KAAA,CAAM,IAAI,CAAA;AAC/C,MAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AAGxB,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AACnC,MAAA,OAAO,OAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAI,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,GAA+B;AAC7B,IAAA,OAAO,KAAK,aAAA,IAAiB,SAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAA4C;AAChD,IAAA,MAAM,iBAAA,GAAoB,KAAK,oBAAA,EAAqB;AACpD,IAAA,OAAO,MAAM,IAAA,CAAK,cAAA,CAAe,iBAAiB,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,IAAA,EAA6B;AAClD,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA,EAAG;AACnC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,IAAI,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACpD;AAEA,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAA;AACrB,IAAA,MAAMD,eAAA,CAAW,SAAA,CAAU,IAAA,CAAK,iBAAA,EAAmB,MAAM,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,OAAA,EAAuC;AAEzD,IAAA,mBAAA,CAAoB,MAAM,OAAO,CAAA;AAGjC,IAAA,IAAI,MAAM,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC1C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,gBAAA,CAAkB,CAAA;AAAA,IAC5D;AAGA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,KAAK,wBAAA,CAAyB,OAAA,CAAQ,UAAU,CAAC,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,IACtE;AAGA,IAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACrB,MAAA,OAAA,CAAQ,QAAA,GAAW;AAAA,QACjB,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAChC,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,OAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAGA,IAAA,MAAM,cAAmBD,gBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA,KAAA,CAAO,CAAA;AACtE,IAAA,MAAMC,eAAA,CAAW,UAAU,WAAA,EAAa,IAAA,CAAK,UAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAGjF,IAAA,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,IAAA,EAAc,OAAA,EAAgD;AAChF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAC3C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,IAAI,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACpD;AAGA,IAAA,MAAM,OAAA,GAAyB;AAAA,MAC7B,GAAG,QAAA;AAAA,MACH,GAAG,OAAA;AAAA,MACH,IAAA;AAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,GAAG,QAAA,CAAS,QAAA;AAAA,QACZ,GAAG,OAAA,CAAQ;AAAA;AACb,KACF;AAGA,IAAA,mBAAA,CAAoB,MAAM,OAAO,CAAA;AAGjC,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,MAAM,KAAK,wBAAA,CAAyB,OAAA,CAAQ,QAAA,EAAU,CAAC,IAAI,CAAC,CAAA;AAAA,IAC9D;AAGA,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,OAAA,EAAS,OAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AACnD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAMA,eAAA,CAAW,UAAU,WAAA,EAAa,IAAA,CAAK,UAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,IACnF;AAGA,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,IAAA,EAA6B;AAC/C,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,IACrD;AAEA,IAAA,IAAI,CAAC,MAAM,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA,EAAG;AACnC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,IAAI,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACpD;AAGA,IAAA,IAAI,IAAA,CAAK,oBAAA,EAAqB,KAAM,IAAA,EAAM;AACxC,MAAA,MAAM,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAAA,IACvC;AAGA,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AACnD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAMA,eAAA,CAAW,OAAO,WAAW,CAAA;AAAA,IACrC;AAGA,IAAA,IAAA,CAAK,YAAA,CAAa,OAAO,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,IAAA,EAAc,MAAA,GAA0B,MAAA,EAAyB;AACnF,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,IAAI,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,OAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,OAAYC,eAAA,CAAA,IAAA,CAAK,OAAA,EAAS,EAAE,MAAA,EAAQ,GAAG,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,IACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,IAAA,EAAc,MAAA,GAA0B,MAAA,EAAuB;AACjF,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI;AACF,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,MAAA,GAAcA,qBAAK,IAAI,CAAA;AAAA,MACzB,CAAA,MAAO;AACL,QAAA,MAAA,GAAS,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MAC1B;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IACvD;AAGA,IAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,KAAA,CAAM,MAAM,CAAA;AAGjD,IAAA,MAAM,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,OAAO,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,IAAA,EAAuC;AAC1D,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,IAAI,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACpD;AAGA,IAAA,IAAI,iBAA0C,EAAC;AAG/C,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,KAAA,MAAW,aAAA,IAAiB,QAAQ,QAAA,EAAU;AAC5C,QAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,cAAA,CAAe,aAAa,CAAA;AAC/D,QAAA,cAAA,GAAiB,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB,eAAe,CAAA;AAAA,MACpE;AAAA,IACF;AAGA,IAAA,cAAA,GAAiB,IAAA,CAAK,YAAA,CAAa,cAAA,EAAgB,OAAA,CAAQ,MAAM,CAAA;AAGjE,IAAA,MAAM,aAAA,GAAgB,KAAK,gBAAA,EAAiB;AAC5C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,YAAA,CAAa,aAAA,EAAe,cAAc,CAAA;AAGnE,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,IAAA,EAAgC;AAClD,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,eAAA,CAAgB,IAAI,CAAA;AACnD,IAAA,OAAO,WAAA,KAAgB,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,IAAA,EAIlB;AACD,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,IAAI,CAAA,gBAAA,CAAkB,CAAA;AAAA,IACpD;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AACrD,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,mBAAA,CAAoB,IAAI,CAAA;AAEvD,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,oBAAA,GAAsC;AAClD,IAAA,MAAM,cAAA,GAAgC;AAAA,MACpC,IAAA,EAAM,SAAA;AAAA,MACN,WAAA,EAAa,+BAAA;AAAA,MACb,MAAA,EAAQ,KAAK,gBAAA,EAAiB;AAAA,MAC9B,QAAA,EAAU;AAAA,QACR,OAAA,EAAA,iBAAS,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,QAChC,MAAA,EAAQ,QAAA;AAAA,QACR,OAAA,EAAS,OAAA;AAAA,QACT,WAAA,EAAa;AAAA;AACf,KACF;AAEA,IAAA,MAAM,IAAA,CAAK,cAAc,cAAc,CAAA;AAAA,EACzC;AAAA,EAEA,MAAc,gBAAgB,IAAA,EAAsC;AAClE,IAAA,MAAM,UAAA,GAAa,CAAC,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA;AAE5C,IAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,MAAA,MAAM,QAAA,GAAgBF,sBAAK,IAAA,CAAK,WAAA,EAAa,GAAG,IAAI,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA;AAC5D,MAAA,IAAI;AACF,QAAA,MAAMC,eAAA,CAAW,OAAO,QAAQ,CAAA;AAChC,QAAA,OAAO,QAAA;AAAA,MACT,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,uBAAuB,QAAA,EAAiC;AAC9D,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,yBAAyB,CAAA;AACtD,IAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AAAA,EAC5B;AAAA,EAEA,MAAc,wBAAA,CAAyB,QAAA,EAAoB,OAAA,GAAoB,EAAC,EAAkB;AAChG,IAAA,KAAA,MAAW,iBAAiB,QAAA,EAAU;AACpC,MAAA,IAAI,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,EAAG;AACnC,QAAA,MAAM,IAAI,MAAM,CAAA,+BAAA,EAAkC,OAAA,CAAQ,KAAK,MAAM,CAAC,CAAA,IAAA,EAAO,aAAa,CAAA,CAAE,CAAA;AAAA,MAC9F;AAEA,MAAA,IAAI,CAAC,MAAM,IAAA,CAAK,aAAA,CAAc,aAAa,CAAA,EAAG;AAC5C,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mBAAA,EAAsB,aAAa,CAAA,gBAAA,CAAkB,CAAA;AAAA,MACvE;AAEA,MAAA,MAAM,gBAAA,GAAmB,MAAM,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA;AAC5D,MAAA,IAAI,kBAAkB,QAAA,EAAU;AAC9B,QAAA,MAAM,IAAA,CAAK,yBAAyB,gBAAA,CAAiB,QAAA,EAAU,CAAC,GAAG,OAAA,EAAS,aAAa,CAAC,CAAA;AAAA,MAC5F;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,oBAAoB,IAAA,EAAiC;AACjE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAC1C,IAAA,IAAI,CAAC,SAAS,QAAA,EAAU;AACtB,MAAA,OAAO,CAAC,IAAI,CAAA;AAAA,IACd;AAEA,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,aAAA,IAAiB,QAAQ,QAAA,EAAU;AAC5C,MAAA,MAAM,cAAA,GAAiB,MAAM,IAAA,CAAK,mBAAA,CAAoB,aAAa,CAAA;AACnE,MAAA,KAAA,CAAM,IAAA,CAAK,GAAG,cAAc,CAAA;AAAA,IAC9B;AACA,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAEf,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,YAAA,CAAa,MAA+B,QAAA,EAA4D;AAC9G,IAAA,MAAM,MAAA,GAAS,EAAE,GAAG,IAAA,EAAK;AAEzB,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACnD,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAC,MAAA,CAAe,GAAG,CAAA,GAAI,KAAA;AAAA,MACzB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,gBAAA,GAAmC;AACzC,IAAA,OAAO;AAAA;AAAA,MAEL,eAAA,EAAiB,QAAA;AAAA,MACjB,oBAAA,EAAsB,CAAA;AAAA,MACtB,YAAA,EAAc,MAAA;AAAA;AAAA,MAGd,QAAA,EAAU,MAAA;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA;AAAA;AAAA,MAGP,UAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAY,CAAA;AAAA,MACZ,aAAA,EAAe,MAAA;AAAA;AAAA,MAGf,WAAA,EAAa,KAAA;AAAA,MACb,YAAA,EAAc,KAAA;AAAA;AAAA,MAGd,gBAAA,EAAkB,QAAQ,GAAA,EAAI;AAAA,MAC9B,kBAAuBD,gBAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,cAAc,UAAU;AAAA,KACrE;AAAA,EACF;AACF,CAAA;AAKO,SAAS,qBAAqB,SAAA,EAAmC;AACtE,EAAA,OAAO,IAAI,eAAe,SAAS,CAAA;AACrC;AAKO,IAAM,YAAA,GAAN,cAA2B,KAAA,CAAM;AAAA,EACtC,WAAA,CAAY,OAAA,EAAiC,IAAA,GAAe,eAAA,EAAiB;AAC3E,IAAA,KAAA,CAAM,OAAO,CAAA;AAD8B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAE3C,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EACd;AACF;AAEO,IAAM,oBAAA,GAAN,cAAmC,YAAA,CAAa;AAAA,EACrD,YAAY,WAAA,EAAqB;AAC/B,IAAA,KAAA,CAAM,CAAA,SAAA,EAAY,WAAW,CAAA,WAAA,CAAA,EAAe,mBAAmB,CAAA;AAC/D,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;AAEO,IAAM,kBAAA,GAAN,cAAiC,YAAA,CAAa;AAAA,EACnD,YAAY,WAAA,EAAqB;AAC/B,IAAA,KAAA,CAAM,CAAA,SAAA,EAAY,WAAW,CAAA,gBAAA,CAAA,EAAoB,gBAAgB,CAAA;AACjE,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AAAA,EACd;AACF;AAEO,IAAM,wBAAA,GAAN,cAAuC,YAAA,CAAa;AAAA,EACzD,YAAY,KAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,kCAAkC,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,IAAI,sBAAsB,CAAA;AACpF,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AAAA,EACd;AACF;;;ADhkBO,IAAM,eAAA,GAAkB;AAAA;AAAA,EAE7B,0BAAA,EAA4B,iBAAA;AAAA,EAC5B,gCAAA,EAAkC,sBAAA;AAAA,EAClC,uBAAA,EAAyB,cAAA;AAAA;AAAA,EAGzB,mBAAA,EAAqB,UAAA;AAAA,EACrB,kBAAA,EAAoB,SAAA;AAAA,EACpB,iBAAA,EAAmB,SAAA;AAAA,EACnB,eAAA,EAAiB,OAAA;AAAA;AAAA,EAGjB,qBAAA,EAAuB,YAAA;AAAA,EACvB,qBAAA,EAAuB,YAAA;AAAA,EACvB,yBAAA,EAA2B,eAAA;AAAA,EAC3B,yBAAA,EAA2B,eAAA;AAAA;AAAA,EAG3B,qBAAA,EAAuB,aAAA;AAAA,EACvB,uBAAA,EAAyB,cAAA;AAAA;AAAA,EAGzB,2BAAA,EAA6B,kBAAA;AAAA,EAC7B,2BAAA,EAA6B;AAC/B;AAKA,IAAM,kBAAA,GAAqBD,MAAE,IAAA,CAAK,CAAC,UAAU,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAC,CAAA;AAKzE,IAAM,cAAA,GAAiBA,MAAE,IAAA,CAAK,CAAC,SAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAC,CAAA;AAKzE,IAAM,cAAA,GAAiBA,MAAE,IAAA,CAAK,CAAC,aAAa,iBAAA,EAAmB,eAAA,EAAiB,SAAS,CAAC,CAAA;AAK1F,IAAM,UAAA,GAAaA,MAAE,MAAA,CAAO;AAAA,EAC1B,QAAA,EAAUA,MAAE,KAAA,CAAMA,KAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,gDAAgD;AACzF,CAAC,CAAA;AAMD,IAAM,cAAcA,KAAAA,CAAE,MAAA,CAAO,cAAA,EAAgB,UAAU,EAAE,QAAA,EAAS;AAM3D,IAAM,oBAAA,GAAuBA,MAAE,MAAA,CAAO;AAAA;AAAA,EAE3C,eAAA,EAAiB,kBAAA,CACd,QAAA,CAAS,4CAA4C,CAAA;AAAA,EAExD,oBAAA,EAAsBA,KAAAA,CAAE,MAAA,EAAO,CAC5B,GAAA,EAAI,CACJ,GAAA,CAAI,CAAC,CAAA,CACL,GAAA,CAAI,GAAI,CAAA,CACR,SAAS,yDAAyD,CAAA;AAAA,EAErE,cAAcA,KAAAA,CAAE,MAAA,GACb,QAAA,EAAS,CACT,SAAS,uCAAuC,CAAA;AAAA;AAAA,EAGnD,QAAA,EAAU,cAAA,CACP,QAAA,CAAS,mCAAmC,CAAA;AAAA,EAE/C,SAASA,KAAAA,CAAE,MAAA,GACR,QAAA,EAAS,CACT,SAAS,6BAA6B,CAAA;AAAA,EAEzC,OAAA,EAASA,KAAAA,CAAE,OAAA,EAAQ,CAChB,SAAS,uBAAuB,CAAA;AAAA,EAEnC,KAAA,EAAOA,KAAAA,CAAE,OAAA,EAAQ,CACd,SAAS,oCAAoC,CAAA;AAAA;AAAA,EAGhD,UAAA,EAAYA,KAAAA,CAAE,MAAA,EAAO,CAClB,GAAA,EAAI,CACJ,GAAA,CAAI,GAAI,CAAA,CAGR,GAAA,CAAI,KAAQ,CAAA,CACZ,SAAS,oCAAoC,CAAA;AAAA,EAEhD,UAAA,EAAYA,KAAAA,CAAE,MAAA,EAAO,CAClB,GAAA,EAAI,CACJ,GAAA,CAAI,CAAC,CAAA,CACL,GAAA,CAAI,EAAE,CAAA,CACN,SAAS,sCAAsC,CAAA;AAAA,EAElD,eAAeA,KAAAA,CAAE,MAAA,GACd,QAAA,EAAS,CACT,SAAS,kEAAkE,CAAA;AAAA,EAE9E,eAAeA,KAAAA,CAAE,MAAA,GACd,QAAA,EAAS,CACT,SAAS,wDAAwD,CAAA;AAAA;AAAA,EAGpE,WAAA,EAAaA,KAAAA,CAAE,OAAA,EAAQ,CACpB,SAAS,yBAAyB,CAAA;AAAA,EAErC,YAAA,EAAcA,KAAAA,CAAE,OAAA,EAAQ,CACrB,SAAS,+BAA+B,CAAA;AAAA;AAAA,EAG3C,gBAAA,EAAkBA,KAAAA,CAAE,MAAA,EAAO,CACxB,SAAS,sCAAsC,CAAA;AAAA,EAElD,gBAAA,EAAkBA,KAAAA,CAAE,MAAA,EAAO,CACxB,SAAS,oCAAoC,CAAA;AAAA;AAAA,EAGhD,KAAA,EAAO,WAAA,CACJ,QAAA,CAAS,+EAA+E;AAC7F,CAAC,EAAE,MAAA;AAMI,IAAM,cAAA,GAAiC;AAAA;AAAA,EAE5C,eAAA,EAAiB,QAAA;AAAA,EACjB,oBAAA,EAAsB,EAAA;AAAA;AAAA,EAGtB,QAAA,EAAU,MAAA;AAAA,EACV,OAAA,EAAS,KAAA;AAAA,EACT,KAAA,EAAO,KAAA;AAAA;AAAA,EAGP,UAAA,EAAY,KAAA;AAAA;AAAA,EACZ,UAAA,EAAY,CAAA;AAAA,EACZ,aAAA,EAAe,eAAA;AAAA;AAAA;AAAA,EAGf,WAAA,EAAa,IAAA;AAAA,EACb,YAAA,EAAc,KAAA;AAAA;AAAA,EAGd,gBAAA,EAAkB,QAAQ,GAAA,EAAI;AAAA,EAC9B,gBAAA,EAAuBI,gBAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,YAAY,CAAA;AAAA;AAAA,EAGvD,OAAO;AACT;AAMA,IAAM,wBAAA,GAA2B;AAAA,EAC/B,uBAAA;AAAA,EACA,qBAAA;AAAA,EACA,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AAAA;AACF,CAAA;AAKA,IAAM,mBAAA,GAAsB,wBAAA;AAoB5B,SAAS,WAAA,CAAY,SAAA,EAAmB,QAAA,GAAmB,OAAA,CAAQ,KAAI,EAAW;AAChF,EAAA,IAASA,gBAAA,CAAA,UAAA,CAAW,SAAS,CAAA,EAAG;AAC9B,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAYA,gBAAA,CAAA,OAAA,CAAQ,UAAU,SAAS,CAAA;AACzC;AASA,SAAS,cAAc,KAAA,EAA0C;AAE/D,EAAA,IAAI,KAAA,KAAU,IAAI,OAAO,KAAA;AAGzB,EAAA,IAAI,KAAA,CAAM,WAAA,EAAY,KAAM,MAAA,EAAQ,OAAO,IAAA;AAC3C,EAAA,IAAI,KAAA,CAAM,WAAA,EAAY,KAAM,OAAA,EAAS,OAAO,KAAA;AAG5C,EAAA,MAAM,QAAA,GAAW,OAAO,KAAK,CAAA;AAC7B,EAAA,IAAI,CAAC,KAAA,CAAM,QAAQ,CAAA,IAAK,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC1C,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,OAAO,KAAA;AACT;AAQA,SAAS,iBAAA,GAA6C;AACpD,EAAA,MAAM,SAAkC,EAAC;AAEzC,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,SAAS,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AACjE,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAChC,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAC,MAAA,CAAe,SAAS,CAAA,GAAI,aAAA,CAAc,KAAK,CAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAQA,eAAe,eAAe,QAAA,EAAoD;AAChF,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMF,eAAAA,CAAW,QAAA,CAAS,UAAU,OAAO,CAAA;AAC3D,IAAA,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,QAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EACzE;AACF;AAQA,eAAe,eAAe,QAAA,EAAoD;AAChF,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMA,eAAAA,CAAW,QAAA,CAAS,UAAU,OAAO,CAAA;AAC3D,IAAA,MAAM,MAAA,GAAcG,qBAAK,OAAO,CAAA;AAChC,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,QAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EACzE;AACF;AASA,eAAe,sBAAsB,QAAA,EAAoD;AACvF,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMH,eAAAA,CAAW,QAAA,CAAS,UAAU,OAAO,CAAA;AAC3D,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACtC,IAAA,OAAO,WAAA,CAAY,YAAY,EAAC;AAAA,EAClC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wCAAA,EAA2C,QAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EACjF;AACF;AAQA,SAAS,oBAAoB,QAAA,EAAoC;AAC/D,EAAA,MAAM,GAAA,GAAWE,gBAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,CAAE,WAAA,EAAY;AAE/C,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,OAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,OAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT,KAAK,KAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,OAAO,IAAA;AAAA,IACT;AAEE,MAAA,OAAO,MAAA;AAAA;AAEb;AASA,eAAe,mBAAmB,QAAA,EAAoD;AACpF,EAAA,MAAM,MAAA,GAAS,oBAAoB,QAAQ,CAAA;AAC3C,EAAA,MAAM,YAAA,GAAe,YAAY,QAAQ,CAAA;AAGzC,EAAA,IAAI;AACF,IAAA,MAAMF,eAAAA,CAAW,MAAA,CAAO,YAAA,EAAqBI,iBAAA,CAAA,SAAA,CAAU,IAAI,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,YAAY,CAAA,CAAE,CAAA;AAAA,EACpE;AAEA,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,MAAA;AACH,MAAA,IAASF,gBAAA,CAAA,QAAA,CAAS,QAAQ,CAAA,KAAM,cAAA,EAAgB;AAC9C,QAAA,OAAO,sBAAsB,YAAY,CAAA;AAAA,MAC3C;AACA,MAAA,OAAO,eAAe,YAAY,CAAA;AAAA,IAEpC,KAAK,MAAA;AACH,MAAA,OAAO,eAAe,YAAY,CAAA;AAAA,IAEpC,KAAK,MAAA;AAEH,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAElE,KAAK,IAAA;AAEH,MAAA,MAAM,IAAI,MAAM,sDAAsD,CAAA;AAAA,IAExE;AACE,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uCAAA,EAA0C,MAAM,CAAA,CAAE,CAAA;AAAA;AAExE;AASA,eAAe,qBAAA,CAAsB,SAAA,GAAoB,OAAA,CAAQ,GAAA,EAAI,EAA2B;AAC9F,EAAA,MAAM,QAAA,GAAgBA,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,mBAAmB,CAAA;AAEzD,EAAA,IAAI;AACF,IAAA,MAAMF,eAAAA,CAAW,MAAA,CAAO,QAAA,EAAiBI,iBAAA,CAAA,SAAA,CAAU,IAAI,CAAA;AACvD,IAAA,OAAO,QAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AASA,eAAe,oBAAA,CAAqB,SAAA,GAAoB,OAAA,CAAQ,GAAA,EAAI,EAA2B;AAC7F,EAAA,KAAA,MAAW,YAAY,wBAAA,EAA0B;AAC/C,IAAA,MAAM,QAAA,GAAgBF,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,QAAQ,CAAA;AAE9C,IAAA,IAAI;AACF,MAAA,MAAMF,eAAAA,CAAW,MAAA,CAAO,QAAA,EAAiBI,iBAAA,CAAA,SAAA,CAAU,IAAI,CAAA;AACvD,MAAA,OAAO,QAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AAEN,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AA+BO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQxB,WAAA,CAAoB,OAAA,GAAkB,OAAA,CAAQ,GAAA,EAAI,EAAG;AAAjC,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAElB,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,UAAA,EAAY,cAAc,CAAA;AAAA,EACnD;AAAA,EAVQ,aAAA,uBAAgE,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiB5E,eAAA,GAAwB;AACtB,IAAA,MAAM,YAAY,iBAAA,EAAkB;AACpC,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAA,EAAO,SAAS,CAAA;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS,QAAA,EAAiC;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,QAAQ,CAAA;AACpD,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC3C,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,mCAAA,EAAsC,KAAK,CAAA,CAAE,CAAA;AAAA,IAC/D;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAA,GAAmC;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,iBAAA,GAAoB,MAAM,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAClE,MAAA,IAAI,iBAAA,EAAmB;AACrB,QAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,iBAAiB,CAAA;AAC7D,QAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,aAAA,EAAe,UAAU,CAAA;AAAA,MAClD;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2CAAA,EAA8C,KAAK,CAAA,CAAE,CAAA;AAAA,IACvE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,gBAAA,GAAkC;AAEtC,IAAA,MAAM,iBAAA,GAAoB,MAAM,qBAAA,CAAsB,IAAA,CAAK,OAAO,CAAA;AAClE,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,iBAAiB,CAAA;AAC7D,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,aAAA,EAAe,UAAU,CAAA;AAAA,IAClD;AAGA,IAAA,MAAM,gBAAA,GAAmB,MAAM,oBAAA,CAAqB,IAAA,CAAK,OAAO,CAAA;AAChE,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,gBAAgB,CAAA;AAC5D,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC3C;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ,SAAA,EAA0C;AAChD,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAA,EAAO,SAAS,CAAA;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAY,cAAA,EAA+C;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,MAAM,cAAA,CAAe,gBAAA,EAAiB;AAC5D,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,SAAA,EAAW,aAAa,CAAA;AAAA,IACjD,SAAS,KAAA,EAAO;AAGd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wCAAA,EAA2C,KAAK,CAAA,CAAE,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,GAAwB;AAEtB,IAAA,MAAM,YAAA,GAAe,EAAE,GAAG,cAAA,EAAe;AAGzC,IAAA,MAAM,mBAAmC,CAAC,SAAA,EAAW,MAAA,EAAQ,aAAA,EAAe,OAAO,KAAK,CAAA;AAExF,IAAA,KAAA,MAAW,UAAU,gBAAA,EAAkB;AACrC,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA;AAClD,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,MAAA,CAAO,MAAA,CAAO,cAAc,YAAY,CAAA;AAAA,MAC1C;AAAA,IACF;AAGA,IAAA,IAAI,aAAa,gBAAA,EAAkB;AACjC,MAAA,YAAA,CAAa,gBAAA,GAAmB,WAAA,CAAY,YAAA,CAAa,gBAAA,EAAkB,KAAK,OAAO,CAAA;AAAA,IACzF;AAEA,IAAA,IAAI,aAAa,gBAAA,EAAkB;AACjC,MAAA,YAAA,CAAa,gBAAA,GAAmB,WAAA,CAAY,YAAA,CAAa,gBAAA,EAAkB,KAAK,OAAO,CAAA;AAAA,IACzF;AAEA,IAAA,IAAI,aAAa,OAAA,EAAS;AACxB,MAAA,YAAA,CAAa,OAAA,GAAU,WAAA,CAAY,YAAA,CAAa,OAAA,EAAS,KAAK,OAAO,CAAA;AAAA,IACvE;AAEA,IAAA,IAAI,aAAa,aAAA,EAAe;AAC9B,MAAA,YAAA,CAAa,aAAA,GAAgB,WAAA,CAAY,YAAA,CAAa,aAAA,EAAe,KAAK,OAAO,CAAA;AAAA,IACnF;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,OAAA,CAAQ,SAAA,EAAqC,cAAA,EAA0D;AAE3G,IAAA,IAAA,CAAK,eAAA,EAAgB;AAGrB,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,IAAA,CAAK,YAAY,cAAc,CAAA;AAAA,IACvC;AAGA,IAAA,MAAM,KAAK,gBAAA,EAAiB;AAG5B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAA,CAAK,QAAQ,SAAS,CAAA;AAAA,IACxB;AAGA,IAAA,OAAO,KAAK,KAAA,EAAM;AAAA,EACpB;AACF;AASO,SAAS,eAAe,MAAA,EAAiC;AAC9D,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,KAAA,CAAM,MAAM,CAAA;AAChD,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBN,MAAE,QAAA,EAAU;AAC/B,MAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,GAAA;AAAA,QAAI,CAAA,GAAA,KACrC,GAAG,GAAA,CAAI,IAAA,CAAK,KAAK,GAAG,CAAC,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA;AAAA,OACvC,CAAE,KAAK,IAAI,CAAA;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,aAAa,CAAA,CAAE,CAAA;AAAA,IACrE;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAaA,eAAe,kBAAkB,OAAA,EAAgC;AAC/D,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAiBI,gBAAA,CAAA,IAAA,CAAK,OAAA,EAAS,YAAY,CAAA;AACjD,IAAA,MAAM,UAAA,GAAkBA,gBAAA,CAAA,IAAA,CAAK,SAAA,EAAW,aAAa,CAAA;AAGrD,IAAA,MAAMzD,mBAAA,CAAG,UAAU,SAAS,CAAA;AAG5B,IAAA,MAAM,YAAA,GAAe,MAAMA,mBAAA,CAAG,UAAA,CAAW,UAAU,CAAA;AAGnD,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,SAAA,EAAW,EAAE,QAAA,EAAU,EAAC,EAAE;AAAA,MAC1B,eAAA,EAAiB,EAAE,QAAA,EAAU,EAAC,EAAE;AAAA,MAChC,aAAA,EAAe,EAAE,QAAA,EAAU,EAAC,EAAE;AAAA,MAC9B,OAAA,EAAS,EAAE,QAAA,EAAU,EAAC;AAAE,KAC1B;AAEA,IAAA,IAAI,CAAC,YAAA,EAAc;AAEjB,MAAA,MAAM,aAAA,GAAgB;AAAA,QACpB,GAAG,cAAA;AAAA,QACH,KAAA,EAAO;AAAA,OACT;AACA,MAAA,MAAMA,oBAAG,SAAA,CAAU,UAAA,EAAY,eAAe,EAAE,MAAA,EAAQ,GAAG,CAAA;AAAA,IAC7D,CAAA,MAAO;AAEL,MAAA,MAAM,cAAA,GAAiB,MAAMA,mBAAA,CAAG,QAAA,CAAS,UAAU,CAAA;AAGnD,MAAA,IAAI,CAAC,eAAe,KAAA,EAAO;AACzB,QAAA,cAAA,CAAe,KAAA,GAAQ,YAAA;AACvB,QAAA,MAAMA,oBAAG,SAAA,CAAU,UAAA,EAAY,gBAAgB,EAAE,MAAA,EAAQ,GAAG,CAAA;AAAA,MAC9D;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AAEd,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,+CAAA,EAAkD,KAAK,CAAA,CAAE,CAAA;AAAA,EACxE;AACF;AAoCA,eAAsB,UAAA,CAAW,OAAA,GAK7B,EAAC,EAA4B;AAC/B,EAAA,MAAM;AAAA,IACJ,OAAA,GAAU,QAAQ,GAAA,EAAI;AAAA,IACtB,UAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAGJ,EAAA,MAAM,kBAAkB,OAAO,CAAA;AAE/B,EAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,OAAO,CAAA;AAGvC,EAAA,MAAA,CAAO,eAAA,EAAgB;AAGvB,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,MAAA,CAAO,YAAY,cAAc,CAAA;AAAA,EACzC;AAGA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,MAAA,CAAO,SAAS,UAAU,CAAA;AAAA,EAClC,CAAA,MAAO;AACL,IAAA,MAAM,OAAO,gBAAA,EAAiB;AAAA,EAChC;AAGA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAA,CAAO,QAAQ,SAAS,CAAA;AAAA,EAC1B;AAGA,EAAA,MAAM,YAAA,GAAe,OAAO,KAAA,EAAM;AAClC,EAAA,OAAO,eAAe,YAAY,CAAA;AACpC;;;AEzxBA,YAAA,EAAA;;;ACAA,YAAA,EAAA;AAgCO,IAAK,YAAA,qBAAA4D,aAAAA,KAAL;AAEL,EAAAA,cAAA,mBAAA,CAAA,GAAoB,uBAAA;AACpB,EAAAA,cAAA,oBAAA,CAAA,GAAqB,wBAAA;AACrB,EAAAA,cAAA,oBAAA,CAAA,GAAqB,wBAAA;AACrB,EAAAA,cAAA,iBAAA,CAAA,GAAkB,qBAAA;AAClB,EAAAA,cAAA,qBAAA,CAAA,GAAsB,yBAAA;AAGtB,EAAAA,cAAA,gBAAA,CAAA,GAAiB,oBAAA;AACjB,EAAAA,cAAA,uBAAA,CAAA,GAAwB,2BAAA;AACxB,EAAAA,cAAA,cAAA,CAAA,GAAe,kBAAA;AACf,EAAAA,cAAA,wBAAA,CAAA,GAAyB,4BAAA;AAGzB,EAAAA,cAAA,qBAAA,CAAA,GAAsB,yBAAA;AACtB,EAAAA,cAAA,mBAAA,CAAA,GAAoB,uBAAA;AACpB,EAAAA,cAAA,kBAAA,CAAA,GAAmB,sBAAA;AAGnB,EAAAA,cAAA,mBAAA,CAAA,GAAoB,uBAAA;AACpB,EAAAA,cAAA,iBAAA,CAAA,GAAkB,qBAAA;AAClB,EAAAA,cAAA,oBAAA,CAAA,GAAqB,wBAAA;AACrB,EAAAA,cAAA,oBAAA,CAAA,GAAqB,wBAAA;AAGrB,EAAAA,cAAA,kBAAA,CAAA,GAAmB,sBAAA;AACnB,EAAAA,cAAA,uBAAA,CAAA,GAAwB,2BAAA;AACxB,EAAAA,cAAA,uBAAA,CAAA,GAAwB,2BAAA;AACxB,EAAAA,cAAA,gBAAA,CAAA,GAAiB,oBAAA;AAGjB,EAAAA,cAAA,gBAAA,CAAA,GAAiB,oBAAA;AACjB,EAAAA,cAAA,kBAAA,CAAA,GAAmB,sBAAA;AACnB,EAAAA,cAAA,kBAAA,CAAA,GAAmB,sBAAA;AAGnB,EAAAA,cAAA,uBAAA,CAAA,GAAwB,2BAAA;AACxB,EAAAA,cAAA,cAAA,CAAA,GAAe,kBAAA;AACf,EAAAA,cAAA,eAAA,CAAA,GAAgB,mBAAA;AAvCN,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;AA6CL,IAAM,mBAAA,GAAsB;AAAA;AAAA,EAEjC,kCAAA;AAAA;AAAA,EAGA,yCAAA;AAAA;AAAA,EAGA,oDAAA;AAAA,EACA,yCAAA;AAAA;AAAA,EAGA,kDAAA;AAAA,EACA,4CAAA;AAAA;AAAA,EAGA,+DAAA;AAAA,EACA;AACF;AA0HO,IAAe,QAAA,GAAf,cAAgC,KAAA,CAAM;AAAA;AAAA,EAE3B,IAAA;AAAA;AAAA,EAGA,IAAA;AAAA;AAAA,EAGA,SAAA;AAAA;AAAA,EAGA,OAAA;AAAA;AAAA,EAGA,SAAA;AAAA;AAAA,EAGA,mBAAA;AAAA;AAAA,EAGA,QAAA;AAAA;AAAA,EAGA,KAAA;AAAA,EAEhB,WAAA,CACE,OAAA,EACA,IAAA,EACA,IAAA,EACA,OAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,KAAK,WAAA,CAAY,IAAA;AAC7B,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,SAAS,IAAA,IAAQ,IAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,UAAU,OAAA,EAAS,OAAA;AACxB,IAAA,IAAA,CAAK,YAAY,OAAA,EAAS,SAAA;AAC1B,IAAA,IAAA,CAAK,sBAAsB,OAAA,EAAS,mBAAA;AACpC,IAAA,IAAA,CAAK,WAAW,OAAA,EAAS,QAAA;AACzB,IAAA,IAAA,CAAK,QAAQ,OAAA,EAAS,KAAA;AAGtB,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,IAAA,EAAM,IAAA,CAAK,WAAW,CAAA;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA8B;AAC5B,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,CAAA,OAAA,EAAU,KAAK,IAAI,CAAA,CAAA;AAAA,MACnB,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,CAAA;AAAA,MAClB,CAAA,MAAA,EAAS,KAAK,IAAI,CAAA,CAAA;AAAA,MAClB,CAAA,SAAA,EAAY,KAAK,OAAO,CAAA,CAAA;AAAA,MACxB,CAAA,WAAA,EAAc,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,CAAA;AAAA,KAC5C;AAEA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,SAAA,EAAY,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,OAAA,CAAQ,IAAA,CAAK,UAAU,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,CAAE,CAAA;AAAA,IAC/E;AAEA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,OAAA,EAAU,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,OAAO,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,WAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,aAAA,EAAe;AAClC,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,cAAc,OAAA,EAAQ,GAAI,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAkC;AAChC,IAAA,OAAO;AAAA,MACL,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,WAAA,EAAY;AAAA,MACtC,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,qBAAqB,IAAA,CAAK,mBAAA;AAAA,MAC1B,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,EACF;AACF,CAAA;AASO,IAAM,kBAAA,GAAN,MAAM,mBAAA,SAA2B,QAAA,CAAS;AAAA;AAAA,EAE/B,UAAA;AAAA,EAEhB,WAAA,CACE,OAAA,EACA,OAAA,EACA,UAAA,EACA,OAAA,EACA;AACA,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,uBAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,SAAS,mBAAA,IAAuB;AAAA,MAClD,oCAAA;AAAA,MACA,oCAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,CAAM,OAAA,EAAS,+BAAyB,IAAA,EAAM;AAAA,MAC5C,GAAG,OAAA;AAAA,MACH,OAAA;AAAA,MACA,mBAAA,EAAqB;AAAA,KACtB,CAAA;AAED,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAA,CAAQ,SAAA,EAAmB,UAAA,EAAyC;AACzE,IAAA,OAAO,IAAI,mBAAA;AAAA,MACT,4BAA4B,SAAS,CAAA,EAAA,CAAA;AAAA,MACrC,oBAAA;AAAA,MACA,aAAa,EAAE,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQ,WAAU,GAAI,MAAA;AAAA,MACvD;AAAA,QACE,IAAA,EAAM,wBAAA;AAAA,QACN,mBAAA,EAAqB;AAAA,UACnB,mCAAA;AAAA,UACA,6BAAA;AAAA,UACA;AAAA;AACF;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAA,CAAQ,UAAA,EAAoB,IAAA,EAAmC;AACpE,IAAA,OAAO,IAAI,mBAAA;AAAA,MACT,yBAAyB,UAAU,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,IAAI,KAAK,EAAE,CAAA,CAAA;AAAA,MAC5D,oBAAA;AAAA,MACA,EAAE,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQ,SAAA,EAAU;AAAA,MACtC;AAAA,QACE,IAAA,EAAM,wBAAA;AAAA,QACN,mBAAA,EAAqB;AAAA,UACnB,wCAAA;AAAA,UACA,+BAAA;AAAA,UACA;AAAA;AACF;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,eAAe,UAAA,EAAwC;AAC5D,IAAA,OAAO,IAAI,mBAAA;AAAA,MACT,iCAAiC,UAAU,CAAA,CAAA;AAAA,MAC3C,kBAAA;AAAA,MACA,EAAE,IAAA,EAAM,UAAA,EAAY,MAAA,EAAQ,WAAA,EAAY;AAAA,MACxC;AAAA,QACE,IAAA,EAAM,sBAAA;AAAA,QACN,mBAAA,EAAqB;AAAA,UACnB,gCAAA;AAAA,UACA,+BAAA;AAAA,UACA,gCAAA;AAAA,UACA;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AASO,IAAM,YAAA,GAAN,MAAM,aAAA,SAAqB,QAAA,CAAS;AAAA;AAAA,EAEzB,QAAA;AAAA;AAAA,EAGA,gBAAA;AAAA,EAEhB,WAAA,CACE,OAAA,EACA,QAAA,EACA,OAAA,EACA,OAAA,EACA;AACA,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,2BAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,SAAS,mBAAA,IAAuB;AAAA,MAClD,qCAAA;AAAA,MACA,yCAAA;AAAA,MACA,2BAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,CAAM,OAAA,EAAS,uCAA6B,IAAA,EAAM;AAAA,MAChD,GAAG,OAAA;AAAA,MACH,OAAA;AAAA,MACA,mBAAA,EAAqB;AAAA,KACtB,CAAA;AAED,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,mBAAmB,OAAA,EAAS,gBAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS,QAAA,EAAgC;AAC9C,IAAA,OAAO,IAAI,aAAA;AAAA,MACT,mBAAmB,QAAQ,CAAA,CAAA;AAAA,MAC3B,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,SAAA,EAAU;AAAA,MACtC,gBAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,oBAAA;AAAA,QACN,mBAAA,EAAqB;AAAA,UACnB,wCAAA;AAAA,UACA,2BAAA;AAAA,UACA;AAAA;AACF;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,OAAA,CACL,QAAA,EACA,SAAA,EACA,gBAAA,EACc;AACd,IAAA,OAAO,IAAI,aAAA;AAAA,MACT,CAAA,wBAAA,EAA2B,QAAQ,CAAA,EAAA,EAAK,SAAS,CAAA,GAAA,CAAA;AAAA,MACjD,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,SAAA,EAAU;AAAA,MACtC,cAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,kBAAA;AAAA,QACN,gBAAA;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,iCAAA;AAAA,UACA,0CAAA;AAAA,UACA;AAAA;AACF;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,gBAAA,CACL,QAAA,EACA,WAAA,EACA,cAAA,EACc;AACd,IAAA,OAAO,IAAI,aAAA;AAAA,MACT,+BAA+B,QAAQ,CAAA,CAAA;AAAA,MACvC,EAAE,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,SAAA,EAAU;AAAA,MACtC,qBAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,4BAAA;AAAA,QACN,QAAA,EAAU,EAAE,WAAA,EAAa,cAAA,EAAe;AAAA,QACxC,mBAAA,EAAqB;AAAA,UACnB,iDAAA;AAAA,UACA,mCAAA;AAAA,UACA;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AASO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAwB,QAAA,CAAS;AAAA;AAAA,EAE5B,SAAA;AAAA;AAAA,EAGA,aAAA;AAAA,EAEhB,WAAA,CACE,OAAA,EACA,SAAA,EACA,aAAA,EACA,SACA,OAAA,EACA;AACA,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,wBAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,SAAS,mBAAA,IAAuB;AAAA,MAClD,wBAAA;AAAA,MACA,4BAAA;AAAA,MACA,6BAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,CAAM,OAAA,EAAS,yBAAsB,IAAA,EAAM;AAAA,MACzC,GAAG,OAAA;AAAA,MACH,OAAA;AAAA,MACA,mBAAA,EAAqB;AAAA,KACtB,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAW,SAAA,EAAoC;AACpD,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT,4BAA4B,SAAS,CAAA,EAAA,CAAA;AAAA,MACrC,SAAA;AAAA,MACA,YAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,wBAAA;AAAA,QACN,mBAAA,EAAqB;AAAA,UACnB,6BAAA;AAAA,UACA,2BAAA;AAAA,UACA;AAAA;AACF;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,aAAA,CAAc,QAAA,EAAkB,SAAA,EAAoC;AACzE,IAAA,OAAO,IAAI,gBAAA;AAAA,MACT,CAAA,wBAAA,EAA2B,QAAQ,CAAA,EAAA,EAAK,SAAS,CAAA,GAAA,CAAA;AAAA,MACjD,SAAA;AAAA,MACA,gBAAA;AAAA,MACA,QAAQ,QAAQ,CAAA,CAAA;AAAA,MAChB;AAAA,QACE,IAAA,EAAM,kBAAA;AAAA,QACN,mBAAA,EAAqB;AAAA,UACnB,iCAAA;AAAA,UACA,0BAAA;AAAA,UACA;AAAA;AACF;AACF,KACF;AAAA,EACF;AACF,CAAA;AASO,IAAM,iBAAA,GAAN,MAAM,kBAAA,SAA0B,QAAA,CAAS;AAAA;AAAA,EAE9B,SAAA;AAAA;AAAA,EAGA,IAAA;AAAA;AAAA,EAGA,SAAA;AAAA;AAAA,EAGA,MAAA;AAAA,EAEhB,YACE,OAAA,EACA,SAAA,GAAoB,GACpB,SAAA,EACA,IAAA,EACA,SACA,OAAA,EACA;AACA,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,yBAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,SAAA,GAAY,IAAA,CAAK,IAAA,CAAA,CAAM,SAAA,CAAU,OAAA,EAAQ,GAAI,IAAA,CAAK,GAAA,EAAI,IAAK,GAAI,CAAA,GAAI,CAAA;AACpF,IAAA,MAAM,WAAA,GAAc,SAAS,mBAAA,IAAuB;AAAA,MAClD,CAAA,KAAA,EAAQ,QAAA,GAAW,CAAA,GAAI,QAAA,GAAW,aAAa,sBAAsB,CAAA,CAAA;AAAA,MACrE,0BAAA;AAAA,MACA,2BAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,CAAM,OAAA,EAAS,+BAAyB,IAAA,EAAM;AAAA,MAC5C,GAAG,OAAA;AAAA,MACH,OAAA;AAAA,MACA,mBAAA,EAAqB,WAAA;AAAA,MACrB,WAAW,SAAA,GAAY;AAAA,QACrB,OAAA,EAAS,CAAA;AAAA,QACT,WAAA,EAAa,CAAA;AAAA,QACb,aAAA,EAAe,SAAA;AAAA,QACf,QAAA,EAAU;AAAA,UACR,OAAA,EAAS;AAAA,KACd,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,WAAA,CAAY,OAAA,EAAiB,OAAA,EAAqC;AACvE,IAAA,MAAM,SAAA,GAAY,wBAAwB,OAAO,CAAA;AAGjD,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,KAAA,CAAM,2CAA2C,CAAA;AAChF,IAAA,MAAM,YAAY,cAAA,GAAiB,QAAA,CAAS,eAAe,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAGrE,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,6BAA6B,CAAA;AAC7D,IAAA,MAAM,IAAA,GAAO,SAAA,GAAY,SAAA,CAAU,CAAC,CAAA,GAAI,MAAA;AAExC,IAAA,OAAO,IAAI,kBAAA;AAAA,MACT,OAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,yBAAA;AAAA,QACN,QAAA,EAAU,EAAE,eAAA,EAAiB,OAAA;AAAQ;AACvC,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAA,CAAO,SAAA,EAAiB,SAAA,GAAoB,CAAA,EAAsB;AACvE,IAAA,OAAO,IAAI,kBAAA;AAAA,MACT,CAAA,sCAAA,EAAyC,SAAA,CAAU,kBAAA,EAAoB,CAAA,CAAA;AAAA,MACvE,SAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,uBAAA;AAAA;AACR,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAA,CAAM,SAAA,EAAiB,SAAA,GAAoB,CAAA,EAAsB;AACtE,IAAA,OAAO,IAAI,kBAAA;AAAA,MACT,wCAAwC,SAAA,CAAU,kBAAA,EAAoB,CAAA,CAAA,EAAI,SAAA,CAAU,oBAAoB,CAAA,CAAA;AAAA,MACxG,SAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,sBAAA;AAAA;AACR,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,UAAU,OAAA,EAAQ,GAAI,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,aAAA,KAAkB,GAAI,CAAA;AAAA,EAC9C;AACF,CAAA;AASO,IAAM,kBAAA,GAAN,MAAM,mBAAA,SAA2B,QAAA,CAAS;AAAA;AAAA,EAE/B,IAAA;AAAA;AAAA,EAGA,KAAA;AAAA;AAAA,EAGA,QAAA;AAAA;AAAA,EAGA,KAAA;AAAA,EAEhB,YACE,OAAA,EACA,IAAA,EACA,OACA,QAAA,EACA,KAAA,EACA,SACA,OAAA,EACA;AACA,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,IAAQ,uBAAA;AAC9B,IAAA,MAAM,WAAA,GAAc,SAAS,mBAAA,IAAuB;AAAA,MAClD,mCAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,CAAM,OAAA,EAAS,+BAAyB,IAAA,EAAM;AAAA,MAC5C,GAAG,OAAA;AAAA,MACH,OAAA;AAAA,MACA,mBAAA,EAAqB;AAAA,KACtB,CAAA;AAED,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,SAAS,KAAA,EAAmC;AACjD,IAAA,OAAO,IAAI,mBAAA;AAAA,MACT,2BAA2B,KAAK,CAAA,CAAA;AAAA,MAChC,UAAA;AAAA,MACA,MAAA;AAAA,MACA,iBAAA;AAAA,MACA,KAAA;AAAA,MACA,sBAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,wBAAA;AAAA;AACR,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,YAAA,CACL,KAAA,EACA,KAAA,EACA,YAAA,EACoB;AACpB,IAAA,OAAO,IAAI,mBAAA;AAAA,MACT,2BAA2B,KAAK,CAAA,YAAA,EAAe,YAAY,CAAA,MAAA,EAAS,OAAO,KAAK,CAAA,CAAA;AAAA,MAChF,eAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,wBAAA;AAAA;AACR,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,MAAA,CACL,KAAA,EACA,KAAA,EACA,cAAA,EACoB;AACpB,IAAA,OAAO,IAAI,mBAAA;AAAA,MACT,CAAA,0BAAA,EAA6B,KAAK,CAAA,YAAA,EAAe,cAAc,CAAA,CAAA;AAAA,MAC/D,QAAA;AAAA,MACA,KAAA;AAAA,MACA,cAAA;AAAA,MACA,KAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,wBAAA;AAAA;AACR,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,KAAA,CACL,KAAA,EACA,KAAA,EACA,KACA,GAAA,EACoB;AACpB,IAAA,MAAM,QAAQ,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,MAAA,GACvC,GAAG,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,GACb,QAAQ,MAAA,GACN,CAAA,GAAA,EAAM,GAAG,CAAA,CAAA,GACT,MAAM,GAAG,CAAA,CAAA;AAEf,IAAA,OAAO,IAAI,mBAAA;AAAA,MACT,CAAA,8BAAA,EAAiC,KAAK,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA;AAAA,MAC1D,OAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,wBAAA;AAAA;AACR,KACF;AAAA,EACF;AACF;AASO,SAAS,wBAAwB,OAAA,EAAmC;AACzE,EAAA,KAAA,MAAW,WAAW,mBAAA,EAAqB;AACzC,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACnC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI;AACF,QAAA,OAAO,mBAAmB,KAAK,CAAA;AAAA,MACjC,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,mBAAmB,KAAA,EAA2C;AACrE,EAAA,MAAM,GAAG,KAAA,EAAO,KAAA,EAAO,MAAM,CAAA,GAAI,KAAA;AAGjC,EAAA,IAAI,KAAA,IAAS,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAChC,IAAA,OAAO,IAAI,KAAK,KAAK,CAAA;AAAA,EACvB;AAGA,EAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,IAAU,EAAA,EAAI;AAC/B,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACpC,IAAA,OAAO,IAAI,IAAA,CAAK,SAAA,GAAY,UAAA,GAAa,SAAA,GAAY,YAAY,GAAI,CAAA;AAAA,EACvE;AAGA,EAAA,IAAI,KAAA,KAAU,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,MAAM,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,CAAA,EAAI;AAC7F,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,MAAM,WAAA,EAAY;AAC/B,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC3B,MAAA,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,SAAQ,GAAI,QAAA,GAAW,KAAK,GAAI,CAAA;AAAA,IACtD,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AAChC,MAAA,OAAO,IAAI,KAAK,GAAA,CAAI,OAAA,KAAY,QAAA,GAAW,EAAA,GAAK,KAAK,GAAI,CAAA;AAAA,IAC3D,CAAA,MAAA,IAAW,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAG;AAClC,MAAA,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAQ,GAAI,WAAW,GAAI,CAAA;AAAA,IACjD;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAC/B,IAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA,GAAI,CAAA;AAC7C,IAAA,IAAI,YAAA,GAAe,IAAA;AAEnB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,WAAA,EAAY,CAAE,SAAS,IAAI,CAAA;AAC/C,MAAA,IAAI,IAAA,IAAQ,OAAO,EAAA,EAAI;AACrB,QAAA,YAAA,IAAgB,EAAA;AAAA,MAClB,CAAA,MAAA,IAAW,CAAC,IAAA,IAAQ,IAAA,KAAS,EAAA,EAAI;AAC/B,QAAA,YAAA,GAAe,CAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,uBAAgB,IAAA,EAAK;AAC3B,IAAA,SAAA,CAAU,QAAA,CAAS,YAAA,EAAc,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAG7C,IAAA,IAAI,SAAA,oBAAa,IAAI,IAAA,EAAK,EAAG;AAC3B,MAAA,SAAA,CAAU,OAAA,CAAQ,SAAA,CAAU,OAAA,EAAQ,GAAI,CAAC,CAAA;AAAA,IAC3C;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,WAAW,KAAA,EAAmC;AAC5D,EAAA,OAAO,KAAA,YAAiB,QAAA;AAC1B;AAKO,SAAS,kBAAkB,KAAA,EAA6C;AAC7E,EAAA,OAAO,KAAA,YAAiB,kBAAA;AAC1B;AAKO,SAAS,YAAY,KAAA,EAAuC;AACjE,EAAA,OAAO,KAAA,YAAiB,YAAA;AAC1B;AAKO,SAAS,eAAe,KAAA,EAA0C;AACvE,EAAA,OAAO,KAAA,YAAiB,eAAA;AAC1B;AAKO,SAAS,iBAAiB,KAAA,EAA4C;AAC3E,EAAA,OAAO,KAAA,YAAiB,iBAAA;AAC1B;AAKO,SAAS,kBAAkB,KAAA,EAA6C;AAC7E,EAAA,OAAO,KAAA,YAAiB,kBAAA;AAC1B;AAKO,SAAS,iBAAiB,KAAA,EAAyB;AACxD,EAAA,IAAI,CAAC,UAAA,CAAW,KAAK,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAM,WAAA,EAAY;AAC3B;AAKO,SAAS,iBAAiB,KAAA,EAA0C;AACzE,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,EAAG;AACrB,IAAA,OAAO,KAAA,CAAM,IAAA;AAAA,EACf;AACA,EAAA,OAAO,SAAA;AACT;AAKO,SAAS,mBAAmB,KAAA,EAAwB;AACzD,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,EAAG;AACrB,IAAA,OAAO,MAAM,cAAA,EAAe;AAAA,EAC9B;AAEA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AAEA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAKO,SAAS,sBAAsB,KAAA,EAAwB;AAC5D,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,EAAG;AACrB,IAAA,OAAO,MAAM,mBAAA,EAAoB;AAAA,EACnC;AAEA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,MAAM,OAAO;AAAA,EAAK,KAAA,CAAM,SAAS,gBAAgB,CAAA,CAAA;AAAA,EAC5E;AAEA,EAAA,OAAO,CAAA,eAAA,EAAkB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA,CAAA;AAChD;AAKO,SAAS,uBAAuB,KAAA,EAA0B;AAC/D,EAAA,IAAI,UAAA,CAAW,KAAK,CAAA,IAAK,KAAA,CAAM,mBAAA,EAAqB;AAClD,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA;AAAA,EAC7C;AAGA,EAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,4BAAA;AAAA,MACA,0BAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO;AAAA,MACL,2BAAA;AAAA,MACA,0BAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAO;AAAA,MACL,wBAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,iCAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,iBAAiB,MAAA,EAA2B;AAC1D,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,IAAI,kBAAA,CAAmB,wBAAA,EAA0B,aAAa,CAAA;AAAA,EACvE;AAEA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,MAAM,KAAA,GAAQ,OAAO,CAAC,CAAA;AACtB,IAAA,IAAI,UAAA,CAAW,KAAK,CAAA,EAAG;AACrB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAI,kBAAA,CAAmB,KAAA,CAAM,OAAA,EAAS,iBAAiB,MAAA,EAAW;AAAA,MACvE,KAAA,EAAO;AAAA,KACR,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,YAAA,GAAe,OAAO,CAAC,CAAA;AAC7B,EAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA;AAEvC,EAAA,OAAO,IAAI,kBAAA;AAAA,IACT,CAAA,0BAAA,EAA6B,aAAa,OAAO,CAAA,CAAA;AAAA,IACjD,aAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,YAAA;AAAA,MACP,QAAA,EAAU;AAAA,QACR,gBAAA,EAAkB,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,UAC3C,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,SAAS,CAAA,CAAE;AAAA,SACb,CAAE;AAAA,OACJ;AAAA,MACA,mBAAA,EAAqB;AAAA,QACnB,iCAAA;AAAA,QACA,8BAAA;AAAA,QACA;AAAA;AACF;AACF,GACF;AACF;AAoBO,SAAS,oBAAoB,KAAA,EAAuC;AACzE,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAO,WAAA;AAAA,EACT;AAEA,EAAA,IAAI,cAAA,CAAe,KAAK,CAAA,EAAG;AACzB,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,IAAI,iBAAA,CAAkB,KAAK,CAAA,EAAG;AAC5B,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,oBACd,KAAA,EACA,OAAA,EACA,SAAA,GAAoB,GAAA,EACpB,WAAmB,GAAA,EACX;AACR,EAAA,IAAI,gBAAA,CAAiB,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,MAAM,aAAA,EAAc;AAAA,EAC7B;AAGA,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA,EAAG,QAAQ,CAAA;AAChF,EAAA,MAAM,MAAA,GAAS,gBAAA,GAAmB,GAAA,IAAO,IAAA,CAAK,QAAO,GAAI,GAAA,CAAA;AAEzD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,gBAAA,GAAmB,MAAM,CAAA;AAC9C;;;ACzsCA,YAAA,EAAA;;;ACAA,YAAA,EAAA;;;ACAA,YAAA,EAAA;;;ACAA,YAAA,EAAA;;;ACAA,YAAA,EAAA;AAAe,SAAR,UAA2B,EAAC,SAAA,GAAY,KAAA,EAAK,GAAI,EAAC,EAAG;AAE3D,EAAA,MAAM,EAAA,GAAK,oCAAA;AAGX,EAAA,MAAM,GAAA,GAAM,0BAA0B,EAAE,CAAA,CAAA,CAAA;AAGxC,EAAA,MAAM,GAAA,GAAM,oFAAA;AAEZ,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAE7B,EAAA,OAAO,IAAI,MAAA,CAAO,OAAA,EAAS,SAAA,GAAY,SAAY,GAAG,CAAA;AACvD;;;ADXA,IAAM,QAAQ,SAAA,EAAU;AAET,SAAR,UAA2B,MAAA,EAAQ;AACzC,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC/B,IAAA,MAAM,IAAI,SAAA,CAAU,CAAA,6BAAA,EAAgC,OAAO,MAAM,CAAA,EAAA,CAAI,CAAA;AAAA,EACtE;AAKA,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAChC;AD2EO,IAAM,gBAAN,MAAoB;AAAA,EACjB,YAAA;AAAA,EACA,aAAA;AAAA,EAER,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,YAAA,GAAehE,8BAAA,CAAc,MAAA,GAAS,IAAA,GAAO,KAAA;AAClD,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,EAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,IAAA,EAAiB,OAAA,GAAwB,EAAC,EAAW;AACzD,IAAA,MAAM,QAAQ,IAAIiE,sBAAA,CAAM,IAAA,CAAK,cAAA,CAAe,OAAO,CAAC,CAAA;AAGpD,IAAA,IAAI,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,OAAA,EAAS;AACnC,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,WAAW,EAAC;AACpD,MAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,IAAW,IAAA,CAAK,YAAA,EAAc;AAChD,QAAA,MAAM,iBAAiB,OAAA,CAAQ,GAAA;AAAA,UAAI,YACjCrC,uBAAA,CAAM,OAAA,CAAQ,QAAQ,MAAA,CAAQ,OAAQ,EAAE,MAAM;AAAA,SAChD;AACA,QAAA,KAAA,CAAM,KAAK,cAAc,CAAA;AAAA,MAC3B;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,GAAA,KAAO;AACvB,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,IAChB,CAAC,CAAA;AAED,IAAA,IAAI,MAAA,GAAS,MAAM,QAAA,EAAS;AAG5B,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,MAAA,EAAQ,KAAA,IAAS,MAAA;AAC5C,MAAA,MAAM,YAAA,GAAe,IAAA,CAAK,YAAA,GACtBA,uBAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,CAAE,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,GAC5C,OAAA,CAAQ,KAAA;AAEZ,MAAA,MAAM,YAAY,IAAA,CAAK,UAAA,CAAW,cAAc,IAAA,CAAK,aAAA,CAAc,OAAO,CAAC,CAAA;AAC3E,MAAA,MAAA,GAAS,YAAY,IAAA,GAAO,MAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,OAAA,EAAiB,OAAA,GAAwB,EAAC,EAAW;AACzD,IAAA,MAAM;AAAA,MACJ,KAAA;AAAA,MACA,MAAA,GAAS,SAAA;AAAA,MACT,OAAA,GAAU,CAAA;AAAA,MACV,KAAA,GAAQ,KAAK,aAAA,GAAgB,CAAA;AAAA,MAC7B,KAAA,GAAQ,SAAA;AAAA,MACR,KAAA,GAAQ;AAAA,KACV,GAAI,OAAA;AAEJ,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,MAAM,CAAA;AAC9C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAG7C,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,IAAA,MAAM,YAAA,GAAe,KAAA,GAAS,OAAA,GAAU,CAAA,GAAK,CAAA;AAE7C,IAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,CAAQ,CAAA,IAAA,KAAQ,KAAK,QAAA,CAAS,IAAA,EAAM,YAAY,CAAC,CAAA;AAG9E,IAAA,MAAM,aAAuB,EAAC;AAG9B,IAAA,MAAM,SAAA,GAAY,YAAY,OAAA,GACb,WAAA,CAAY,WAAW,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,GACvC,WAAA,CAAY,QAAA;AAC7B,IAAA,UAAA,CAAW,KAAK,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,WAAA,CAAY,MAAM,CAAC,CAAA;AAG5D,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,SAAA,GAAY,YAAY,QAAA,GACb,IAAA,CAAK,WAAW,KAAA,EAAO,KAAA,GAAQ,CAAC,CAAA,GAChC,WAAA,CAAY,QAAA;AAC7B,MAAA,UAAA,CAAW,KAAK,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,WAAA,CAAY,MAAM,CAAC,CAAA;AAG5D,MAAA,MAAM,SAAA,GAAY,YAAY,IAAA,GACb,WAAA,CAAY,WAAW,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,GACvC,WAAA,CAAY,KAAA;AAC7B,MAAA,UAAA,CAAW,KAAK,IAAA,CAAK,QAAA,CAAS,SAAA,EAAW,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,IAC9D;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,MAAA,MAAM,WAAA,GAAc,YAAY,QAAA,GACb,GAAA,CAAI,OAAO,KAAA,GAAQ,CAAC,IACpB,WAAA,CAAY,QAAA;AAC/B,MAAA,UAAA,CAAW,KAAK,IAAA,CAAK,QAAA,CAAS,WAAA,EAAa,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,IAChE;AAGA,IAAA,cAAA,CAAe,QAAQ,CAAA,IAAA,KAAQ;AAC7B,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,cAAc,KAAK,CAAA;AAC/D,MAAA,MAAM,aAAA,GAAgB,IAAI,MAAA,CAAO,OAAO,IAAI,cAAA,GAAiB,GAAA,CAAI,OAAO,OAAO,CAAA;AAC/E,MAAoB,WAAA,CAAY,QAAA,GACb,aAAA,GACA,WAAA,CAAY;AAE/B,MAAA,MAAM,iBAAiB,IAAA,CAAK,QAAA,CAAS,YAAY,QAAA,EAAU,WAAA,CAAY,MAAM,CAAA,GACvD,IAAA,CAAK,SAAS,aAAA,EAAe,WAAA,CAAY,OAAO,CAAA,GAChD,IAAA,CAAK,SAAS,WAAA,CAAY,QAAA,EAAU,YAAY,MAAM,CAAA;AAE5E,MAAA,UAAA,CAAW,KAAK,cAAc,CAAA;AAAA,IAChC,CAAC,CAAA;AAGD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,EAAS,CAAA,EAAA,EAAK;AAChC,MAAA,MAAM,WAAA,GAAc,YAAY,QAAA,GACb,GAAA,CAAI,OAAO,KAAA,GAAQ,CAAC,IACpB,WAAA,CAAY,QAAA;AAC/B,MAAA,UAAA,CAAW,KAAK,IAAA,CAAK,QAAA,CAAS,WAAA,EAAa,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,IAChE;AAGA,IAAA,MAAM,YAAA,GAAe,YAAY,UAAA,GACb,WAAA,CAAY,WAAW,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAA,GACvC,WAAA,CAAY,WAAA;AAChC,IAAA,UAAA,CAAW,KAAK,IAAA,CAAK,QAAA,CAAS,YAAA,EAAc,WAAA,CAAY,MAAM,CAAC,CAAA;AAE/D,IAAA,OAAO,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAK,IAAA,EAAgB,OAAA,GAAuB,EAAC,EAAW;AACtD,IAAA,MAAM;AAAA,MACJ,SAAA,GAAY,IAAA;AAAA,MACZ,YAAA,GAAe,KAAA;AAAA,MACf,QAAA,GAAW,EAAA;AAAA,MACX,KAAA,GAAQ,IAAA;AAAA,MACR,MAAA,GAAS;AAAA,QACP,SAAA,EAAW,MAAA;AAAA,QACX,IAAA,EAAM,OAAA;AAAA,QACN,QAAA,EAAU;AAAA;AACZ,KACF,GAAI,OAAA;AAEJ,IAAA,OAAO,KAAK,cAAA,CAAe,IAAA,EAAM,CAAA,EAAG,EAAA,EAAI,SAAS,IAAI,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CAAY,QAAA,EAAkB,OAAA,GAA8B,EAAC,EAAW;AACtE,IAAA,MAAM;AAAA,MACJ,KAAA,GAAQ,EAAA;AAAA,MACR,SAAA,GAAY,QAAA;AAAA,MACZ,UAAA,GAAa,QAAA;AAAA,MACb,cAAA,GAAiB,IAAA;AAAA,MACjB,OAAA,GAAU,IAAA;AAAA,MACV,KAAA,GAAQ,KAAA;AAAA,MACR,MAAA,GAAS;AAAA,QACP,SAAA,EAAW,OAAA;AAAA,QACX,UAAA,EAAY,MAAA;AAAA,QACZ,UAAA,EAAY;AAAA;AACd,KACF,GAAI,OAAA;AAEJ,IAAA,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAC,CAAA;AAC9C,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAO,QAAA,GAAW,MAAO,KAAK,CAAA;AAC1D,IAAA,MAAM,kBAAkB,KAAA,GAAQ,cAAA;AAEhC,IAAA,IAAI,GAAA,GAAM,EAAA;AAEV,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,aAAA,GAAgB,KAAK,QAAA,CAAS,SAAA,CAAU,OAAO,cAAc,CAAA,EAAG,OAAO,SAAS,CAAA;AACtF,MAAA,MAAM,cAAA,GAAiB,KAAK,QAAA,CAAS,UAAA,CAAW,OAAO,eAAe,CAAA,EAAG,OAAO,UAAU,CAAA;AAC1F,MAAA,GAAA,GAAM,aAAA,GAAgB,cAAA;AAAA,IACxB;AAEA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,QAAA,CAAS,QAAQ,CAAC,CAAC,CAAA,CAAA,CAAA,EAAK,MAAA,CAAO,UAAU,CAAA;AAC7E,MAAA,OAAO,OAAA,GAAU,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA,GAAK,UAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,IAAA,EAAsB;AAC3B,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAAA,IACvC;AAEA,IAAA,OAAO,IAAA,CACJ,QAAQ,0BAAA,EAA4B,CAAC,GAAG,OAAA,KAAYA,uBAAA,CAAM,KAAK,OAAO,CAAC,EACvE,OAAA,CAAQ,8BAAA,EAAgC,CAAC,CAAA,EAAG,OAAA,KAAYA,wBAAM,MAAA,CAAO,OAAO,CAAC,CAAA,CAC7E,OAAA,CAAQ,oCAAA,EAAsC,CAAC,CAAA,EAAG,OAAA,KAAYA,wBAAM,SAAA,CAAU,OAAO,CAAC,CAAA,CACtF,OAAA,CAAQ,wBAAA,EAA0B,CAAC,CAAA,EAAG,OAAA,KAAYA,wBAAM,GAAA,CAAI,OAAO,CAAC,CAAA,CACpE,OAAA,CAAQ,8BAA8B,CAAC,CAAA,EAAG,OAAA,KAAYA,uBAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,CAC1E,OAAA,CAAQ,4BAA4B,CAAC,CAAA,EAAG,YAAYA,uBAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CACvE,OAAA,CAAQ,gCAAgC,CAAC,CAAA,EAAG,YAAYA,uBAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA,CAC7E,OAAA,CAAQ,0BAAA,EAA4B,CAAC,CAAA,EAAG,YAAYA,uBAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CACvE,QAAQ,gCAAA,EAAkC,CAAC,CAAA,EAAG,OAAA,KAAYA,uBAAA,CAAM,OAAA,CAAQ,OAAO,CAAC,CAAA,CAChF,QAAQ,wBAAA,EAA0B,CAAC,GAAG,OAAA,KAAYA,uBAAA,CAAM,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAe,OAAA,EAA4B;AACjD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,WAAW,SAAS,CAAA;AAEjE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO;AAAA,QACL,cAAA,EAAgB,CAAA;AAAA,QAChB,eAAA,EAAiB,CAAA;AAAA,QACjB,IAAA,EAAM,OAAA,CAAQ,MAAA,EAAQ,OAAA,GAAU,CAAC,QAAQ,MAAA,CAAO,OAAO,CAAA,GAAI,CAAC,MAAM,CAAA;AAAA,QAClE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,MAAA,GAAS,CAAC,QAAQ,MAAA,CAAO,MAAM,CAAA,GAAI,CAAC,MAAM;AAAA,OACpE;AAAA,MACA,WAAW,OAAA,CAAQ,YAAA;AAAA,MACnB,WAAW,OAAA,CAAQ,KAAA;AAAA,MACnB,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEQ,gBAAgB,KAAA,EAAoB;AAC1C,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,SAAA;AACH,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,QAAA;AAAA,UAAK,SAAA,EAAW,QAAA;AAAA,UAAK,UAAA,EAAY,QAAA;AAAA,UAAK,WAAA,EAAa,QAAA;AAAA,UAC1D,QAAA,EAAU,QAAA;AAAA,UAAK,YAAA,EAAc,QAAA;AAAA,UAAK,aAAA,EAAe,QAAA;AAAA,UAAK,cAAA,EAAgB,QAAA;AAAA,UACtE,MAAA,EAAQ,QAAA;AAAA,UAAK,UAAA,EAAY,QAAA;AAAA,UAAK,KAAA,EAAO,QAAA;AAAA,UAAK,SAAA,EAAW,QAAA;AAAA,UACrD,OAAA,EAAS,QAAA;AAAA,UAAK,WAAA,EAAa,QAAA;AAAA,UAAK,QAAA,EAAU;AAAA,SAC5C;AAAA,MACF,KAAK,QAAA;AACH,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,QAAA;AAAA,UAAK,SAAA,EAAW,QAAA;AAAA,UAAK,UAAA,EAAY,QAAA;AAAA,UAAK,WAAA,EAAa,QAAA;AAAA,UAC1D,QAAA,EAAU,QAAA;AAAA,UAAK,YAAA,EAAc,QAAA;AAAA,UAAK,aAAA,EAAe,QAAA;AAAA,UAAK,cAAA,EAAgB,QAAA;AAAA,UACtE,MAAA,EAAQ,QAAA;AAAA,UAAK,UAAA,EAAY,QAAA;AAAA,UAAK,KAAA,EAAO,QAAA;AAAA,UAAK,SAAA,EAAW,QAAA;AAAA,UACrD,OAAA,EAAS,QAAA;AAAA,UAAK,WAAA,EAAa,QAAA;AAAA,UAAK,QAAA,EAAU;AAAA,SAC5C;AAAA,MACF,KAAK,OAAA;AACH,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,QAAA;AAAA,UAAK,SAAA,EAAW,QAAA;AAAA,UAAK,UAAA,EAAY,QAAA;AAAA,UAAK,WAAA,EAAa,QAAA;AAAA,UAC1D,QAAA,EAAU,QAAA;AAAA,UAAK,YAAA,EAAc,QAAA;AAAA,UAAK,aAAA,EAAe,QAAA;AAAA,UAAK,cAAA,EAAgB,QAAA;AAAA,UACtE,MAAA,EAAQ,QAAA;AAAA,UAAK,UAAA,EAAY,QAAA;AAAA,UAAK,KAAA,EAAO,QAAA;AAAA,UAAK,SAAA,EAAW,QAAA;AAAA,UACrD,OAAA,EAAS,QAAA;AAAA,UAAK,WAAA,EAAa,QAAA;AAAA,UAAK,QAAA,EAAU;AAAA,SAC5C;AAAA,MACF,KAAK,SAAA;AACH,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,EAAA;AAAA,UAAI,SAAA,EAAW,EAAA;AAAA,UAAI,UAAA,EAAY,EAAA;AAAA,UAAI,WAAA,EAAa,EAAA;AAAA,UACvD,QAAA,EAAU,EAAA;AAAA,UAAI,YAAA,EAAc,EAAA;AAAA,UAAI,aAAA,EAAe,EAAA;AAAA,UAAI,cAAA,EAAgB,EAAA;AAAA,UACnE,MAAA,EAAQ,EAAA;AAAA,UAAI,UAAA,EAAY,EAAA;AAAA,UAAI,KAAA,EAAO,EAAA;AAAA,UAAI,SAAA,EAAW,EAAA;AAAA,UAClD,OAAA,EAAS,EAAA;AAAA,UAAI,WAAA,EAAa,EAAA;AAAA,UAAI,QAAA,EAAU;AAAA,SAC1C;AAAA,MACF;AACE,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,GAAA;AAAA,UAAK,SAAA,EAAW,GAAA;AAAA,UAAK,UAAA,EAAY,GAAA;AAAA,UAAK,WAAA,EAAa,GAAA;AAAA,UAC1D,QAAA,EAAU,GAAA;AAAA,UAAK,YAAA,EAAc,GAAA;AAAA,UAAK,aAAA,EAAe,GAAA;AAAA,UAAK,cAAA,EAAgB,GAAA;AAAA,UACtE,MAAA,EAAQ,GAAA;AAAA,UAAK,UAAA,EAAY,GAAA;AAAA,UAAK,KAAA,EAAO,GAAA;AAAA,UAAK,SAAA,EAAW,GAAA;AAAA,UACrD,OAAA,EAAS,GAAA;AAAA,UAAK,WAAA,EAAa,GAAA;AAAA,UAAK,QAAA,EAAU;AAAA,SAC5C;AAAA;AACJ,EACF;AAAA,EAEQ,eAAe,KAAA,EAAoB;AACzC,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,SAAA;AACH,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UAAK,QAAA,EAAU,QAAA;AAAA,UAAK,UAAA,EAAY,QAAA;AAAA,UAAK,WAAA,EAAa,QAAA;AAAA,UAC3D,UAAA,EAAY,QAAA;AAAA,UAAK,QAAA,EAAU,QAAA;AAAA,UAAK,IAAA,EAAM,QAAA;AAAA,UAAK,KAAA,EAAO;AAAA,SACpD;AAAA,MACF,KAAK,QAAA;AACH,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UAAK,QAAA,EAAU,QAAA;AAAA,UAAK,UAAA,EAAY,QAAA;AAAA,UAAK,WAAA,EAAa,QAAA;AAAA,UAC3D,UAAA,EAAY,QAAA;AAAA,UAAK,QAAA,EAAU,QAAA;AAAA,UAAK,IAAA,EAAM,QAAA;AAAA,UAAK,KAAA,EAAO;AAAA,SACpD;AAAA,MACF,KAAK,OAAA;AACH,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UAAK,QAAA,EAAU,QAAA;AAAA,UAAK,UAAA,EAAY,QAAA;AAAA,UAAK,WAAA,EAAa,QAAA;AAAA,UAC3D,UAAA,EAAY,QAAA;AAAA,UAAK,QAAA,EAAU,QAAA;AAAA,UAAK,IAAA,EAAM,QAAA;AAAA,UAAK,KAAA,EAAO;AAAA,SACpD;AAAA,MACF,KAAK,SAAA;AACH,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,GAAA;AAAA,UAAK,QAAA,EAAU,GAAA;AAAA,UAAK,UAAA,EAAY,GAAA;AAAA,UAAK,WAAA,EAAa,GAAA;AAAA,UAC3D,UAAA,EAAY,GAAA;AAAA,UAAK,QAAA,EAAU,GAAA;AAAA,UAAK,IAAA,EAAM,GAAA;AAAA,UAAK,KAAA,EAAO;AAAA,SACpD;AAAA,MACF;AACE,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,QAAA;AAAA,UAAK,QAAA,EAAU,QAAA;AAAA,UAAK,UAAA,EAAY,QAAA;AAAA,UAAK,WAAA,EAAa,QAAA;AAAA,UAC3D,UAAA,EAAY,QAAA;AAAA,UAAK,QAAA,EAAU,QAAA;AAAA,UAAK,IAAA,EAAM,QAAA;AAAA,UAAK,KAAA,EAAO;AAAA,SACpD;AAAA;AACJ,EACF;AAAA,EAEQ,eAAe,KAAA,EAAoB;AACzC,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,MAAA;AACH,QAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAQ;AAAA,MAC5C,KAAK,SAAA;AACH,QAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,QAAA,EAAS;AAAA,MAC/C,KAAK,OAAA;AACH,QAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM;AAAA,MACzC,KAAK,SAAA;AACH,QAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAS,OAAA,EAAQ;AAAA,MAC7C;AACE,QAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,OAAA,EAAQ;AAAA;AAC9C,EACF;AAAA,EAEQ,QAAA,CAAS,MAAc,KAAA,EAAwB;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,IAAgB,CAAC,OAAO,OAAO,IAAA;AACzC,IAAA,OAAQA,uBAAA,CAAc,OAAA,CAAQ,KAAK,CAAA,CAAE,IAAI,CAAA;AAAA,EAC3C;AAAA,EAEQ,UAAA,CAAW,MAAc,KAAA,EAAuB;AACtD,IAAA,MAAM,SAAA,GAAY,UAAU,IAAI,CAAA;AAChC,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,UAAU,MAAM,CAAA;AACpD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,CAAC,CAAA;AAC1C,IAAA,MAAM,eAAe,OAAA,GAAU,WAAA;AAE/B,IAAA,OAAO,IAAI,MAAA,CAAO,WAAW,IAAI,IAAA,GAAO,GAAA,CAAI,OAAO,YAAY,CAAA;AAAA,EACjE;AAAA,EAEQ,SAAA,CAAU,IAAA,EAAc,KAAA,EAAe,KAAA,EAAuB;AACpE,IAAA,MAAM,SAAA,GAAY,UAAU,IAAI,CAAA;AAChC,IAAA,MAAM,UAAU,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,GAAQ,UAAU,MAAM,CAAA;AAEpD,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,IAAA,EAAM,KAAK,CAAA;AAAA,MACpC,KAAK,OAAA;AACH,QAAA,OAAO,GAAA,CAAI,MAAA,CAAO,OAAO,CAAA,GAAI,IAAA;AAAA,MAC/B;AACE,QAAA,OAAO,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,OAAO,CAAA;AAAA;AACpC,EACF;AAAA,EAEQ,QAAA,CAAS,MAAc,KAAA,EAAyB;AACtD,IAAA,IAAI,UAAU,IAAI,CAAA,CAAE,UAAU,KAAA,EAAO,OAAO,CAAC,IAAI,CAAA;AAEjD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,WAAA,GAAc,EAAA;AAElB,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,WAAW,WAAA,GAAc,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AAC1D,MAAA,IAAI,SAAA,CAAU,QAAQ,CAAA,CAAE,MAAA,IAAU,KAAA,EAAO;AACvC,QAAA,WAAA,GAAc,QAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,IAAI,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AACvC,QAAA,WAAA,GAAc,IAAA;AAAA,MAChB;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,WAAW,CAAA;AACvC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEQ,cAAc,OAAA,EAA+B;AACnD,IAAA,OAAO,OAAA,CAAQ,SAAS,IAAA,CAAK,aAAA;AAAA,EAC/B;AAAA,EAEQ,eACN,IAAA,EACA,KAAA,EACA,MAAA,EACA,OAAA,EACA,SAAkB,KAAA,EACV;AACR,IAAA,IAAI,KAAA,IAAS,OAAA,CAAQ,QAAA,IAAY,EAAA,CAAA,EAAK,OAAO,EAAA;AAE7C,IAAA,MAAM,EAAE,KAAA,GAAQ,IAAA,EAAM,MAAA,GAAS,IAAG,GAAI,OAAA;AACtC,IAAA,MAAM,QAAkB,EAAC;AAGzB,IAAA,MAAM,SAAA,GAAY,SAAS,qBAAA,GAAS,qBAAA;AACpC,IAAA,MAAM,OAAO,KAAA,IAAS,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA,GAAM,EAAA;AACpD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,YAAY,MAAA,CAAO,IAAA;AAC5D,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,MAAM,SAAS,CAAA;AAEtD,IAAA,KAAA,CAAM,IAAA,CAAK,MAAA,GAAS,SAAA,GAAY,IAAA,GAAO,WAAW,CAAA;AAGlD,IAAA,IAAI,OAAA,CAAQ,YAAA,IAAgB,IAAA,CAAK,QAAA,EAAU;AACzC,MAAA,MAAM,cAAc,MAAA,CAAO,OAAA,CAAQ,KAAK,QAAQ,CAAA,CAC7C,IAAI,CAAC,CAAC,KAAK,KAAK,CAAA,KAAM,GAAG,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA,CACxC,KAAK,IAAI,CAAA;AACZ,MAAA,MAAM,YAAA,GAAe,MAAA,IAAU,MAAA,GAAS,MAAA,GAAS,WAAA,CAAA,GAC7B,IAAA,CAAK,QAAA,CAAS,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,CAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AACrE,MAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AAAA,IACzB;AAGA,IAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAC7C,MAAA,MAAM,WAAA,GAAc,MAAA,IAAU,MAAA,GAAS,MAAA,GAAS,WAAA,CAAA;AAChD,MAAA,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,KAAA,EAAO,KAAA,KAAU;AACtC,QAAA,MAAM,WAAA,GAAc,KAAA,KAAU,IAAA,CAAK,QAAA,CAAU,MAAA,GAAS,CAAA;AACtD,QAAA,KAAA,CAAM,IAAA,CAAK,KAAK,cAAA,CAAe,KAAA,EAAO,QAAQ,CAAA,EAAG,WAAA,EAAa,OAAA,EAAS,WAAW,CAAC,CAAA;AAAA,MACrF,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AACF,CAAA;;;ADpeO,IAAK,QAAA,qBAAAsC,SAAAA,KAAL;AACL,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AACA,EAAAA,SAAAA,CAAAA,SAAAA,CAAA,WAAQ,CAAA,CAAA,GAAR,OAAA;AANU,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA,CAAA;AAiDL,IAAM,eAAN,MAAmB;AAAA,EAChB,aAAA;AAAA,EAER,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,aAAA,GAAgB,IAAI,aAAA,EAAc;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,OAAiB,OAAA,EAAgC;AACtD,IAAA,QAAQ,QAAQ,MAAA;AAAQ,MACtB,KAAK,QAAA;AACH,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,OAAO,CAAA;AAAA,MACzC,KAAK,UAAA;AACH,QAAA,OAAO,IAAA,CAAK,cAAA,CAAe,KAAA,EAAO,OAAO,CAAA;AAAA,MAC3C,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,WAAW,KAAK,CAAA;AAAA,MAC9B,KAAK,MAAA;AACH,QAAA,OAAO,IAAA,CAAK,UAAA,CAAW,KAAA,EAAO,OAAO,CAAA;AAAA,MACvC;AACE,QAAA,OAAO,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,OAAO,CAAA;AAAA;AAC3C,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,CAAa,OAAiB,OAAA,EAAgC;AACpE,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,MAAM,WAAW,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,QAAQ,QAAQ,CAAA;AAC/D,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,QAAA,GACzBtC,uBAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,CAAA,CAAG,CAAA,GAC/B,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,CAAA,CAAA;AACnB,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AAExB,IAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,QAAA,GAC1BA,uBAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,CAAA,GAAA,CAAK,CAAA,GAClC,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,CAAA,GAAA,CAAA;AACpB,MAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,IACxB;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,CAAe,OAAiB,OAAA,EAAgC;AACtE,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,SAAA,CAAU,WAAA,EAAY;AAC5C,MAAA,MAAM,gBAAgB,OAAA,CAAQ,QAAA,GAC5BA,uBAAAA,CAAM,IAAA,CAAK,OAAO,CAAA,GAClB,OAAA;AACF,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,aAAa,CAAA,CAAA,CAAG,CAAA;AAAA,IACjC;AAEA,IAAA,IAAI,QAAQ,SAAA,EAAW;AACrB,MAAA,MAAM,WAAW,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,KAAA,EAAO,QAAQ,QAAQ,CAAA;AAC/D,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,QAAA,GACzBA,uBAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,CAAA,CAAG,CAAA,GAC/B,CAAA,CAAA,EAAI,KAAA,CAAM,OAAO,CAAA,CAAA,CAAA;AACnB,MAAA,KAAA,CAAM,KAAK,UAAU,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,MAAM,SAAA,EAAW;AACnB,MAAA,MAAM,MAAA,GAAS,QAAQ,QAAA,GACrBA,uBAAAA,CAAM,KAAK,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,CAAG,IAC7C,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,CAAA;AACjC,MAAA,KAAA,CAAM,KAAK,MAAM,CAAA;AAAA,IACnB;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AAExB,IAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,MAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,QAAA,GAC1BA,uBAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,CAAA,GAAA,CAAK,CAAA,GAClC,CAAA,CAAA,EAAI,KAAA,CAAM,QAAQ,CAAA,GAAA,CAAA;AACpB,MAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,IACxB;AAEA,IAAA,IAAI,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAG3B,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GACpC,KAAA,CAAM,IAAA,GACN,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AAEpC,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,MAAA,IAAU,OAAOA,uBAAAA,CAAM,IAAA,CAAK,KAAK,MAAA,CAAO,OAAA,EAAS,CAAC,CAAC,CAAA;AAAA,MACrD,CAAA,MAAO;AACL,QAAA,MAAA,IAAU,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,OAAA,EAAS,CAAC,CAAA;AAAA,MACzC;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,KAAA,EAAyB;AAC1C,IAAA,OAAO,KAAK,SAAA,CAAU;AAAA,MACpB,SAAA,EAAW,KAAA,CAAM,SAAA,CAAU,WAAA,EAAY;AAAA,MACvC,KAAA,EAAO,QAAA,CAAS,KAAA,CAAM,KAAK,CAAA;AAAA,MAC3B,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,WAAW,KAAA,CAAM,SAAA;AAAA,MACjB,WAAW,KAAA,CAAM;AAAA,KAClB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAA,CAAW,OAAiB,OAAA,EAAgC;AAClE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,YAAA,CAAa,KAAA,CAAM,KAAK,CAAA;AAC1C,IAAc,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,KAAK;AAE5C,IAAA,IAAI,OAAA,GAAU,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAM,OAAO,CAAA,CAAA;AAEtC,IAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,MAAA,OAAA,IAAW,IAAIA,uBAAAA,CAAM,IAAA,CAAK,IAAI,KAAA,CAAM,QAAQ,KAAK,CAAC,CAAA,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,MAAM,IAAA,EAAM;AACd,MAAA,MAAM,OAAA,GAAU,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,GACpC,KAAA,CAAM,IAAA,GACN,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA;AACpC,MAAA,OAAA,IAAW,MAAA,GAASA,uBAAAA,CAAM,IAAA,CAAK,OAAO,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,KAAA,GAAQ,GAAG,QAAA,CAAS,KAAA,CAAM,KAAK,CAAC,CAAA,GAAA,EAAM,MAAM,OAAO,CAAA,CAAA;AAEzD,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,KAAA,CAAM,OAAA,EAAS;AAAA,MACvC,KAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,KAAA,EAAO,IAAA,CAAK,kBAAA,CAAmB,KAAA,CAAM,KAAK,CAAA;AAAA,MAC1C,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,CAAY,OAAiB,QAAA,EAA2B;AAC9D,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAK,CAAA,CAAE,OAAO,CAAC,CAAA;AAE1C,IAAA,IAAI,CAAC,UAAU,OAAO,SAAA;AAEtB,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,CAAA;AACH,QAAA,OAAOA,uBAAAA,CAAM,KAAK,SAAS,CAAA;AAAA,MAC7B,KAAK,CAAA;AACH,QAAA,OAAOA,uBAAAA,CAAM,KAAK,SAAS,CAAA;AAAA,MAC7B,KAAK,CAAA;AACH,QAAA,OAAOA,uBAAAA,CAAM,MAAM,SAAS,CAAA;AAAA,MAC9B,KAAK,CAAA;AACH,QAAA,OAAOA,uBAAAA,CAAM,OAAO,SAAS,CAAA;AAAA,MAC/B,KAAK,CAAA;AACH,QAAA,OAAOA,uBAAAA,CAAM,IAAI,SAAS,CAAA;AAAA,MAC5B,KAAK,CAAA;AACH,QAAA,OAAOA,uBAAAA,CAAM,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA;AAAA,MACvC;AACE,QAAA,OAAO,SAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,KAAA,EAAyB;AAC5C,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,CAAA;AAAgB,QAAA,OAAO,WAAA;AAAA,MAC5B,KAAK,CAAA;AAAgB,QAAA,OAAO,WAAA;AAAA,MAC5B,KAAK,CAAA;AAAe,QAAA,OAAO,cAAA;AAAA,MAC3B,KAAK,CAAA;AAAe,QAAA,OAAO,cAAA;AAAA,MAC3B,KAAK,CAAA;AAAgB,QAAA,OAAO,QAAA;AAAA,MAC5B,KAAK,CAAA;AAAgB,QAAA,OAAO,WAAA;AAAA,MAC5B;AAAS,QAAA,OAAO,WAAA;AAAA;AAClB,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,KAAA,EAAyB;AAC7C,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,CAAA;AAAgB,QAAA,OAAO,MAAA;AAAA,MAC5B,KAAK,CAAA;AAAgB,QAAA,OAAO,MAAA;AAAA,MAC5B,KAAK,CAAA;AAAe,QAAA,OAAO,OAAA;AAAA,MAC3B,KAAK,CAAA;AAAe,QAAA,OAAO,QAAA;AAAA,MAC3B,KAAK,CAAA;AAAgB,QAAA,OAAO,KAAA;AAAA,MAC5B,KAAK,CAAA;AAAgB,QAAA,OAAO,WAAA;AAAA,MAC5B;AAAS,QAAA,OAAO,OAAA;AAAA;AAClB,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,KAAA,EAAyB;AAClD,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,CAAA;AAAgB,QAAA,OAAO,OAAA;AAAA,MAC5B,KAAK,CAAA;AAAgB,QAAA,OAAO,MAAA;AAAA,MAC5B,KAAK,CAAA;AAAe,QAAA,OAAO,SAAA;AAAA,MAC3B,KAAK,CAAA;AAAe,QAAA,OAAO,SAAA;AAAA,MAC3B,KAAK,CAAA;AAAgB,QAAA,OAAO,OAAA;AAAA,MAC5B,KAAK,CAAA;AAAgB,QAAA,OAAO,UAAA;AAAA,MAC5B;AAAS,QAAA,OAAO,SAAA;AAAA;AAClB,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,MAAA,CAAO,MAAc,MAAA,EAAwB;AACnD,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,MAAA,CAAO,MAAM,CAAA;AAChC,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,UAAQ,MAAA,GAAS,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,EAC9D;AACF,CAAA;AAMO,IAAM,iBAAN,MAAqB;AAAA,EAClB,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAsB,EAAC;AAAA,EACvB,UAAA,GAAqB,GAAA;AAAA,EACrB,MAAA,uBAAkC,GAAA,EAAI;AAAA,EAE9C,WAAA,CAAY,OAAA,GAAkC,EAAC,EAAG;AAChD,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,KAAA,EAAO,CAAA;AAAA,MACP,aAAA,EAAe,IAAA;AAAA,MACf,WAAA,EAAa,IAAA;AAAA,MACb,SAAA,EAAW,IAAA;AAAA,MACX,QAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,SAAA;AAAA,MACR,WAAA,EAAa,EAAA;AAAA;AAAA,MACb,QAAA,EAAU,CAAA;AAAA,MACV,GAAG;AAAA,KACL;AAEA,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,YAAA,EAAa;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,OAAA,EAAiB,OAAA,GAAsB,QAAA,eAAmB,MAAY,QAAA,EAAsC;AAChH,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,cAAgB,OAAA,EAAS,OAAA,EAAS,MAAM,QAAQ,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,OAAA,EAAiB,OAAA,GAAsB,QAAA,eAAmB,MAAY,QAAA,EAAsC;AAChH,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,cAAgB,OAAA,EAAS,OAAA,EAAS,MAAM,QAAQ,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAK,OAAA,EAAiB,OAAA,GAAsB,QAAA,eAAmB,MAAY,QAAA,EAAsC;AAC/G,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,aAAe,OAAA,EAAS,OAAA,EAAS,MAAM,QAAQ,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,CAAK,OAAA,EAAiB,OAAA,GAAsB,QAAA,eAAmB,MAAY,QAAA,EAAsC;AAC/G,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,aAAe,OAAA,EAAS,OAAA,EAAS,MAAM,QAAQ,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,OAAA,EAAiB,OAAA,GAAsB,QAAA,eAAmB,MAAY,QAAA,EAAsC;AAChH,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,cAAgB,OAAA,EAAS,OAAA,EAAS,MAAM,QAAQ,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,OAAA,EAAiB,OAAA,GAAsB,QAAA,eAAmB,MAAY,QAAA,EAAsC;AAChH,IAAA,IAAA,CAAK,GAAA,CAAI,CAAA,cAAgB,OAAA,EAAS,OAAA,EAAS,MAAM,QAAQ,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKQ,GAAA,CACN,KAAA,EACA,OAAA,EACA,OAAA,EACA,MACA,QAAA,EACM;AAEN,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO;AAEhC,IAAA,MAAM,KAAA,GAAkB;AAAA,MACtB,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAGnB,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,KAAK,OAAO,CAAA;AAC3D,IAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,GAAA,EAAmB;AAC5B,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,SACE,GAAA,EACA,OAAA,EACA,OAAA,GAAsB,aAAA,oBACtB,QAAkB,CAAA,aACV;AACR,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AACrC,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,OAAA,EAAU,GAAG,CAAA,WAAA,CAAA,EAAe,QAAA,cAAiB;AACvD,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,GAAG,CAAA;AAGtB,IAAA,IAAI,KAAA,IAAS,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO;AAC/B,MAAA,MAAM,KAAA,GAAkB;AAAA,QACtB,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,KAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACnB,MAAA,MAAM,YAAY,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,KAAK,OAAO,CAAA;AAC3D,MAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,IACvB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,eACE,KAAA,EACA,OAAA,EACA,SAAA,EACA,OAAA,GAAsB,uBACtB,IAAA,EACM;AACN,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO;AAEhC,IAAA,MAAM,KAAA,GAAkB;AAAA,MACtB,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACnB,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,KAAK,OAAO,CAAA;AAC3D,IAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,eACE,KAAA,EACA,OAAA,EACA,SAAA,EACA,OAAA,GAAsB,yBACtB,IAAA,EACM;AACN,IAAA,IAAI,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO;AAEhC,IAAA,MAAM,KAAA,GAAkB;AAAA,MACtB,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACnB,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,KAAK,OAAO,CAAA;AAC3D,IAAA,IAAA,CAAK,OAAO,SAAS,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,SAAqB,QAAA,EAA+C;AACxE,IAAA,OAAO,IAAI,aAAA,CAAc,IAAA,EAAM,OAAA,EAAS,QAAQ,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,KAAA,EAAuB;AAC9B,IAAA,IAAA,CAAK,QAAQ,KAAA,GAAQ,KAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAAuD;AAC/D,IAAA,IAAA,CAAK,QAAQ,MAAA,GAAS,MAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,QAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,QAAQ,QAAA,GAAW,QAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CAAiB,QAAgB,EAAA,EAAgB;AAC/C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,CAAC,KAAK,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,KAAA,EAA6B;AAC7C,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,CAAM,UAAU,KAAK,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,OAAA,EAAiC;AACnD,IAAA,OAAO,KAAK,OAAA,CAAQ,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,CAAM,YAAY,OAAO,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,UAAU,EAAC;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,MAAM,CAAC,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAS,KAAA,EAAuB;AACtC,IAAA,IAAA,CAAK,OAAA,CAAQ,KAAK,KAAK,CAAA;AAGvB,IAAA,IAAI,IAAA,CAAK,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,UAAA,EAAY;AACzC,MAAA,IAAA,CAAK,UAAU,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,CAAC,KAAK,UAAU,CAAA;AAAA,IACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAO,SAAA,EAAyB;AACtC,IAAA,IAAI,KAAK,OAAA,CAAQ,MAAA,KAAW,aAAa,IAAA,CAAK,OAAA,CAAQ,WAAW,MAAA,EAAQ;AACvE,MAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,KAAK,OAAA,CAAQ,MAAA,KAAW,UAAU,IAAA,CAAK,OAAA,CAAQ,WAAW,MAAA,EAAQ;AACpE,MAAA,IAAA,CAAK,YAAY,SAAS,CAAA;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,OAAA,EAAuB;AAAA,EAG3C;AACF,CAAA;AAMO,IAAM,gBAAN,MAAoB;AAAA,EACzB,WAAA,CACU,MAAA,EACA,OAAA,EACA,QAAA,EACR;AAHQ,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EACP;AAAA,EAEH,KAAA,CAAM,SAAiB,IAAA,EAAkB;AACvC,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,OAAA,EAAS,KAAK,OAAA,EAAS,IAAA,EAAM,KAAK,QAAQ,CAAA;AAAA,EAC9D;AAAA,EAEA,KAAA,CAAM,SAAiB,IAAA,EAAkB;AACvC,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,OAAA,EAAS,KAAK,OAAA,EAAS,IAAA,EAAM,KAAK,QAAQ,CAAA;AAAA,EAC9D;AAAA,EAEA,IAAA,CAAK,SAAiB,IAAA,EAAkB;AACtC,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,OAAA,EAAS,KAAK,OAAA,EAAS,IAAA,EAAM,KAAK,QAAQ,CAAA;AAAA,EAC7D;AAAA,EAEA,IAAA,CAAK,SAAiB,IAAA,EAAkB;AACtC,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,OAAA,EAAS,KAAK,OAAA,EAAS,IAAA,EAAM,KAAK,QAAQ,CAAA;AAAA,EAC7D;AAAA,EAEA,KAAA,CAAM,SAAiB,IAAA,EAAkB;AACvC,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,OAAA,EAAS,KAAK,OAAA,EAAS,IAAA,EAAM,KAAK,QAAQ,CAAA;AAAA,EAC9D;AAAA,EAEA,KAAA,CAAM,SAAiB,IAAA,EAAkB;AACvC,IAAA,IAAA,CAAK,OAAO,KAAA,CAAM,OAAA,EAAS,KAAK,OAAA,EAAS,IAAA,EAAM,KAAK,QAAQ,CAAA;AAAA,EAC9D;AAAA,EAEA,WAAW,GAAA,EAAmB;AAC5B,IAAA,IAAA,CAAK,MAAA,CAAO,WAAW,GAAG,CAAA;AAAA,EAC5B;AAAA,EAEA,QAAA,CAAS,GAAA,EAAa,OAAA,EAAiB,KAAA,GAAkB,CAAA,aAAuB;AAC9E,IAAA,OAAO,KAAK,MAAA,CAAO,QAAA,CAAS,KAAK,OAAA,EAAS,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC/D;AACF,CAAA;AAMO,IAAM,MAAA,GAAS,IAAI,cAAA,CAAe;AAAA,EACvC,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,UAAA;AAAA,EACR,QAAA,EAAU,IAAA;AAAA,EACV,MAAA,EAAQ;AACV,CAAC,CAAA;AAGwB,MAAA,CAAO,KAAA,CAAM,KAAA;AACb,MAAA,CAAO,KAAA,CAAM,KAAA;AAC/B,IAAM,YAAA,GAAe,MAAA,CAAO,KAAA,CAAM,QAAA,cAAiB;AAC7B,MAAA,CAAO,KAAA,CAAM,SAAA;AACZ,MAAA,CAAO,KAAA,CAAM,UAAA;AACf,MAAA,CAAO,KAAA,CAAM,QAAA;AACR,MAAA,CAAO,KAAA,CAAM,aAAA;;;AD1iB9C,IAAM,aAAa,MAAA,CAAO,KAAA,CAAA,QAAA,eAAyB,EAAE,SAAA,EAAW,SAAS,CAAA;AAmCzE,eAAsB,WAAA,CACpB,UACA,KAAA,EACA,OAAA,GAAgC,EAAC,EACjC,OAAA,GAAgC,EAAC,EACH;AAC9B,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM;AAAA,IACJ,cAAA,GAAiB,GAAA;AAAA,IACjB,GAAA,EAAA9B,OAAM,EAAC;AAAA,IACP,eAAA,GAAkB,IAAA;AAAA,IAClB,UAAA,GAAA,QAAA;AAAA,GACF,GAAI,OAAA;AAGJ,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,UAAA,EAAY;AAAA,IAC7C,QAAA;AAAA,IACA,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,OAAO,OAAA,CAAQ;AAAA,GAChB,CAAA;AAED,EAAA,aAAA,CAAc,IAAA,CAAK,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAA,EAAI;AAAA,IACzD,OAAA;AAAA,IACA,gBAAA,EAAkB,OAAA,CAAQ,gBAAA,IAAoB,OAAA,CAAQ,GAAA,EAAI;AAAA,IAC1D,cAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,IAAA,GAAO,MAAM,QAAQ,CAAA;AAC3B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,aAAA,CAAc,KAAA,CAAM,CAAA,KAAA,EAAQ,QAAQ,CAAA,iCAAA,CAAmC,CAAA;AACvE,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,aAAA,EAAe,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MAC5B,gBAAgB,EAAC;AAAA,MACjB,OAAA,EAAS,IAAA;AAAA,MACT,gBAAA,EAAkB,CAAA;AAAA,MAClB,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAChD,IAAA,aAAA,CAAc,KAAA,CAAM,CAAA,KAAA,EAAQ,QAAQ,CAAA,qCAAA,CAAuC,CAAA;AAC3E,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,aAAA,EAAe,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAAA,MAC5B,gBAAgB,EAAC;AAAA,MACjB,OAAA,EAAS,IAAA;AAAA,MACT,gBAAA,EAAkB,CAAA;AAAA,MAClB,cAAA,EAAgB;AAAA,KAClB;AAAA,EACF;AAEA,EAAA,aAAA,CAAc,KAAK,CAAA,UAAA,EAAa,IAAA,CAAK,SAAS,MAAM,CAAA,mBAAA,EAAsB,QAAQ,CAAA,CAAE,CAAA;AAEpF,EAAA,MAAM,iBAA2C,EAAC;AAClD,EAAA,IAAI,cAAA,GAAiB,CAAA;AAGrB,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC/B,IAAA,MAAM,gBAAA,GAAmB,KAAK,GAAA,EAAI;AAElC,IAAA,aAAA,CAAc,IAAA,CAAK,CAAA,kBAAA,EAAqB,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,KAAK,QAAA,CAAS,MAAM,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,EAAI;AAAA,MACnF,YAAA,EAAc,CAAA;AAAA,MACd,aAAA,EAAe,KAAK,QAAA,CAAS;AAAA,KAC9B,CAAA;AAED,IAAA,IAAI;AAEF,MAAA,MAAM,OAAA,GAAU;AAAA,QACd,GAAG,OAAA,CAAQ,GAAA;AAAA,QACX,GAAGA,IAAAA;AAAA;AAAA,QAEH,SAAA,EAAW,QAAA;AAAA,QACX,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,QAAA,EAAS,IAAK,EAAA;AAAA,QAC5C,UAAA,EAAY,QAAQ,SAAA,IAAa,EAAA;AAAA,QACjC,MAAA,EAAQ,QAAQ,KAAA,IAAS,EAAA;AAAA,QACzB,gBAAA,EAAkB,OAAA,CAAQ,eAAA,EAAiB,QAAA,EAAS,IAAK,EAAA;AAAA;AAAA,QAEzD,GAAG,MAAA,CAAO,WAAA;AAAA,UACR,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,QAAA,IAAY,EAAE,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAAA,YAC3D,CAAA,KAAA,EAAQ,GAAA,CAAI,WAAA,EAAa,CAAA,CAAA;AAAA,YACzB,OAAO,KAAK;AAAA,WACb;AAAA;AACH,OACF;AAGA,MAAA,MAAMqE,OAAAA,GAAS,MAAMC,WAAA,CAAM,OAAA,EAAS;AAAA,QAClC,KAAA,EAAO,IAAA;AAAA,QACP,OAAA,EAAS,cAAA;AAAA,QACT,GAAA,EAAK,OAAA,CAAQ,gBAAA,IAAoB,OAAA,CAAQ,GAAA,EAAI;AAAA,QAC7C,GAAA,EAAK,OAAA;AAAA;AAAA,QAEL,GAAA,EAAK,IAAA;AAAA,QACL,MAAA,EAAQ;AAAA;AAAA,OACT,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,gBAAA;AAC9B,MAAA,MAAMC,QAAAA,GAAUF,QAAO,QAAA,KAAa,CAAA;AAEpC,MAAA,MAAM,aAAA,GAAwC;AAAA,QAC5C,OAAA;AAAA,QACA,UAAUA,OAAAA,CAAO,QAAA;AAAA,QACjB,MAAA,EAAQA,QAAO,MAAA,IAAU,EAAA;AAAA,QACzB,MAAA,EAAQA,QAAO,MAAA,IAAU,EAAA;AAAA,QACzB,QAAA;AAAA,QACA,OAAA,EAAAE;AAAA,OACF;AAEA,MAAA,cAAA,CAAe,KAAK,aAAa,CAAA;AAEjC,MAAA,IAAIA,QAAAA,EAAS;AACX,QAAA,aAAA,CAAc,KAAK,CAAA,8BAAA,CAAA,EAAkC;AAAA,UACnD,OAAA;AAAA,UACA,UAAUF,OAAAA,CAAO,QAAA;AAAA,UACjB,QAAA;AAAA,UACA,MAAA,EAAQA,QAAO,MAAA,GAASA,OAAAA,CAAO,OAAO,SAAA,CAAU,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA;AAAA;AAAA,SAC3D,CAAA;AAGD,QAAA,IAAIA,QAAO,MAAA,EAAQ;AACjB,UAAA,aAAA,CAAc,MAAM,CAAA,eAAA,CAAA,EAAmB,EAAE,MAAA,EAAQA,OAAAA,CAAO,QAAQ,CAAA;AAAA,QAClE;AAAA,MACF,CAAA,MAAO;AACL,QAAA,cAAA,EAAA;AACA,QAAA,aAAA,CAAc,MAAM,CAAA,cAAA,CAAA,EAAkB;AAAA,UACpC,OAAA;AAAA,UACA,UAAUA,OAAAA,CAAO,QAAA;AAAA,UACjB,QAAA;AAAA,UACA,QAAQA,OAAAA,CAAO,MAAA;AAAA,UACf,QAAQA,OAAAA,CAAO;AAAA,SAChB,CAAA;AAGD,QAAA,IAAIA,QAAO,MAAA,EAAQ;AACjB,UAAA,aAAA,CAAc,MAAM,CAAA,eAAA,CAAA,EAAmB,EAAE,MAAA,EAAQA,OAAAA,CAAO,QAAQ,CAAA;AAAA,QAClE;AAGA,QAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,UAAA,aAAA,CAAc,KAAK,CAAA,sEAAA,CAAwE,CAAA;AAC3F,UAAA;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,gBAAA;AAC9B,MAAA,cAAA,EAAA;AAEA,MAAA,IAAI,YAAA,GAAe,eAAA;AACnB,MAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,MAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,QAAA,YAAA,GAAe,KAAA,CAAM,OAAA;AAErB,QAAA,SAAA,GAAY,UAAA,IAAc,KAAA,GAAQ,OAAA,CAAS,KAAA,CAAc,QAAQ,CAAA,GAAI,KAAA;AAAA,MACvE;AAEA,MAAA,MAAM,aAAA,GAAwC;AAAA,QAC5C,OAAA;AAAA,QACA,QAAA,EAAU,EAAA;AAAA,QACV,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA,EAAQ,YAAA;AAAA,QACR,QAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT;AAAA,OACF;AAEA,MAAA,cAAA,CAAe,KAAK,aAAa,CAAA;AAEjC,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,aAAA,CAAc,KAAA,CAAM,CAAA,wBAAA,EAA2B,cAAc,CAAA,EAAA,CAAA,EAAM;AAAA,UACjE,OAAA;AAAA,UACA,OAAA,EAAS,cAAA;AAAA,UACT,QAAA;AAAA,UACA,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,aAAA,CAAc,MAAM,CAAA,wBAAA,CAAA,EAA4B;AAAA,UAC9C,OAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,QAAA,aAAA,CAAc,KAAK,CAAA,sEAAA,CAAwE,CAAA;AAC3F,QAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AACnC,EAAA,MAAM,UAAU,cAAA,KAAmB,CAAA;AACnC,EAAA,MAAM,mBAAmB,cAAA,CAAe,MAAA;AAExC,EAAA,MAAM,MAAA,GAA8B;AAAA,IAClC,QAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,aAAA,CAAc,KAAK,CAAA,wBAAA,CAAA,EAA4B;AAAA,IAC7C,QAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAeA,eAAsB,YAAA,CACpB,WACA,KAAA,EACA,OAAA,GAAgC,EAAC,EACjC,OAAA,GAAgC,EAAC,EACD;AAChC,EAAA,MAAM,UAAiC,EAAC;AAExC,EAAA,UAAA,CAAW,KAAK,CAAA,6BAAA,CAAA,EAAiC;AAAA,IAC/C,SAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,MAAM,SAAS,MAAM,WAAA,CAAY,QAAA,EAAU,KAAA,EAAO,SAAS,OAAO,CAAA;AAClE,IAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,EACrB;AAEA,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,QAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,gBAAA,EAAkB,CAAC,CAAA;AAC5E,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,cAAA,EAAgB,CAAC,CAAA;AAExE,EAAA,UAAA,CAAW,KAAK,CAAA,8BAAA,CAAA,EAAkC;AAAA,IAChD,SAAA;AAAA,IACA,YAAY,OAAA,CAAQ,MAAA;AAAA,IACpB,aAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,OAAO,OAAA;AACT;AAWO,SAAS,oBAAoB,KAAA,EAIlC;AACA,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,MAAM,cAAA,GAA6B,CAAC,WAAA,EAAa,iBAAA,EAAmB,iBAAiB,SAAS,CAAA;AAE9F,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAEpD,IAAA,IAAI,CAAC,cAAA,CAAe,QAAA,CAAS,QAAoB,CAAA,EAAG;AAClD,MAAA,QAAA,CAAS,IAAA,CAAK,sBAAsB,QAAQ,CAAA,mBAAA,EAAsB,eAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC/F;AAGA,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,EAAQ,QAAQ,CAAA,4BAAA,CAA8B,CAAA;AAC1D,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,EAAG;AACjC,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,KAAA,EAAQ,QAAQ,CAAA,4BAAA,CAA8B,CAAA;AAC1D,MAAA;AAAA,IACF;AAGA,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC7C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AAC/B,MAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,QAAA,MAAA,CAAO,IAAA,CAAK,QAAQ,QAAQ,CAAA,SAAA,EAAY,CAAC,CAAA,uBAAA,EAA0B,OAAO,OAAO,CAAA,CAAE,CAAA;AAAA,MACrF,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,EAAK,KAAM,EAAA,EAAI;AAChC,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,KAAA,EAAQ,QAAQ,CAAA,SAAA,EAAY,CAAC,CAAA,SAAA,CAAW,CAAA;AAAA,MACxD;AAAA,IACF;AAGA,IAAA,MAAM,iBAAA,GAAoB;AAAA,MACxB,eAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,QAAA,EAAU;AACnC,MAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,QAAA,KAAA,MAAW,WAAW,iBAAA,EAAmB;AACvC,UAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AACzB,YAAA,QAAA,CAAS,IAAA,CAAK,CAAA,KAAA,EAAQ,QAAQ,CAAA,yCAAA,EAA4C,OAAO,CAAA,CAAE,CAAA;AAAA,UACrF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB,MAAA;AAAA,IACA;AAAA,GACF;AACF;;;AFhVO,IAAK,eAAA,qBAAAG,gBAAAA,KAAL;AACL,EAAAA,iBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,iBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,iBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,iBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,iBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,iBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,iBAAA,cAAA,CAAA,GAAe,cAAA;AAPL,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AAkNL,IAAM,6BAAA,GAAqD;AAAA,EAChE,WAAA,EAAa;AAAA,IACX,UAAA,EAAY,CAAA;AAAA,IACZ,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY,CAAA;AAAA,IACZ,cAAA,EAAgB,CAAA;AAAA,IAChB,UAAA,EAAY,CAAA;AAAA,IACZ,gBAAA,EAAkB,CAAA;AAAA,IAClB,QAAA,EAAU,CAAA;AAAA,IACV,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,UAAA,EAAY,GAAA;AAAA,IACZ,OAAA,EAAS,GAAA;AAAA,IACT,UAAA,EAAY,CAAA;AAAA;AAAA,IACZ,cAAA,EAAgB,IAAA;AAAA,IAChB,UAAA,EAAY,CAAA;AAAA;AAAA,IACZ,gBAAA,EAAkB,CAAA;AAAA;AAAA,IAClB,QAAA,EAAU,GAAA;AAAA,IACV,cAAA,EAAgB;AAAA;AAAA,GAClB;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,UAAA,EAAY,IAAA;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,cAAA,EAAgB,KAAA;AAAA,IAChB,UAAA,EAAY,KAAA;AAAA,IACZ,gBAAA,EAAkB,KAAA;AAAA,IAClB,QAAA,EAAU,IAAA;AAAA,IACV,cAAA,EAAgB;AAAA,GAClB;AAAA,EACA,kBAAkB;AACpB;AAKO,IAAM,yBAAA,GAAqD;AAAA,EAChE,OAAA,EAAS,IAAA;AAAA,EACT,aAAA,EAAe,IAAA;AAAA;AAAA,EACf,iBAAA,EAAmB;AAAA,IACjB,0CAAA;AAAA,IACA,+BAAA;AAAA,IACA,yCAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA,eAAe;AACjB;AAKO,IAAM,uBAAA,GAAkD;AAAA,EAC7D,OAAA,EAAS,IAAA;AAAA,EACT,UAAA,EAAY,GAAA;AAAA,EACZ,SAAS,EAAC;AAAA,EACV,YAAY;AACd;AAqCO,IAAM,eAAA,GAAN,cAA8BC,mBAAA,CAAa;AAAA,EAC/B,YAAA;AAAA,EACA,gBAAA,uBAAuB,GAAA,EAA8B;AAAA,EACrD,oBAAwC,EAAC;AAAA,EACzC,eAAwC,EAAC;AAAA,EAClD,cAAA,GAAiB,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzB,YAAY,MAAA,EAA+B;AACzC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AACpB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AACxB,IAAA,IAAA,CAAK,qBAAA,EAAsB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,OAAA,CACJ,OAAA,EACA,WAAA,EAC0B;AAC1B,IAAA,IAAA,CAAK,gBAAgB,OAAO,CAAA;AAE5B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,sBAAA,CAAuB,OAAA,EAAS,WAAW,CAAA;AAChE,IAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AAEpD,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,IAAA,CAAK,iBAAA,EAAmB,EAAE,OAAA,EAAS,SAAS,CAAA;AAEjD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAEjD,MAAA,IAAA,CAAK,IAAA,CAAK,oBAAA,EAAsB,EAAE,OAAA,EAAS,QAAQ,CAAA;AACnD,MAAA,OAAO,MAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACrC,MAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB,EAAE,OAAA,EAAS,KAAA,EAAO,UAAU,CAAA;AACzD,MAAA,MAAM,QAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,gBAAA,CAAiB,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAC9C,MAAA,MAAM,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,QAAA,EAAwC;AACjD,IAAA,IAAA,CAAK,iBAAA,CAAkB,KAAK,QAAQ,CAAA;AACpC,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,iBAAA,CAAkB,OAAA,CAAQ,QAAQ,CAAA;AACrD,MAAA,IAAI,UAAU,EAAA,EAAI;AAChB,QAAA,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,MACxC;AAAA,IACF,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAA,GAA2C;AAE/C,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,KAAA;AAAA,MACf,SAAA,EAAW,GAAA;AAAA,MACX,WAAW,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,GAAK,CAAA;AAAA;AAAA,MACtC,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,CAAS,SAAA,GAAoB,GAAA,EAAsB;AACvD,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,IAAA,CAAK,KAAK,uBAAuB,CAAA;AAEjC,IAAA,IAAI;AAEF,MAAA,MAAM,uBAAuB,KAAA,CAAM,IAAA,CAAK,KAAK,gBAAA,CAAiB,MAAA,EAAQ,CAAA,CAAE,GAAA;AAAA,QACtE,CAAA,OAAA,KAAW,IAAA,CAAK,eAAA,CAAgB,OAAO;AAAA,OACzC;AAGA,MAAA,MAAM,QAAQ,IAAA,CAAK;AAAA,QACjB,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AAAA,QAChC,IAAI,OAAA;AAAA,UAAQ,CAAC,CAAA,EAAG,MAAA,KACd,UAAA,CAAW,MAAM,MAAA,CAAO,IAAI,KAAA,CAAM,kBAAkB,CAAC,CAAA,EAAG,SAAS;AAAA;AACnE,OACD,CAAA;AAGD,MAAA,MAAM,OAAA,CAAQ,IAAI,IAAA,CAAK,YAAA,CAAa,IAAI,CAAA,IAAA,KAAQ,IAAA,EAAM,CAAC,CAAA;AAEvD,MAAA,IAAA,CAAK,KAAK,0BAA0B,CAAA;AAAA,IACtC,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,IAAA,CAAK,yBAAyB,KAAK,CAAA;AACxC,MAAA,MAAM,KAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAA,GAA8C;AAC5C,IAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,gBAAA,CAAiB,QAAQ,CAAA;AAE1D,IAAA,OAAO;AAAA,MACL,eAAA,EAAiB,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,QAAQ,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,eAAA,EAAiB,CAAC,CAAA;AAAA,MACtF,oBAAA,EAAsB,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,QAAQ,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,oBAAA,EAAsB,CAAC,CAAA;AAAA,MAChG,gBAAA,EAAkB,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,QAAQ,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,gBAAA,EAAkB,CAAC,CAAA;AAAA,MACxF,wBAAA,EAA0B,IAAA,CAAK,iCAAA,CAAkC,QAAQ,CAAA;AAAA,MACzE,cAAA,EAAgB,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,QAAQ,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,cAAA,EAAgB,CAAC,CAAA;AAAA,MACpF,mBAAA,EAAqB,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,QAAQ,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,CAAC,CAAA;AAAA,MAC9F,mBAAA,EAAqB,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,QAAQ,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,mBAAA,EAAqB,CAAC,CAAA;AAAA,MAC9F,iBAAA,EAAmB,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,QAAQ,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,iBAAA,EAAmB,CAAC,CAAA;AAAA,MAC1F,cAAA,EAAgB,IAAA,CAAK,uBAAA,CAAwB,QAAQ,CAAA;AAAA,MACrD,kBAAA,EAAoB,IAAA,CAAK,2BAAA,CAA4B,QAAQ;AAAA,KAC/D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,kBAAA,GAA2B;AACjC,IAAA,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,EAAA,CAAG,kBAAA,EAAoB,CAAC,KAAA,KAAiB;AACnE,MAAA,IAAA,CAAK,IAAA,CAAK,gBAAgB,KAAK,CAAA;AAAA,IACjC,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,EAAA,CAAG,mBAAA,EAAqB,CAAC,KAAA,KAAU;AACzC,MAAA,IAAA,CAAK,IAAA,CAAK,6BAA6B,KAAK,CAAA;AAAA,IAC9C,CAAC,CAAA;AAED,IAAA,OAAA,CAAQ,EAAA,CAAG,oBAAA,EAAsB,CAAC,MAAA,KAAW;AAC3C,MAAA,IAAA,CAAK,IAAA,CAAK,8BAA8B,MAAM,CAAA;AAAA,IAChD,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAA,GAA8B;AACpC,IAAA,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,UAAA,CAAW,OAAO,KAAA,KAAyB;AACrE,MAAA,IAAI;AAEF,QAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,UAAA,EAAY;AACnE,UAAA,MAAM,SAAA,CAAU,QAAQ,KAAK,CAAA;AAAA,QAC/B;AAGA,QAAA,MAAM,QAAQ,GAAA,CAAI;AAAA,UAChB,GAAG,IAAA,CAAK,iBAAA,CAAkB,IAAI,CAAA,QAAA,KAAY,QAAA,CAAS,KAAK,CAAC;AAAA,SAC1D,CAAA;AAED,QAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,KAAK,CAAA;AAAA,MACnC,SAAS,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,EAAE,KAAA,EAAO,OAAO,CAAA;AAAA,MAC9C;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAgB,OAAA,EAAiC;AACvD,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,EAAW,IAAA,EAAK,EAAG;AAC9B,MAAA,MAAM,IAAI,MAAM,wBAAwB,CAAA;AAAA,IAC1C;AAEA,IAAA,IAAI,CAAC,OAAA,CAAQ,WAAA,EAAa,IAAA,EAAK,EAAG;AAChC,MAAA,MAAM,IAAI,MAAM,yBAAyB,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,EAAU,IAAA,EAAK,EAAG;AAC7B,MAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA,IACxC;AAEA,IAAA,IAAI,CAAC,OAAA,CAAQ,gBAAA,EAAkB,IAAA,EAAK,EAAG;AACrC,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,OAAA,CAAQ,aAAA,GAAgB,EAAA,IAAM,OAAA,CAAQ,kBAAkB,CAAA,EAAG;AAC7D,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAA,CACN,SACA,WAAA,EACkB;AAClB,IAAA,MAAM,eAAA,GAAkB,IAAI,eAAA,EAAgB;AAG5C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,WAAA,CAAY,gBAAA,CAAiB,SAAS,MAAM;AAC1C,QAAA,eAAA,CAAgB,KAAA,EAAM;AAAA,MACxB,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO;AAAA,MACL,OAAA;AAAA,MACA,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,OAAA,EAAS,IAAA;AAAA,MACT,YAAY,EAAC;AAAA,MACb,UAAA,EAAY,KAAK,uBAAA,EAAwB;AAAA,MACzC,gBAAgB,EAAC;AAAA,MACjB,KAAA,EAAO,IAAA;AAAA,MACP,eAAA;AAAA,MACA,cAAA,EAAgB,IAAA,CAAK,oBAAA,CAAqB,OAAO,CAAA;AAAA,MACjD,aAAA,EAAe;AAAA,QACb,aAAA,EAAe,KAAA;AAAA,QACf,SAAA,EAAW,GAAA;AAAA,QACX,UAAA,EAAY;AAAA;AACd,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAA,GAA+C;AACrD,IAAA,OAAO;AAAA,MACL,eAAA,EAAiB,CAAA;AAAA,MACjB,oBAAA,EAAsB,CAAA;AAAA,MACtB,gBAAA,EAAkB,CAAA;AAAA,MAClB,wBAAA,EAA0B,CAAA;AAAA,MAC1B,cAAA,EAAgB,CAAA;AAAA,MAChB,mBAAA,EAAqB,CAAA;AAAA,MACrB,mBAAA,EAAqB,CAAA;AAAA,MACrB,iBAAA,EAAmB,CAAA;AAAA,MACnB,gBAAgB,EAAC;AAAA,MACjB,kBAAA,EAAoB;AAAA,QAClB,QAAA,EAAU,CAAA;AAAA,QACV,WAAA,EAAa,CAAA;AAAA,QACb,eAAA,EAAiB,CAAA;AAAA,QACjB,oBAAA,EAAsB,CAAA;AAAA,QACtB,UAAA,EAAY;AAAA,UACV,mBAAA,EAAqB,CAAA;AAAA,UACrB,uBAAA,EAAyB,CAAA;AAAA,UACzB,kBAAA,EAAoB;AAAA;AACtB;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,OAAA,EAA8C;AACzE,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,CAAA,QAAA,EAAW,OAAA,CAAQ,SAAS,CAAA,CAAA;AAAA,MACvC,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,MAAA,EAAQ,QAAA;AAAA,MACR,QAAA,EAAU;AAAA,QACR,GAAG,OAAA,CAAQ,eAAA;AAAA,QACX,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,kBAAkB,OAAA,CAAQ;AAAA,OAC5B;AAAA,MACA,iBAAiB,EAAC;AAAA,MAClB,KAAA,EAAO,cAAA;AAAA,MACP,YAAA,sBAAkB,IAAA;AAAK,KACzB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,OAAA,EAAqD;AACjF,IAAA,OAAA,CAAQ,MAAA,GAAS,SAAA;AACjB,IAAA,OAAA,CAAQ,iBAAiB,EAAE,GAAG,OAAA,CAAQ,cAAA,EAAgB,OAAO,QAAA,EAAgB;AAG7E,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO;AAClC,QAAA,MAAM,WAAA,CAAY,WAAA,EAAa,IAAA,CAAK,YAAA,CAAa,OAAO,KAAA,EAAO;AAAA,UAC7D,gBAAA,EAAkB,QAAQ,OAAA,CAAQ,gBAAA;AAAA,UAClC,SAAA,EAAW,QAAQ,cAAA,CAAe,SAAA;AAAA,UAClC,KAAA,EAAO,QAAQ,OAAA,CAAQ,SAAA;AAAA,UACvB,QAAA,EAAU;AAAA,YACR,SAAA,EAAW,QAAQ,cAAA,CAAe,SAAA;AAAA,YAClC,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,YAC3B,QAAA,EAAU,QAAQ,OAAA,CAAQ,QAAA;AAAA,YAC1B,aAAA,EAAe,QAAQ,OAAA,CAAQ,aAAA;AAAA,YAC/B,WAAA,EAAa,QAAQ,OAAA,CAAQ;AAAA;AAC/B,SACD,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,IAAA,CAAK,uBAAA,EAAyB,EAAE,KAAA,EAAO,CAAA;AAAA,IAEtD;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAEnC,MAAA,OAAA,CAAQ,MAAA,GAAS,WAAA;AACjB,MAAA,OAAA,CAAQ,iBAAiB,EAAE,GAAG,OAAA,CAAQ,cAAA,EAAgB,OAAO,WAAA,EAAmB;AAAA,IAClF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACpC,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,oBAAA,CAAqB,OAAA,CAAQ,KAAK,CAAA;AACxD,MAAA,OAAA,CAAQ,iBAAiB,EAAE,GAAG,OAAA,CAAQ,cAAA,EAAgB,OAAO,QAAA,EAAgB;AAAA,IAC/E,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,OAAA,uBAAc,IAAA,EAAK;AAAA,IAC7B;AAGA,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO;AAClC,QAAA,MAAM,WAAA,CAAY,SAAA,EAAW,IAAA,CAAK,YAAA,CAAa,OAAO,KAAA,EAAO;AAAA,UAC3D,gBAAA,EAAkB,QAAQ,OAAA,CAAQ,gBAAA;AAAA,UAClC,SAAA,EAAW,QAAQ,cAAA,CAAe,SAAA;AAAA,UAClC,KAAA,EAAO,QAAQ,OAAA,CAAQ,SAAA;AAAA,UACvB,QAAA,EAAU;AAAA,YACR,SAAA,EAAW,QAAQ,cAAA,CAAe,SAAA;AAAA,YAClC,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,YAC3B,QAAQ,OAAA,CAAQ,MAAA;AAAA,YAChB,eAAA,EAAiB,QAAQ,UAAA,CAAW,eAAA;AAAA,YACpC,oBAAA,EAAsB,QAAQ,UAAA,CAAW,oBAAA;AAAA,YACzC,gBAAA,EAAkB,QAAQ,UAAA,CAAW,gBAAA;AAAA,YACrC,QAAA,EAAU,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,SAAQ,GAAI,OAAA,CAAQ,SAAA,CAAU,OAAA,EAAQ,GAAI,CAAA;AAAA,YACtF,OAAA,EAAS,QAAQ,MAAA,KAAW,WAAA;AAAA;AAC9B,SACD,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,IAAA,CAAK,qBAAA,EAAuB,EAAE,KAAA,EAAO,CAAA;AAAA,IAEpD;AAEA,IAAA,OAAO,IAAA,CAAK,sBAAsB,OAAO,CAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,OAAA,EAA0C;AACvE,IAAA,IAAI,eAAA,GAAkB,CAAA;AAEtB,IAAA,OAAO,CAAC,IAAA,CAAK,mBAAA,CAAoB,OAAA,EAAS,eAAe,CAAA,EAAG;AAC1D,MAAA,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAE7B,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,gBAAA,CAAiB,OAAA,EAAS,eAAe,CAAA;AACpD,QAAA,eAAA,EAAA;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,iBAAiB,iBAAA,EAAmB;AACtC,UAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,OAAA,EAAS,KAAK,CAAA;AAEzC,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAA,EAAS,OAAO,eAAe,CAAA;AACtF,QAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,UAAA,MAAM,KAAA;AAAA,QACR;AAEA,QAAA,eAAA,EAAA;AAAA,MACF;AAGA,MAAA,MAAM,IAAA,CAAK,MAAM,GAAI,CAAA;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAA,CAAiB,OAAA,EAA2B,eAAA,EAAwC;AAChG,IAAA,MAAM,cAAA,uBAAqB,IAAA,EAAK;AAGhC,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO;AAClC,QAAA,MAAM,WAAA,CAAY,iBAAA,EAAmB,IAAA,CAAK,YAAA,CAAa,OAAO,KAAA,EAAO;AAAA,UACnE,gBAAA,EAAkB,QAAQ,OAAA,CAAQ,gBAAA;AAAA,UAClC,SAAA,EAAW,QAAQ,cAAA,CAAe,SAAA;AAAA,UAClC,KAAA,EAAO,QAAQ,OAAA,CAAQ,SAAA;AAAA,UACvB,SAAA,EAAW,eAAA;AAAA,UACX,eAAA,EAAiB,QAAQ,OAAA,CAAQ,aAAA;AAAA,UACjC,QAAA,EAAU;AAAA,YACR,SAAA,EAAW,QAAQ,cAAA,CAAe,SAAA;AAAA,YAClC,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,YAC3B,eAAA;AAAA,YACA,aAAA,EAAe,QAAQ,OAAA,CAAQ,aAAA;AAAA,YAC/B,QAAA,EAAU,QAAQ,OAAA,CAAQ;AAAA;AAC5B,SACD,CAAA;AAAA,MACH;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,IAAA,CAAK,6BAAA,EAA+B,EAAE,KAAA,EAAO,iBAAiB,CAAA;AAAA,IAE7E;AAGA,IAAA,IAAA,CAAK,IAAA,CAAK,iBAAA,EAAmB,EAAE,OAAA,EAAS,iBAAiB,CAAA;AAEzD,IAAA,MAAM,WAAA,GAA+B;AAAA,MACjC,QAAA,EAAU,IAAA,CAAK,sBAAA,CAAuB,OAAA,CAAQ,QAAQ,QAAQ,CAAA;AAAA,MAC9D,SAAA,EAAW;AAAA,QACT,WAAA,EAAa,QAAQ,OAAA,CAAQ,WAAA;AAAA,QAC7B,YAAA,EAAc,QAAQ,OAAA,CAAQ,gBAAA;AAAA,QAC9B,GAAI,QAAQ,OAAA,CAAQ,KAAA,KAAU,UAAa,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAA,CAAQ,KAAA,EAAM;AAAA,QAC1E,SAAA,EAAW;AAAA,OACb;AAAA,MACA,SAAS,OAAA,CAAQ,OAAA,CAAQ,SAAA,IAAa,IAAA,CAAK,aAAa,MAAA,CAAO,UAAA;AAAA,MAC/D,QAAA,EAAU,OAAA,CAAQ,OAAA,CAAQ,QAAA,IAAY,QAAA;AAAA,MACtC,QAAA,EAAU;AAAA,QACR,SAAA,EAAW,QAAQ,cAAA,CAAe,SAAA;AAAA,QAClC;AAAA,OACF;AAAA,MACA,gBAAA,EAAkB,OAAO,KAAA,KAAyB;AAChD,QAAA,OAAA,CAAQ,cAAA,CAAe,KAAK,KAAK,CAAA;AACjC,QAAA,OAAA,CAAQ,UAAA,CAAW,mBAAA,EAAA;AACnB,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,OAAA,EAAS,KAAK,CAAA;AAAA,MAChD;AAAA,KACF;AAEF,IAAA,IAAI;AACF,MAAA,MAAM,aAAa,MAAM,IAAA,CAAK,YAAA,CAAa,SAAA,CAAU,SAAS,WAAW,CAAA;AAEzE,MAAA,MAAM,YAAA,uBAAmB,IAAA,EAAK;AAC9B,MAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,EAAQ,GAAI,eAAe,OAAA,EAAQ;AAEjE,MAAA,MAAM,eAAA,GAAmC;AAAA,QACvC,eAAA;AAAA,QACA,OAAA,EAAS,UAAA,CAAW,MAAA,EAAQ,WAAA,EAAY,KAAM,WAAA;AAAA,QAC9C,SAAA,EAAW,cAAA;AAAA,QACX,OAAA,EAAS,YAAA;AAAA,QACT,QAAA;AAAA,QACA,UAAA;AAAA,QACA,gBAAgB,UAAA,CAAW,cAAA;AAAA,QAC3B,GAAI,UAAA,CAAW,KAAA,KAAU,KAAA,CAAA,IAAa,UAAA,CAAW,UAAU,IAAA,IAAQ,EAAE,KAAA,EAAO,UAAA,CAAW,KAAA;AAAM,OAC/F;AAEA,MAAA,OAAA,CAAQ,UAAA,CAAW,KAAK,eAAe,CAAA;AACvC,MAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,eAAe,CAAA;AAE9C,MAAA,IAAA,CAAK,IAAA,CAAK,oBAAA,EAAsB,EAAE,OAAA,EAAS,iBAAiB,CAAA;AAG5D,MAAA,IAAI;AACF,QAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO;AAClC,UAAA,MAAM,WAAA,CAAY,eAAA,EAAiB,IAAA,CAAK,YAAA,CAAa,OAAO,KAAA,EAAO;AAAA,YACjE,gBAAA,EAAkB,QAAQ,OAAA,CAAQ,gBAAA;AAAA,YAClC,SAAA,EAAW,QAAQ,cAAA,CAAe,SAAA;AAAA,YAClC,KAAA,EAAO,QAAQ,OAAA,CAAQ,SAAA;AAAA,YACvB,SAAA,EAAW,eAAA;AAAA,YACX,eAAA,EAAiB,QAAQ,OAAA,CAAQ,aAAA;AAAA,YACjC,QAAA,EAAU;AAAA,cACR,SAAA,EAAW,QAAQ,cAAA,CAAe,SAAA;AAAA,cAClC,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,cAC3B,eAAA;AAAA,cACA,SAAS,eAAA,CAAgB,OAAA;AAAA,cACzB,UAAU,eAAA,CAAgB,QAAA;AAAA,cAC1B,cAAA,EAAgB,gBAAgB,UAAA,CAAW;AAAA;AAC7C,WACD,CAAA;AAAA,QACH;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,YAAA,CAAa,IAAA,CAAK,2BAAA,EAA6B,EAAE,KAAA,EAAO,iBAAiB,CAAA;AAAA,MAE3E;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,YAAA,uBAAmB,IAAA,EAAK;AAC9B,MAAA,MAAM,QAAA,GAAW,YAAA,CAAa,OAAA,EAAQ,GAAI,eAAe,OAAA,EAAQ;AACjE,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAErC,MAAA,MAAM,eAAA,GAAmC;AAAA,QACvC,eAAA;AAAA,QACA,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,cAAA;AAAA,QACX,OAAA,EAAS,YAAA;AAAA,QACT,QAAA;AAAA,QACA,UAAA,EAAY;AAAA,UACV,OAAA,EAAS,EAAA;AAAA,UACT,MAAA,EAAQ,QAAA;AAAA,UACR,SAAA,EAAW,cAAA;AAAA,UACX,OAAA,EAAS,YAAA;AAAA,UACT,QAAA;AAAA,UACA,KAAA,EAAO,QAAA;AAAA,UACP,gBAAgB,EAAC;AAAA,UACjB,OAAA,EAAS;AAAA,SACX;AAAA,QACA,gBAAgB,EAAC;AAAA,QACjB,KAAA,EAAO;AAAA,OACT;AAEA,MAAA,OAAA,CAAQ,UAAA,CAAW,KAAK,eAAe,CAAA;AACvC,MAAA,IAAA,CAAK,gBAAA,CAAiB,SAAS,eAAe,CAAA;AAE9C,MAAA,IAAA,CAAK,IAAA,CAAK,iBAAA,EAAmB,EAAE,OAAA,EAAS,iBAAiB,CAAA;AAGzD,MAAA,IAAI;AACF,QAAA,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO;AAClC,UAAA,MAAM,WAAA,CAAY,eAAA,EAAiB,IAAA,CAAK,YAAA,CAAa,OAAO,KAAA,EAAO;AAAA,YACjE,gBAAA,EAAkB,QAAQ,OAAA,CAAQ,gBAAA;AAAA,YAClC,SAAA,EAAW,QAAQ,cAAA,CAAe,SAAA;AAAA,YAClC,KAAA,EAAO,QAAQ,OAAA,CAAQ,SAAA;AAAA,YACvB,SAAA,EAAW,eAAA;AAAA,YACX,eAAA,EAAiB,QAAQ,OAAA,CAAQ,aAAA;AAAA,YACjC,QAAA,EAAU;AAAA,cACR,SAAA,EAAW,QAAQ,cAAA,CAAe,SAAA;AAAA,cAClC,SAAA,EAAW,QAAQ,OAAA,CAAQ,SAAA;AAAA,cAC3B,eAAA;AAAA,cACA,OAAA,EAAS,KAAA;AAAA,cACT,UAAU,eAAA,CAAgB,QAAA;AAAA,cAC1B,OAAO,QAAA,CAAS,OAAA;AAAA,cAChB,WAAW,QAAA,CAAS;AAAA;AACtB,WACD,CAAA;AAAA,QACH;AAAA,MACF,SAAS,SAAA,EAAW;AAClB,QAAA,YAAA,CAAa,KAAK,2BAAA,EAA6B,EAAE,KAAA,EAAO,SAAA,EAAW,iBAAiB,CAAA;AAAA,MAEtF;AAEA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,CAAgB,OAAA,EAA2B,KAAA,EAAyC;AAChG,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,eAAA,CAAgB,OAAA,EAAS;AAC9C,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,OAAA,CAAQ,UAAA,CAAW,mBAAA,EAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,0BAAA,CAA2B,KAAK,CAAA;AACxD,IAAA,IAAI,UAAA,GAAa,IAAA,CAAK,YAAA,CAAa,eAAA,CAAgB,aAAA,EAAe;AAChE,MAAA,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,UAAU,gCAAgC,IAAA,CAAK,YAAA,CAAa,eAAA,CAAgB,aAAa,CAAA,GAAA,CAAK,CAAA;AAAA,IACzI;AAEA,IAAA,OAAA,CAAQ,WAAW,iBAAA,IAAqB,UAAA;AACxC,IAAA,OAAA,CAAQ,aAAA,GAAgB;AAAA,MACtB,aAAA,EAAe,IAAA;AAAA,MACf,GAAI,KAAA,CAAM,SAAA,KAAc,UAAa,EAAE,SAAA,EAAW,MAAM,SAAA,EAAU;AAAA,MAClE,SAAA,EAAW,MAAM,SAAA,IAAa,CAAA;AAAA,MAC9B,UAAA;AAAA,MACA,GAAI,KAAA,CAAM,IAAA,KAAS,UAAa,EAAE,IAAA,EAAM,MAAM,IAAA;AAAK,KACrD;AAEA,IAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB,EAAE,OAAA,EAAS,KAAA,EAAO,YAAY,CAAA;AAE5D,IAAA,MAAM,IAAA,CAAK,MAAM,UAAU,CAAA;AAE3B,IAAA,OAAA,CAAQ,aAAA,GAAgB;AAAA,MACtB,aAAA,EAAe,KAAA;AAAA,MACf,SAAA,EAAW,GAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,EAAE,OAAA,EAAS,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAA2B,KAAA,EAAkC;AACnE,IAAA,IAAI,MAAM,SAAA,EAAW;AACnB,MAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,MAAA,MAAM,WAAW,KAAA,CAAM,SAAA,CAAU,OAAA,EAAQ,GAAI,IAAI,OAAA,EAAQ;AACzD,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA;AAAA,IAC7B;AAGA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAA,CACZ,OAAA,EACA,KAAA,EACA,eAAA,EACkB;AAClB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AACrC,IAAA,MAAM,YAAY,QAAA,CAAS,IAAA;AAE3B,IAAA,OAAA,CAAQ,UAAA,CAAW,eAAe,SAAS,CAAA,GAAA,CAAK,QAAQ,UAAA,CAAW,cAAA,CAAe,SAAS,CAAA,IAAK,CAAA,IAAK,CAAA;AAGrG,IAAA,MAAM,iBAAiB,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc,eAAA,CAAgB,SAAS,CAAA,IAAK,KAAA;AACrF,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc,iBAAiB,SAAS,CAAA;AACjF,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,SAAA,GAAY,MAAM,cAAA,CAAe,QAAQ,CAAA;AAC/C,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB,EAAE,SAAS,KAAA,EAAO,QAAA,EAAU,iBAAiB,CAAA;AAC1E,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF,SAAS,aAAA,EAAe;AACtB,QAAA,IAAA,CAAK,IAAA,CAAK,yBAAyB,EAAE,OAAA,EAAS,OAAO,QAAA,EAAU,aAAA,EAAe,iBAAiB,CAAA;AAAA,MACjG;AAAA,IACF;AAGA,IAAA,MAAM,aAAa,IAAA,CAAK,YAAA,CAAa,aAAA,CAAc,WAAA,CAAY,SAAS,CAAA,IAAK,CAAA;AAC7E,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,MAAM,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,IAC7B;AAEA,IAAA,IAAA,CAAK,KAAK,kBAAA,EAAoB,EAAE,SAAS,KAAA,EAAO,QAAA,EAAU,iBAAiB,CAAA;AAC3E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,oBAAA,CAAqB,OAAA,EAA2B,KAAA,EAAqC;AAEjG,IAAA,KAAA,MAAW,MAAA,IAAU,IAAA,CAAK,YAAA,CAAa,cAAA,CAAe,OAAA,EAAS;AAC7D,MAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,KAAK,CAAA,EAAG;AAC5B,QAAA;AAAA,MACF;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,cAAA,GAAiB;AAAA,MACvB,GAAG,OAAA,CAAQ,cAAA;AAAA,MACX,YAAA,sBAAkB,IAAA;AAAK,KACzB;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,oBAAA,EAAsB,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKQ,gBAAA,CAAiB,SAA2B,SAAA,EAAkC;AACpF,IAAA,MAAM,QAAQ,OAAA,CAAQ,UAAA;AAEtB,IAAA,KAAA,CAAM,eAAA,EAAA;AACN,IAAA,KAAA,CAAM,cAAA,EAAA;AAEN,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,KAAA,CAAM,oBAAA,EAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,gBAAA,EAAA;AAAA,IACR;AAGA,IAAA,MAAM,gBAAgB,KAAA,CAAM,wBAAA,IAA4B,KAAA,CAAM,eAAA,GAAkB,KAAK,SAAA,CAAU,QAAA;AAC/F,IAAA,KAAA,CAAM,wBAAA,GAA2B,gBAAgB,KAAA,CAAM,eAAA;AAGvD,IAAA,IAAA,CAAK,yBAAyB,OAAO,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,OAAA,EAAiC;AAChE,IAAA,MAAM,OAAA,GAAU,QAAQ,UAAA,CAAW,kBAAA;AAGnC,IAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,EAAY;AACrC,IAAA,OAAA,CAAQ,cAAc,QAAA,CAAS,QAAA;AAG/B,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA,CAAQ,UAAU,OAAA,EAAQ;AACxD,IAAA,MAAM,eAAA,GAAkB,YAAY,GAAA,GAAO,EAAA,CAAA;AAE3C,IAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,MAAA,OAAA,CAAQ,UAAA,CAAW,mBAAA,GAAsB,OAAA,CAAQ,UAAA,CAAW,eAAA,GAAkB,eAAA;AAC9E,MAAA,OAAA,CAAQ,UAAA,CAAW,kBAAA,GAAqB,OAAA,CAAQ,UAAA,CAAW,cAAA,GAAiB,eAAA;AAC5E,MAAA,OAAA,CAAQ,UAAA,CAAW,uBAAA,GAA0B,OAAA,CAAQ,UAAA,CAAW,uBAAuB,QAAA,GAAW,GAAA,CAAA;AAAA,IACpG;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,CAAoB,SAA2B,eAAA,EAAkC;AAEvF,IAAA,IAAI,OAAA,CAAQ,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS;AAC1C,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,QAAQ,OAAA,CAAQ,aAAA,KAAkB,MAAM,eAAA,GAAkB,OAAA,CAAQ,QAAQ,aAAA,EAAe;AAC3F,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,OAAA,EAAiC;AACxD,IAAA,IAAI,OAAA,CAAQ,eAAA,CAAgB,MAAA,CAAO,OAAA,EAAS;AAC1C,MAAA,MAAM,IAAI,MAAM,mBAAmB,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,QAAA,EAAgC;AAC7D,IAAA,MAAM,OAAA,GAAwC;AAAA,MAC5C,MAAA,EAAQ,iBAAA;AAAA,MACR,MAAA,EAAQ,iBAAA;AAAA,MACR,KAAA,EAAO,gBAAA;AAAA,MACP,MAAA,EAAQ;AAAA,KACV;AAEA,IAAA,OAAO,OAAA,CAAQ,QAAQ,CAAA,IAAK,iBAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,KAAA,EAA0B;AAC1C,IAAA,IAAI,iBAAiB,QAAA,EAAU;AAC7B,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,GAAA,GAAM,KAAA,YAAiB,KAAA,GAAQ,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAA,GAAK,MAAA,CAAO,KAAK,CAAA;AACrF,IAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY;AAC9B,IAAA,MAAM,gBAAA,GAAmB;AAAA,MACvB,OAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,gBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,MACA,IAAA,CAAK,CAAA,KAAA,KAAS,KAAA,CAAM,QAAA,CAAS,KAAK,CAAC,CAAA;AAErC,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,GAAA;AAAA,QACT,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AAGA,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,gBAAA;AAAA,MACN,OAAA,EAAS,GAAA;AAAA,MACT,SAAA,sBAAe,IAAA;AAAK,KACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,KAAA,EAAkC;AAC7D,IAAA,QAAQ,MAAM,IAAA;AAAM,MAClB,KAAK,YAAA;AACH,QAAA,OAAO,cAAA;AAAA,MACT,KAAK,SAAA;AACH,QAAA,OAAO,SAAA;AAAA,MACT;AACE,QAAA,OAAO,QAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,OAAA,EAA4C;AACxE,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,oBAAW,IAAI,IAAA,EAAK;AAC5C,IAAA,OAAO;AAAA,MACL,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,OAAA;AAAA,MACA,UAAU,OAAA,CAAQ,OAAA,EAAQ,GAAI,OAAA,CAAQ,UAAU,OAAA,EAAQ;AAAA,MACxD,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,GAAI,OAAA,CAAQ,KAAA,KAAU,MAAA,IAAa,OAAA,CAAQ,UAAU,IAAA,IAAQ,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAM;AAAA,MACpF,gBAAgB,OAAA,CAAQ,cAAA;AAAA,MACxB,gBAAgB,OAAA,CAAQ;AAAA,KAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,OAAA,EAA0C;AACtE,IAAA,OAAA,CAAQ,gBAAgB,KAAA,EAAM;AAC9B,IAAA,OAAA,CAAQ,MAAA,GAAS,WAAA;AACjB,IAAA,IAAA,CAAK,IAAA,CAAK,qBAAA,EAAuB,EAAE,OAAA,EAAS,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAiB,OAAA,EAA0C;AAEvE,IAAA,IAAA,CAAK,IAAA,CAAK,mBAAA,EAAqB,EAAE,OAAA,EAAS,CAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKQ,kCAAkC,QAAA,EAAsC;AAC9E,IAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAElC,IAAA,MAAM,gBAAgB,QAAA,CAAS,MAAA;AAAA,MAAO,CAAC,KAAK,GAAA,KAC1C,GAAA,GAAM,IAAI,UAAA,CAAW,wBAAA,GAA2B,IAAI,UAAA,CAAW,eAAA;AAAA,MAAiB;AAAA,KAClF;AACA,IAAA,MAAM,eAAA,GAAkB,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,QAAQ,GAAA,GAAM,GAAA,CAAI,UAAA,CAAW,eAAA,EAAiB,CAAC,CAAA;AAE7F,IAAA,OAAO,eAAA,GAAkB,CAAA,GAAI,aAAA,GAAgB,eAAA,GAAkB,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,QAAA,EAAsD;AACpF,IAAA,MAAM,YAAoC,EAAC;AAE3C,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,KAAA,MAAW,CAAC,WAAW,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,UAAA,CAAW,cAAc,CAAA,EAAG;AAClF,QAAA,SAAA,CAAU,SAAS,CAAA,GAAA,CAAK,SAAA,CAAU,SAAS,KAAK,CAAA,IAAK,KAAA;AAAA,MACvD;AAAA,IACF;AAEA,IAAA,OAAO,SAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAA4B,QAAA,EAAkD;AACpF,IAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,MAAA,OAAO;AAAA,QACL,QAAA,EAAU,CAAA;AAAA,QACV,WAAA,EAAa,CAAA;AAAA,QACb,eAAA,EAAiB,CAAA;AAAA,QACjB,oBAAA,EAAsB,CAAA;AAAA,QACtB,UAAA,EAAY;AAAA,UACV,mBAAA,EAAqB,CAAA;AAAA,UACrB,uBAAA,EAAyB,CAAA;AAAA,UACzB,kBAAA,EAAoB;AAAA;AACtB,OACF;AAAA,IACF;AAGA,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,MAAA,CAAO,CAAC,KAAK,GAAA,MAAS;AAAA,MAChD,QAAA,EAAU,GAAA,CAAI,QAAA,GAAW,GAAA,CAAI,WAAW,kBAAA,CAAmB,QAAA;AAAA,MAC3D,WAAA,EAAa,GAAA,CAAI,WAAA,GAAc,GAAA,CAAI,WAAW,kBAAA,CAAmB,WAAA;AAAA,MACjE,eAAA,EAAiB,GAAA,CAAI,eAAA,GAAkB,GAAA,CAAI,WAAW,kBAAA,CAAmB,eAAA;AAAA,MACzE,oBAAA,EAAsB,GAAA,CAAI,oBAAA,GAAuB,GAAA,CAAI,WAAW,kBAAA,CAAmB,oBAAA;AAAA,MACnF,UAAA,EAAY;AAAA,QACV,qBAAqB,GAAA,CAAI,UAAA,CAAW,sBAAsB,GAAA,CAAI,UAAA,CAAW,mBAAmB,UAAA,CAAW,mBAAA;AAAA,QACvG,yBAAyB,GAAA,CAAI,UAAA,CAAW,0BAA0B,GAAA,CAAI,UAAA,CAAW,mBAAmB,UAAA,CAAW,uBAAA;AAAA,QAC/G,oBAAoB,GAAA,CAAI,UAAA,CAAW,qBAAqB,GAAA,CAAI,UAAA,CAAW,mBAAmB,UAAA,CAAW;AAAA;AACvG,KACF,CAAA,EAAI;AAAA,MACF,QAAA,EAAU,CAAA;AAAA,MACV,WAAA,EAAa,CAAA;AAAA,MACb,eAAA,EAAiB,CAAA;AAAA,MACjB,oBAAA,EAAsB,CAAA;AAAA,MACtB,UAAA,EAAY;AAAA,QACV,mBAAA,EAAqB,CAAA;AAAA,QACrB,uBAAA,EAAyB,CAAA;AAAA,QACzB,kBAAA,EAAoB;AAAA;AACtB,KACD,CAAA;AAGD,IAAA,MAAM,QAAQ,QAAA,CAAS,MAAA;AACvB,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,WAAW,QAAA,GAAW,KAAA;AAAA,MAChC,WAAA,EAAa,WAAW,WAAA,GAAc,KAAA;AAAA,MACtC,eAAA,EAAiB,WAAW,eAAA,GAAkB,KAAA;AAAA,MAC9C,oBAAA,EAAsB,WAAW,oBAAA,GAAuB,KAAA;AAAA,MACxD,UAAA,EAAY;AAAA,QACV,mBAAA,EAAqB,UAAA,CAAW,UAAA,CAAW,mBAAA,GAAsB,KAAA;AAAA,QACjE,uBAAA,EAAyB,UAAA,CAAW,UAAA,CAAW,uBAAA,GAA0B,KAAA;AAAA,QACzE,kBAAA,EAAoB,UAAA,CAAW,UAAA,CAAW,kBAAA,GAAqB;AAAA;AACjE,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,MAAM,EAAA,EAA2B;AAC7C,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAAhB,aAAW,UAAA,CAAWA,QAAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EACvD;AACF;AAkCO,SAAS,qBAAA,CACd,QACA,SAAA,EACiB;AACjB,EAAA,OAAO,IAAI,eAAA,CAAgB;AAAA,IACzB,MAAA;AAAA,IACA,SAAA;AAAA,IACA,aAAA,EAAe,6BAAA;AAAA,IACf,eAAA,EAAiB,yBAAA;AAAA,IACjB,cAAA,EAAgB;AAAA,GACjB,CAAA;AACH;AAQO,SAAS,uBAAuB,OAAA,EAOlB;AACnB,EAAA,MAAM,MAAA,GAA2B;AAAA,IAC/B,WAAW,OAAA,CAAQ,SAAA,IAAa,CAAA,IAAA,EAAO,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,GAAS,QAAA,CAAS,EAAE,EAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,IAC5F,aAAa,OAAA,CAAQ,WAAA;AAAA,IACrB,QAAA,EAAU,QAAQ,QAAA,IAAY,QAAA;AAAA,IAC9B,gBAAA,EAAkB,OAAA,CAAQ,gBAAA,IAAoB,OAAA,CAAQ,GAAA,EAAI;AAAA,IAC1D,aAAA,EAAe,QAAQ,aAAA,IAAiB;AAAA,GAC1C;AAEA,EAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAW;AAC/B,IAAC,MAAA,CAAe,QAAQ,OAAA,CAAQ,KAAA;AAAA,EAClC;AAEA,EAAA,OAAO,MAAA;AACT;;;AOh7CA,YAAA,EAAA;AA4SO,IAAM,qBAAN,MAAmD;AAAA,EACvC,OAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMjB,YAAY,OAAA,EAAiB;AAC3B,IAAA,IAAA,CAAK,OAAA,GAAeiB,yBAAQ,OAAO,CAAA;AACnC,IAAA,IAAA,CAAK,WAAA,GAAmBA,gBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,UAAU,CAAA;AACrD,IAAA,IAAA,CAAK,UAAA,GAAkBA,gBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,SAAS,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAAMb,gBAAW,KAAA,CAAM,IAAA,CAAK,aAAa,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5D,IAAA,MAAMA,gBAAW,KAAA,CAAM,IAAA,CAAK,YAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,eAAe,SAAA,EAA2B;AAChD,IAAA,OAAYa,gBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,WAAA,EAAa,CAAA,EAAG,SAAS,CAAA,KAAA,CAAO,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,OAAA,EAAiC;AACjD,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,KAAK,EAAE,CAAA;AAGvD,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,GAAG,OAAA;AAAA,MACH,IAAA,EAAM;AAAA,QACJ,GAAG,OAAA,CAAQ,IAAA;AAAA,QACX,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,SAAA,CAAU,WAAA,EAAY;AAAA,QAC9C,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,SAAA,CAAU,WAAA,EAAY;AAAA,QAC9C,WAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,WAAA,EAAa,WAAA;AAAY,OACrD;AAAA,MACA,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,MAAU;AAAA,QACrC,GAAG,KAAA;AAAA,QACH,SAAA,EAAW,KAAA,CAAM,SAAA,CAAU,WAAA;AAAY,OACzC,CAAE;AAAA,KACJ;AAEA,IAAA,MAAMb,eAAAA,CAAW,SAAA;AAAA,MACf,WAAA;AAAA,MACA,IAAA,CAAK,SAAA,CAAU,YAAA,EAAc,IAAA,EAAM,CAAC,CAAA;AAAA,MACpC;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAAA,EAA4C;AAC5D,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAMA,eAAAA,CAAW,QAAA,CAAS,aAAa,OAAO,CAAA;AAC3D,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAG9B,MAAA,OAAO;AAAA,QACL,GAAG,MAAA;AAAA,QACH,IAAA,EAAM;AAAA,UACJ,GAAG,MAAA,CAAO,IAAA;AAAA,UACV,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,UACzC,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,UACzC,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA,GAAc,IAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,GAAI,KAAA;AAAA,SAC7E;AAAA,QACA,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,MAAgB;AAAA,UAC3C,GAAG,KAAA;AAAA,UACH,SAAA,EAAW,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS;AAAA,SACrC,CAAE;AAAA,OACJ;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,SAAS,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,MAAA,EAAoD;AACrE,IAAA,MAAM,KAAK,UAAA,EAAW;AAEtB,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAMA,eAAAA,CAAW,OAAA,CAAQ,KAAK,WAAW,CAAA;AACvD,MAAA,MAAM,eAAe,KAAA,CAAM,MAAA,CAAO,UAAQ,IAAA,CAAK,QAAA,CAAS,OAAO,CAAC,CAAA;AAEhE,MAAA,MAAM,WAA0B,EAAC;AAEjC,MAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,GAAiBa,gBAAA,CAAA,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAC7C,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AAChD,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,QAAA,CAAS,IAAA,CAAK,QAAQ,IAAI,CAAA;AAAA,UAC5B;AAAA,QACF,SAAS,KAAA,EAAO;AAEd,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,4BAAA,EAA+B,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,QAC9D;AAAA,MACF;AAGA,MAAA,IAAI,QAAA,GAAW,QAAA;AAEf,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,UAAA,QAAA,GAAW,QAAA,CAAS,OAAO,CAAA,CAAA,KAAK,MAAA,CAAO,OAAQ,QAAA,CAAS,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,QACnE;AAEA,QAAA,IAAI,OAAO,QAAA,EAAU;AACnB,UAAA,QAAA,GAAW,QAAA,CAAS,OAAO,CAAA,CAAA,KAAK,MAAA,CAAO,SAAU,QAAA,CAAS,CAAA,CAAE,QAAQ,CAAC,CAAA;AAAA,QACvE;AAEA,QAAA,IAAI,OAAO,SAAA,EAAW;AACpB,UAAA,IAAI,MAAA,CAAO,UAAU,KAAA,EAAO;AAC1B,YAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,SAAA,IAAa,MAAA,CAAO,UAAW,KAAM,CAAA;AAAA,UACzE;AACA,UAAA,IAAI,MAAA,CAAO,UAAU,GAAA,EAAK;AACxB,YAAA,QAAA,GAAW,SAAS,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,SAAA,IAAa,MAAA,CAAO,UAAW,GAAI,CAAA;AAAA,UACvE;AAAA,QACF;AAEA,QAAA,IAAI,MAAA,CAAO,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,EAAG;AACzC,UAAA,QAAA,GAAW,QAAA,CAAS,MAAA;AAAA,YAAO,CAAA,CAAA,KACzB,OAAO,IAAA,CAAM,IAAA,CAAK,SAAO,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,GAAG,CAAC;AAAA,WAC/C;AAAA,QACF;AAGA,QAAA,MAAM,MAAA,GAAS,OAAO,MAAA,IAAU,WAAA;AAChC,QAAA,MAAM,SAAA,GAAY,OAAO,SAAA,IAAa,MAAA;AAEtC,QAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,UAAA,MAAM,IAAA,GAAO,EAAE,MAAM,CAAA;AACrB,UAAA,MAAM,IAAA,GAAO,EAAE,MAAM,CAAA;AAErB,UAAA,IAAI,IAAA,KAAS,KAAA,CAAA,IAAa,IAAA,KAAS,KAAA,CAAA,EAAW,OAAO,CAAA;AACrD,UAAA,IAAI,IAAA,KAAS,QAAW,OAAO,CAAA;AAC/B,UAAA,IAAI,IAAA,KAAS,QAAW,OAAO,CAAA,CAAA;AAE/B,UAAA,IAAI,IAAA,GAAO,IAAA,EAAM,OAAO,SAAA,KAAc,QAAQ,CAAA,CAAA,GAAK,CAAA;AACnD,UAAA,IAAI,IAAA,GAAO,IAAA,EAAM,OAAO,SAAA,KAAc,QAAQ,CAAA,GAAI,CAAA,CAAA;AAClD,UAAA,OAAO,CAAA;AAAA,QACT,CAAC,CAAA;AAGD,QAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,UAAA,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AAAA,QACzC;AACA,QAAA,IAAI,OAAO,KAAA,EAAO;AAChB,UAAA,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA;AAAA,QAC3C;AAAA,MACF;AAEA,MAAA,OAAO,QAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,QAAA,OAAO,EAAC;AAAA,MACV;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAA,EAAkC;AACpD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA;AAEjD,IAAA,IAAI;AACF,MAAA,MAAMb,eAAAA,CAAW,OAAO,WAAW,CAAA;AAAA,IACrC,SAAS,KAAA,EAAO;AACd,MAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,SAAS,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,MACnE;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,SAAA,EAAqC;AACvD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA;AAEjD,IAAA,IAAI;AACF,MAAA,MAAMA,eAAAA,CAAW,MAAA,CAAO,WAAA,EAAgBc,iBAAA,CAAA,SAAA,CAAU,IAAI,CAAA;AACtD,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAgB,OAAA,EAA4C;AAChE,IAAA,MAAM,KAAK,UAAA,EAAW;AAEtB,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,IAAI,QAAQ,aAAA,EAAe;AACzB,MAAA,MAAM,UAAA,uBAAiB,IAAA,EAAK;AAC5B,MAAA,UAAA,CAAW,OAAA,CAAQ,UAAA,CAAW,OAAA,EAAQ,GAAI,QAAQ,aAAa,CAAA;AAC/D,MAAA,MAAA,CAAO,SAAA,GAAY,EAAE,GAAA,EAAK,UAAA,EAAW;AAAA,IACvC;AAEA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAA,CAAO,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC1B;AAEA,IAAA,MAAM,iBAAA,GAAoB,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACxD,IAAA,MAAM,cAAwB,EAAC;AAE/B,IAAA,KAAA,MAAW,eAAe,iBAAA,EAAmB;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,YAAY,EAAE,CAAA;AACrD,QAAA,IAAI,CAAC,OAAA,EAAS;AAGd,QAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,WAAA,CAAY,EAAE,CAAA,CAAA,EAAI,WAAA,CAAY,SAAA,CAAU,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,KAAA,CAAA;AAC9F,QAAA,MAAM,WAAA,GAAmBD,gBAAA,CAAA,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,eAAe,CAAA;AAE9D,QAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,UAAA,MAAMb,eAAAA,CAAW,SAAA;AAAA,YACf,WAAA;AAAA,YACA,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,YAC/B;AAAA,WACF;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,MAAMA,eAAAA,CAAW,SAAA;AAAA,YACf,WAAA;AAAA,YACA,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAQ,EAAG,IAAA,EAAM,CAAC,CAAA;AAAA,YACxE;AAAA,WACF;AAAA,QACF;AAGA,QAAA,MAAM,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY,EAAE,CAAA;AACvC,QAAA,WAAA,CAAY,IAAA,CAAK,YAAY,EAAE,CAAA;AAAA,MACjC,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAK,CAAA,0BAAA,EAA6B,WAAA,CAAY,EAAE,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,MACtE;AAAA,IACF;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,OAAA,EAAwC;AACpD,IAAA,MAAM,KAAK,UAAA,EAAW;AAEtB,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,EAAa;AAEzC,IAAA,KAAA,MAAW,eAAe,QAAA,EAAU;AAClC,MAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,MAAA,IAAI,QAAQ,mBAAA,EAAqB;AAC/B,QAAA,MAAM,UAAA,uBAAiB,IAAA,EAAK;AAC5B,QAAA,UAAA,CAAW,OAAA,CAAQ,UAAA,CAAW,OAAA,EAAQ,GAAI,QAAQ,mBAAmB,CAAA;AACrE,QAAA,IAAI,WAAA,CAAY,YAAY,UAAA,EAAY;AACtC,UAAA,YAAA,GAAe,IAAA;AAAA,QACjB;AAAA,MACF;AAEA,MAAA,IAAI,QAAQ,YAAA,IAAgB,OAAA,CAAQ,aAAa,QAAA,CAAS,WAAA,CAAY,MAAM,CAAA,EAAG;AAC7E,QAAA,YAAA,GAAe,IAAA;AAAA,MACjB;AAEA,MAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,WAAA,CAAY,YAAY,EAAE,CAAA;AACrD,UAAA,IAAI,WAAW,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,IAAK,CAAC,QAAQ,MAAA,EAAQ;AAC9D,YAAA,YAAA,GAAe,IAAA;AAAA,UACjB;AAAA,QACF,CAAA,CAAA,MAAQ;AAEN,UAAA,YAAA,GAAe,IAAA;AAAA,QACjB;AAAA,MACF;AAEA,MAAA,IAAI,YAAA,IAAgB,CAAC,OAAA,CAAQ,MAAA,EAAQ;AACnC,QAAA,MAAM,IAAA,CAAK,aAAA,CAAc,WAAA,CAAY,EAAE,CAAA;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAM,cAAA,GAAN,cAA6BY,mBAAAA,CAAa;AAAA,EACvC,OAAA;AAAA,EACA,cAAA,uBAA2C,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvD,YAAY,OAAA,EAAyB;AACnC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,OAAA,EAMC;AACnB,IAAA,MAAM,YAAYG,OAAA,EAAO;AACzB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAGrB,IAAA,MAAM,OAAA,GAA0B;AAAA,MAC9B,gBAAA,EAAkB,QAAQ,MAAA,CAAO,gBAAA;AAAA,MACjC,WAAA,EAAa,EAAE,GAAG,OAAA,CAAQ,GAAA,EAAI;AAAA,MAC9B,MAAA,EAAQ,EAAE,GAAG,OAAA,CAAQ,MAAA,EAAO;AAAA,MAC5B,WAAA,EAAa;AAAA,QACX,KAAK,OAAA,CAAQ,GAAA;AAAA,QACb,aAAa,OAAA,CAAQ,OAAA;AAAA,QACrB,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,MAAM,OAAA,CAAQ;AAAA;AAChB,KACF;AAGA,IAAA,MAAM,OAAA,GAAmB;AAAA,MACvB,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,SAAA;AAAA,QACJ,GAAI,OAAA,CAAQ,IAAA,KAAS,UAAa,EAAE,IAAA,EAAM,QAAQ,IAAA,EAAK;AAAA,QACvD,MAAA,EAAQ,SAAA;AAAA,QACR,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,SAAA,EAAW,GAAA;AAAA,QACX,SAAA,EAAW,GAAA;AAAA,QACX,gBAAA,EAAkB,QAAQ,MAAA,CAAO,gBAAA;AAAA,QACjC,MAAA,EAAQ,EAAE,GAAG,OAAA,CAAQ,MAAA,EAAO;AAAA,QAC5B,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAQ,EAAC;AAAA,QACvB,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY;AAAC,OACjC;AAAA,MACA,OAAA;AAAA,MACA,UAAA,EAAY;AAAA,QACV,QAAA,EAAU,CAAA;AAAA,QACV,UAAA,EAAY,CAAA;AAAA,QACZ,SAAA,EAAW,CAAA;AAAA,QACX,WAAW,EAAC;AAAA,QACZ,WAAA,EAAa,CAAA;AAAA,QACb,UAAA,EAAY,CAAA;AAAA,QACZ,YAAA,EAAc,CAAA;AAAA,QACd,WAAA,EAAa;AAAA,UACX,gBAAA,EAAkB,CAAA;AAAA,UAClB,eAAA,EAAiB,CAAA;AAAA,UACjB,iBAAA,EAAmB;AAAA;AACrB,OACF;AAAA,MACA,SAAS;AAAC,KACZ;AAGA,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAC1C,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAGtC,IAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB;AAAA,MAC3B,IAAA,EAAM,iBAAA;AAAA,MACN,SAAA;AAAA,MACA,SAAA,EAAW,GAAA;AAAA,MACX,IAAA,EAAM,EAAE,OAAA,EAAS,OAAA,CAAQ,IAAA;AAAK,KACf,CAAA;AAEjB,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAA,CAAc,SAAA,EAAmB,OAAA,EAOrB;AAChB,IAAA,IAAI,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAE/C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAY,SAAS,CAAA;AAC9D,MAAA,OAAA,GAAU,aAAA,IAAiB,MAAA;AAC3B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,SAAS,CAAA,UAAA,CAAY,CAAA;AAAA,MAClD;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAClD,IAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAC9C,IAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAC9C,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,OAAA,CAAQ,IAAA,CAAK,WAAW,EAAE,GAAG,QAAQ,IAAA,CAAK,QAAA,EAAU,GAAG,OAAA,CAAQ,QAAA,EAAS;AAAA,IAC1E;AACA,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAA,CAAQ,aAAa,EAAE,GAAG,QAAQ,UAAA,EAAY,GAAG,QAAQ,UAAA,EAAW;AAAA,IACtE;AACA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC3B;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK,SAAA,mBAAY,IAAI,IAAA,EAAK;AAGlC,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAC1C,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAGtC,IAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB;AAAA,MAC3B,IAAA,EAAM,iBAAA;AAAA,MACN,SAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,IAAA,EAAM,EAAE,OAAA;AAAQ,KACD,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAA,CAAgB,SAAA,EAAmB,MAAA,EAKvB;AAChB,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,MAAM,IAAA,CAAK,cAAc,SAAA,EAAW;AAAA,MAClC,MAAA,EAAQ,MAAA,CAAO,OAAA,GAAU,WAAA,GAAc,QAAA;AAAA,MACvC;AAAA,KACD,CAAA;AAED,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAC/C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,WAAA,GAAc,GAAA;AAC3B,MAAA,OAAA,CAAQ,UAAA,CAAW,WAAW,GAAA,CAAI,OAAA,KAAY,OAAA,CAAQ,IAAA,CAAK,UAAU,OAAA,EAAQ;AAE7E,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAGtC,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,SAAS,CAAA;AAAA,IACtC;AAGA,IAAA,IAAA,CAAK,KAAK,mBAAA,EAAqB;AAAA,MAC7B,IAAA,EAAM,mBAAA;AAAA,MACN,SAAA;AAAA,MACA,SAAA,EAAW,GAAA;AAAA,MACX,IAAA,EAAM,EAAE,MAAA;AAAO,KACA,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,SAAA,EAAkC;AACpD,IAAA,MAAM,IAAA,CAAK,cAAc,SAAA,EAAW;AAAA,MAClC,MAAA,EAAQ;AAAA,KACT,CAAA;AAGD,IAAA,IAAA,CAAK,cAAA,CAAe,OAAO,SAAS,CAAA;AAGpC,IAAA,IAAA,CAAK,KAAK,mBAAA,EAAqB;AAAA,MAC7B,IAAA,EAAM,mBAAA;AAAA,MACN,SAAA;AAAA,MACA,SAAA,sBAAe,IAAA;AAAK,KACL,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAW,SAAA,EAA4C;AAE3D,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AACvD,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,OAAO,aAAA;AAAA,IACT;AAGA,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,SAAS,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,aAAa,MAAA,EAAoD;AACrE,IAAA,OAAO,MAAM,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,QAAA,EAKM;AACzB,IAAA,MAAM,SAA4B,EAAC;AACnC,IAAA,IAAI,QAAA,CAAS,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,QAAA,CAAS,MAAA;AAC9C,IAAA,IAAI,QAAA,CAAS,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,QAAA,CAAS,IAAA;AAC1C,IAAA,IAAI,QAAA,CAAS,SAAA,EAAW,MAAA,CAAO,SAAA,GAAY,QAAA,CAAS,SAAA;AAEpD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AAE/C,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,WAAA,EAAY;AACzC,MAAA,OAAO,QAAA,CAAS,MAAA;AAAA,QAAO,CAAA,OAAA,KACrB,OAAA,CAAQ,IAAA,EAAM,WAAA,EAAY,CAAE,SAAS,KAAK,CAAA,IAC1C,OAAA,CAAQ,EAAA,CAAG,WAAA,EAAY,CAAE,SAAS,KAAK,CAAA,IACvC,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,CAAA,GAAA,KAAO,IAAI,WAAA,EAAY,CAAE,QAAA,CAAS,KAAK,CAAC;AAAA,OAC5D;AAAA,IACF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,SAAA,EAAkC;AACpD,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,aAAA,CAAc,SAAS,CAAA;AAC1C,IAAA,IAAA,CAAK,cAAA,CAAe,OAAO,SAAS,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAAgB,OAAA,EAAwC;AAC5D,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAElC,IAAA,IAAA,CAAK,KAAK,mBAAA,EAAqB;AAAA,MAC7B,IAAA,EAAM,mBAAA;AAAA,MACN,SAAA,EAAW,KAAA;AAAA,MACX,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,IAAA,EAAM,EAAE,OAAA;AAAQ,KACD,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAgB,OAAA,EAA4C;AAChE,IAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,OAAA,CAAQ,gBAAgB,OAAO,CAAA;AAG9D,IAAA,KAAA,MAAW,aAAa,WAAA,EAAa;AACnC,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,SAAS,CAAA;AAAA,IACtC;AAEA,IAAA,IAAA,CAAK,KAAK,mBAAA,EAAqB;AAAA,MAC7B,IAAA,EAAM,mBAAA;AAAA,MACN,SAAA,EAAW,UAAA;AAAA,MACX,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,IAAA,EAAM,EAAE,WAAA,EAAa,OAAA;AAAQ,KACd,CAAA;AAEjB,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAA,CAAgB,SAAA,EAAmB,KAAA,EAAqE;AAC5G,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAC/C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,SAAS,CAAA,UAAA,CAAY,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,YAAA,GAAoC;AAAA,MACxC,IAAIA,OAAA,EAAO;AAAA,MACX,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,GAAG;AAAA,KACL;AAEA,IAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,YAAY,CAAA;AACjC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,gBAAA,CAAiB,SAAA,EAAmB,KAAA,EAAkD;AAC1F,IAAA,MAAM,KAAK,aAAA,CAAc,SAAA,EAAW,EAAE,UAAA,EAAY,OAAO,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,CAAe,SAAA,EAAmB,QAAA,EAItB;AAChB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAC/C,IAAA,IAAI,CAAC,OAAA,EAAS;AAGd,IAAA,MAAM,WAAW,OAAA,CAAQ,UAAA,CAAW,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,IAAK;AAAA,MAC9D,MAAM,QAAA,CAAS,IAAA;AAAA,MACf,KAAA,EAAO,CAAA;AAAA,MACP,SAAA,EAAW,CAAA;AAAA,MACX,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc,CAAA;AAAA,MACd,UAAA,EAAY,CAAA;AAAA,MACZ,QAAA,sBAAc,IAAA;AAAK,KACrB;AAEA,IAAA,QAAA,CAAS,KAAA,EAAA;AACT,IAAA,QAAA,CAAS,aAAa,QAAA,CAAS,QAAA;AAC/B,IAAA,QAAA,CAAS,WAAA,GAAc,QAAA,CAAS,SAAA,GAAY,QAAA,CAAS,KAAA;AACrD,IAAA,QAAA,CAAS,QAAA,uBAAe,IAAA,EAAK;AAE7B,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,QAAA,CAAS,YAAA,EAAA;AAAA,IACX,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,UAAA,EAAA;AAAA,IACX;AAEA,IAAA,OAAA,CAAQ,UAAA,CAAW,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,GAAI,QAAA;AAC9C,IAAA,OAAA,CAAQ,UAAA,CAAW,SAAA,EAAA;AAEnB,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,CAAY,OAAO,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,iBAAA,CAAkB,SAAA,EAAmB,OAAA,GAIvC,EAAC,EAAoB;AACvB,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAC/C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,WAAW,SAAS,CAAA,WAAA,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,WAAW,SAAS,CAAA,SAAA,CAAA;AAAA,MACpB,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,MAC9B,CAAA,UAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA,CAAA;AAAA,MAClC,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAA,CAAK,SAAA,CAAU,aAAa,CAAA,CAAA;AAAA,MAChD,CAAA,mBAAA,EAAsB,OAAA,CAAQ,OAAA,CAAQ,gBAAgB,CAAA;AAAA,KACxD;AAEA,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAChC,MAAA,YAAA,CAAa,IAAA,CAAK,SAAS,OAAA,CAAQ,IAAA,CAAK,KAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,YAAA,CAAa,IAAA,CAAK,IAAI,aAAa,CAAA;AACnC,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,cAAA,EAAiB,OAAA,CAAQ,UAAA,CAAW,UAAU,CAAA,CAAE,CAAA;AAClE,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,cAAA,EAAiB,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,CAAE,CAAA;AACjE,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA,YAAA,EAAe,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA,EAAA,CAAI,CAAA;AAChE,MAAA,YAAA,CAAa,IAAA,CAAK,oBAAoB,OAAA,CAAQ,UAAA,CAAW,cAAc,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC3F;AAEA,IAAA,IAAI,QAAQ,cAAA,IAAkB,OAAA,CAAQ,WAAW,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3E,MAAA,YAAA,CAAa,IAAA,CAAK,IAAI,iBAAiB,CAAA;AACvC,MAAA,MAAM,UAAA,GAAa,QAAQ,iBAAA,IAAqB,CAAA;AAChD,MAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,CAAC,UAAU,CAAA;AAEvD,MAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,SAAA,EAAW,WAAA,GAAc,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,SAAA;AAC3E,QAAA,YAAA,CAAa,IAAA,CAAK,CAAA,GAAA,EAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAK,CAAA;AAAA,MACtF;AAAA,IACF;AAEA,IAAA,OAAO,YAAA,CAAa,KAAK,IAAI,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAkB,SAAA,EAUd;AACR,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA;AAC/C,IAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,IAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,UAAA,CAAW,QAAA,IAAY,GAAA,GAAO,EAAA,CAAA;AAC9D,IAAA,MAAM,sBAAsB,eAAA,GAAkB,CAAA,GAAI,OAAA,CAAQ,UAAA,CAAW,aAAa,eAAA,GAAkB,CAAA;AACpG,IAAA,MAAM,qBAAA,GAAwB,OAAA,CAAQ,UAAA,CAAW,UAAA,GAAa,CAAA,GAAI,QAAQ,UAAA,CAAW,SAAA,GAAY,OAAA,CAAQ,UAAA,CAAW,UAAA,GAAa,CAAA;AAEjI,IAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,IAAA,IAAI,QAAA,GAAW,CAAA;AACf,IAAA,KAAA,MAAW,CAAC,UAAU,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AAC5E,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AAC1B,QAAA,QAAA,GAAW,KAAA,CAAM,KAAA;AACjB,QAAA,YAAA,GAAe,QAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,CAAW,SAAA;AACtC,IAAA,MAAM,YAAY,UAAA,GAAa,CAAA,GAAI,OAAA,CAAQ,UAAA,CAAW,aAAa,UAAA,GAAa,CAAA;AAEhF,IAAA,OAAO;AAAA,MACL,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,OAAA,EAAS;AAAA,QACP,aAAA,EAAe,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,WAAW,QAAQ,CAAA;AAAA,QAC9D,mBAAA,EAAqB,MAAA,CAAO,mBAAA,CAAoB,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,QAC1D,qBAAA,EAAuB,MAAA,CAAO,qBAAA,CAAsB,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,QAC9D,YAAA;AAAA,QACA,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAC;AAAA;AACxC,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,eAAe,YAAA,EAA8B;AACnD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,GAAI,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AAErC,IAAA,IAAI,QAAQ,CAAA,EAAG;AACb,MAAA,OAAO,GAAG,KAAK,CAAA,EAAA,EAAK,UAAU,EAAE,CAAA,EAAA,EAAK,UAAU,EAAE,CAAA,CAAA,CAAA;AAAA,IACnD,CAAA,MAAA,IAAW,UAAU,CAAA,EAAG;AACtB,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAA,GAAU,EAAE,CAAA,CAAA,CAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,OAAO,GAAG,OAAO,CAAA,CAAA,CAAA;AAAA,IACnB;AAAA,EACF;AACF;AAoBA,eAAsB,qBAAqB,MAAA,EAAiD;AAC1F,EAAA,MAAM,OAAA,GAAU,IAAI,kBAAA,CAAmB,MAAA,CAAO,gBAAgB,CAAA;AAC9D,EAAA,MAAM,QAAQ,UAAA,EAAW;AACzB,EAAA,OAAO,IAAI,eAAe,OAAO,CAAA;AACnC;AAMA,IAAI,gBAAA,GAAmB,CAAA;AAEhB,IAAM,YAAA,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO1B,mBAAA,GAA8B;AAC5B,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AAErB,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,WAAA,EAAY,CAAE,OAAA,CAAQ,YAAY,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEvE,IAAA,gBAAA,GAAA,CAAoB,mBAAmB,CAAA,IAAK,GAAA;AAC5C,IAAA,MAAM,SAAS,gBAAA,CAAiB,QAAA,EAAS,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAC1D,IAAA,OAAO,SAAA,GAAY,MAAA;AAAA,EACrB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAsB,SAAA,EAAgC;AACpD,IAAA,IAAI;AAEF,MAAA,IAAI,SAAA,CAAU,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3B,QAAA,OAAO,IAAA;AAAA,MACT;AAGA,MAAA,IAAI,SAAA,CAAU,UAAU,EAAA,EAAI;AAC1B,QAAA,MAAM,OAAO,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAC3C,QAAA,MAAM,QAAQ,QAAA,CAAS,SAAA,CAAU,MAAM,CAAA,EAAG,CAAC,CAAC,CAAA,GAAI,CAAA;AAChD,QAAA,MAAM,MAAM,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA;AAC1C,QAAA,MAAM,OAAO,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA;AAC5C,QAAA,MAAM,SAAS,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA;AAC/C,QAAA,MAAM,SAAS,QAAA,CAAS,SAAA,CAAU,KAAA,CAAM,EAAA,EAAI,EAAE,CAAC,CAAA;AAE/C,QAAA,OAAO,IAAI,IAAA,CAAK,IAAA,EAAM,OAAO,GAAA,EAAK,IAAA,EAAM,QAAQ,MAAM,CAAA;AAAA,MACxD;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiB,SAAA,EAA4B;AAE3C,IAAA,MAAM,SAAA,GAAY,4EAAA;AAGlB,IAAA,MAAM,cAAA,GAAiB,qBAAA;AAEvB,IAAA,OAAO,UAAU,IAAA,CAAK,SAAS,CAAA,IAAK,cAAA,CAAe,KAAK,SAAS,CAAA;AAAA,EACnE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,oBAAoB,OAAA,EAA4D;AAC9E,IAAA,MAAM,KAAA,GAAoC;AAAA,MACxC,SAAA,EAAW,CAAA;AAAA,MACX,UAAA,EAAY,CAAA;AAAA,MACZ,YAAA,EAAc,CAAA;AAAA,MACd,WAAW;AAAC,KACd;AAEA,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,IAAI,KAAA,CAAM,SAAS,WAAA,EAAa;AAC9B,QAAA,KAAA,CAAM,SAAA,GAAA,CAAa,KAAA,CAAM,SAAA,IAAa,CAAA,IAAK,CAAA;AAAA,MAC7C,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,OAAA,EAAS;AACjC,QAAA,KAAA,CAAM,UAAA,GAAA,CAAc,KAAA,CAAM,UAAA,IAAc,CAAA,IAAK,CAAA;AAAA,MAC/C;AAAA,IACF;AAEA,IAAA,MAAM,eAAe,OAAA,CAAQ,MAAA;AAC7B,IAAA,KAAA,CAAM,cAAc,YAAA,GAAe,CAAA,GAAI,KAAM,KAAA,CAAM,UAAA,IAAc,KAAK,YAAA,GAAgB,CAAA;AAEtF,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AClsCA,YAAA,EAAA;AAgTO,IAAM,qBAAN,MAAyB;AAAA,EACtB,aAAA,uBAAoD,GAAA,EAAI;AAAA,EACxD,mBAAwC,EAAC;AAAA,EACzC,QAAA;AAAA,EAER,WAAA,GAAc;AAEZ,IAAA,IAAA,CAAK,QAAA,GAAW,IAAIC,8BAAA,CAAoB,CAAC,IAAA,KAAS;AAChD,MAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,UAAA,EAAW,EAAG;AACrC,QAAA,IAAI,KAAA,CAAM,cAAc,SAAA,EAAW;AACjC,UAAA,IAAA,CAAK,uBAAuB,KAAK,CAAA;AAAA,QACnC;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,EAAE,YAAY,CAAC,SAAS,GAAG,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAY,WAAA,EAAwC;AAClD,IAAA,MAAM,SAAA,GAAYC,uBAAY,GAAA,EAAI;AAClC,IAAA,MAAM,YAAA,GAAe,KAAK,qBAAA,EAAsB;AAEhD,IAAA,MAAM,MAAA,GAA4B;AAAA,MAChC,SAAA;AAAA,MACA,OAAA,EAAS,CAAA;AAAA,MACT,QAAA,EAAU,CAAA;AAAA,MACV,YAAA;AAAA,MACA,WAAA,EAAa,CAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACf;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,WAAA,EAAa,MAAM,CAAA;AAC1C,IAAAA,sBAAA,CAAY,IAAA,CAAK,CAAA,EAAG,WAAW,CAAA,MAAA,CAAQ,CAAA;AAEvC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAU,WAAA,EAA+C;AACvD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,WAAW,CAAA;AACjD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,OAAA,GAAUA,uBAAY,GAAA,EAAI;AAChC,IAAA,MAAM,WAAA,GAAc,KAAK,qBAAA,EAAsB;AAE/C,IAAA,MAAA,CAAO,OAAA,GAAU,OAAA;AACjB,IAAA,MAAA,CAAO,QAAA,GAAW,UAAU,MAAA,CAAO,SAAA;AACnC,IAAA,MAAA,CAAO,WAAA,GAAc,WAAA;AACrB,IAAA,MAAA,CAAO,WAAA,GAAc,cAAc,MAAA,CAAO,YAAA;AAE1C,IAAAA,sBAAA,CAAY,IAAA,CAAK,CAAA,EAAG,WAAW,CAAA,IAAA,CAAM,CAAA;AACrC,IAAAA,sBAAA,CAAY,QAAQ,WAAA,EAAa,CAAA,EAAG,WAAW,CAAA,MAAA,CAAA,EAAU,CAAA,EAAG,WAAW,CAAA,IAAA,CAAM,CAAA;AAE7E,IAAA,IAAA,CAAK,aAAA,CAAc,OAAO,WAAW,CAAA;AACrC,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAEjC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,qBAAA,GAAgC;AACtC,IAAA,OAAO,OAAA,CAAQ,aAAY,CAAE,QAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAuB,KAAA,EAA+B;AAAA,EAG9D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAA,GAQE;AACA,IAAA,IAAI,IAAA,CAAK,gBAAA,CAAiB,MAAA,KAAW,CAAA,EAAG;AACtC,MAAA,OAAO;AAAA,QACL,eAAA,EAAiB,CAAA;AAAA,QACjB,WAAA,EAAa,CAAA;AAAA,QACb,WAAA,EAAa,CAAA;AAAA,QACb,WAAA,EAAa,CAAA;AAAA,QACb,WAAA,EAAa,CAAA;AAAA,QACb,WAAA,EAAa,CAAA;AAAA,QACb,cAAA,EAAgB;AAAA,OAClB;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AACjF,IAAA,MAAM,eAAe,IAAA,CAAK,gBAAA,CAAiB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,WAAW,CAAA;AAEjE,IAAA,OAAO;AAAA,MACL,eAAA,EAAiB,KAAK,gBAAA,CAAiB,MAAA;AAAA,MACvC,WAAA,EAAa,SAAA,CAAU,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,GAAI,SAAA,CAAU,MAAA;AAAA,MAClE,WAAA,EAAa,UAAU,CAAC,CAAA;AAAA,MACxB,WAAA,EAAa,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAAA,MAC3C,aAAa,SAAA,CAAU,IAAA,CAAK,MAAM,SAAA,CAAU,MAAA,GAAS,IAAI,CAAC,CAAA;AAAA,MAC1D,aAAa,SAAA,CAAU,IAAA,CAAK,MAAM,SAAA,CAAU,MAAA,GAAS,IAAI,CAAC,CAAA;AAAA,MAC1D,cAAA,EAAgB,YAAA,CAAa,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,GAAI,YAAA,CAAa;AAAA,KAC7E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,IAAA,IAAA,CAAK,mBAAmB,EAAC;AACzB,IAAAA,sBAAA,CAAY,UAAA,EAAW;AACvB,IAAAA,sBAAA,CAAY,aAAA,EAAc;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,SAAS,UAAA,EAAW;AACzB,IAAA,IAAA,CAAK,KAAA,EAAM;AAAA,EACb;AACF;AAKO,IAAM,uBAAN,MAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOhC,OAAO,oBAAA,CAAqB,MAAA,EAAkB,WAAA,EAA+C;AAC3F,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,EAAC;AAAA,IACV;AAEA,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,MAAM,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAC/C,IAAA,MAAM,SAAiC,EAAC;AAExC,IAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,MAAA,MAAM,KAAA,GAAS,CAAA,GAAI,GAAA,IAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,CAAA;AAC3C,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA;AAC7B,MAAA,MAAM,SAAS,KAAA,GAAQ,KAAA;AAEvB,MAAA,IAAI,KAAA,IAAS,OAAO,MAAA,EAAQ;AAC1B,QAAA,MAAA,CAAO,IAAI,CAAC,CAAA,CAAE,IAAI,MAAA,CAAO,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,MAC5C,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA,GAAI,MAAA,CAAO,KAAK,CAAA,IAAK,CAAA,GAAI,MAAA,CAAA,GAAU,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA;AAAA,MACnE;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,wBAAwB,SAAA,EAAkE;AAC/F,IAAA,MAAM,cAAkD,EAAC;AAEzD,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,IAAI,CAAC,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,EAAG;AAC3B,QAAA,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA,GAAI;AAAA,UACvB,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,UAAA,EAAY,CAAA;AAAA,UACZ,eAAA,EAAiB,CAAA;AAAA,UACjB,WAAA,EAAa,CAAA;AAAA,UACb,WAAA,EAAa,CAAA;AAAA,UACb,WAAA,EAAa,QAAA;AAAA,UACb,WAAA,EAAa,CAAA;AAAA,UACb,WAAA,EAAa,CAAA;AAAA,UACb,WAAA,EAAa,CAAA;AAAA,UACb,WAAA,EAAa,CAAA;AAAA,UACb,aAAA,EAAe,CAAA;AAAA,UACf,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,UAAU,IAAA,CAAK,SAAA;AAAA,UACf,cAAc,EAAC;AAAA,UACf,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,EAAE,QAAQ,EAAA,EAAG,EAAG,CAAC,CAAA,EAAG,OAAO,EAAE,IAAA,EAAM,CAAA,EAAG,KAAA,EAAO,GAAE,CAAE;AAAA,SAC5E;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,IAAI,CAAA;AACnC,MAAA,KAAA,CAAM,UAAA,EAAA;AACN,MAAA,KAAA,CAAM,iBAAiB,IAAA,CAAK,QAAA;AAE5B,MAAA,IAAI,KAAK,OAAA,EAAS;AAChB,QAAA,KAAA,CAAM,eAAA,EAAA;AAAA,MACR,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,WAAA,EAAA;AACN,QAAA,IAAI,KAAK,KAAA,EAAO;AACd,UAAA,MAAM,aAAA,GAAgB,MAAM,YAAA,CAAa,IAAA,CAAK,OAAK,CAAA,CAAE,KAAA,KAAU,KAAK,KAAK,CAAA;AACzE,UAAA,IAAI,aAAA,EAAe;AACjB,YAAA,aAAA,CAAc,KAAA,EAAA;AAAA,UAChB,CAAA,MAAO;AACL,YAAA,KAAA,CAAM,YAAA,CAAa,KAAK,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,KAAA,EAAO,GAAG,CAAA;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAEA,MAAA,KAAA,CAAM,cAAc,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,WAAA,EAAa,KAAK,QAAQ,CAAA;AAC7D,MAAA,KAAA,CAAM,cAAc,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,WAAA,EAAa,KAAK,QAAQ,CAAA;AAC7D,MAAA,KAAA,CAAM,YAAY,IAAA,CAAK,SAAA,GAAY,MAAM,SAAA,GAAY,IAAA,CAAK,YAAY,KAAA,CAAM,SAAA;AAC5E,MAAA,KAAA,CAAM,WAAW,IAAA,CAAK,SAAA,GAAY,MAAM,QAAA,GAAW,IAAA,CAAK,YAAY,KAAA,CAAM,QAAA;AAG1E,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,QAAA,EAAS;AACrC,MAAA,KAAA,CAAM,YAAA,CAAa,IAAI,CAAA,CAAE,KAAA,EAAA;AAAA,IAC3B;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA,EAAG;AAC9C,MAAA,KAAA,CAAM,cAAc,KAAA,CAAM,UAAA,GAAa,IAAI,KAAA,CAAM,eAAA,GAAkB,MAAM,UAAA,GAAa,CAAA;AACtF,MAAA,KAAA,CAAM,cAAc,KAAA,CAAM,UAAA,GAAa,IAAI,KAAA,CAAM,aAAA,GAAgB,MAAM,UAAA,GAAa,CAAA;AAGpF,MAAA,MAAM,SAAA,GAAY,SAAA,CACf,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA,CACvC,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,QAAQ,CAAA;AAE5B,MAAA,MAAM,cAAc,IAAA,CAAK,oBAAA,CAAqB,WAAW,CAAC,EAAA,EAAI,EAAE,CAAC,CAAA;AACjE,MAAA,KAAA,CAAM,WAAA,GAAc,YAAY,GAAA,IAAO,CAAA;AACvC,MAAA,KAAA,CAAM,WAAA,GAAc,YAAY,GAAA,IAAO,CAAA;AAGvC,MAAA,KAAA,CAAM,YAAA,CAAa,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AACnD,MAAA,KAAA,CAAM,YAAA,GAAe,KAAA,CAAM,YAAA,CAAa,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,IACpD;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,uBAAA,CACL,cAAA,EACA,cAAA,EACA,aAAA,EAC6B;AAC7B,IAAA,MAAM,kBAA+C,EAAC;AAGtD,IAAA,KAAA,MAAW,CAAC,QAAA,EAAU,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC9D,MAAA,IAAI,KAAA,CAAM,cAAc,GAAA,EAAM;AAC5B,QAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,UACnB,IAAIF,OAAAA,EAAO;AAAA,UACX,IAAA,EAAM,aAAA;AAAA,UACN,QAAA,EAAU,KAAA,CAAM,WAAA,GAAc,GAAA,GAAQ,MAAA,GAAS,QAAA;AAAA,UAC/C,KAAA,EAAO,QAAQ,QAAQ,CAAA,oBAAA,CAAA;AAAA,UACvB,WAAA,EAAa,OAAO,QAAQ,CAAA,uCAAA,EAAA,CAA2C,MAAM,WAAA,GAAc,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,+CAAA,CAAA;AAAA,UAC3G,MAAA,EAAQ,gBAAgB,QAAQ,CAAA,uCAAA,CAAA;AAAA,UAChC,MAAA,EAAQ,uBAAuB,QAAQ,CAAA,gFAAA,CAAA;AAAA,UACvC,iBAAA,EAAmB;AAAA,YACjB,aAAa,KAAA,CAAM,WAAA;AAAA,YACnB,YAAY,KAAA,CAAM;AAAA,WACpB;AAAA,UACA,SAAA,sBAAe,IAAA;AAAK,SACrB,CAAA;AAAA,MACH;AAGA,MAAA,IAAI,KAAA,CAAM,UAAA,GAAa,EAAA,IAAM,KAAA,CAAM,cAAc,GAAA,EAAK;AACpD,QAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,UACnB,IAAIA,OAAAA,EAAO;AAAA,UACX,IAAA,EAAM,aAAA;AAAA,UACN,QAAA,EAAU,KAAA,CAAM,WAAA,GAAc,GAAA,GAAM,UAAA,GAAa,MAAA;AAAA,UACjD,KAAA,EAAO,yBAAyB,QAAQ,CAAA,KAAA,CAAA;AAAA,UACxC,WAAA,EAAa,OAAO,QAAQ,CAAA,YAAA,EAAA,CAAgB,MAAM,WAAA,GAAc,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,8CAAA,CAAA;AAAA,UAC/E,MAAA,EAAQ,CAAA,0EAAA,CAAA;AAAA,UACR,MAAA,EAAQ,UAAU,QAAQ,CAAA,gEAAA,CAAA;AAAA,UAC1B,iBAAA,EAAmB;AAAA,YACjB,aAAa,KAAA,CAAM,WAAA;AAAA,YACnB,aAAa,KAAA,CAAM,WAAA;AAAA,YACnB,YAAY,KAAA,CAAM;AAAA,WACpB;AAAA,UACA,SAAA,sBAAe,IAAA;AAAK,SACrB,CAAA;AAAA,MACH;AAAA,IACF;AAGA,IAAA,IAAI,aAAA,CAAc,WAAA,CAAY,UAAA,GAAa,EAAA,EAAI;AAC7C,MAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,QACnB,IAAIA,OAAAA,EAAO;AAAA,QACX,IAAA,EAAM,aAAA;AAAA,QACN,QAAA,EAAU,UAAA;AAAA,QACV,KAAA,EAAO,4BAAA;AAAA,QACP,aAAa,CAAA,0BAAA,EAA6B,aAAA,CAAc,YAAY,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,2CAAA,CAAA;AAAA,QACzF,MAAA,EAAQ,8FAAA;AAAA,QACR,MAAA,EAAQ,gHAAA;AAAA,QACR,iBAAA,EAAmB;AAAA,UACjB,gBAAA,EAAkB,cAAc,WAAA,CAAY,UAAA;AAAA,UAC5C,UAAA,EAAY,cAAc,WAAA,CAAY;AAAA,SACxC;AAAA,QACA,SAAA,sBAAe,IAAA;AAAK,OACrB,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,kBAAA,GAAqB,cAAA,CAAe,MAAA,GAAS,CAAA,GAC/C,eAAe,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA,GAAI,eAAe,MAAA,GACxE,CAAA;AAEJ,IAAA,IAAI,qBAAqB,GAAA,EAAQ;AAC/B,MAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,QACnB,IAAIA,OAAAA,EAAO;AAAA,QACX,IAAA,EAAM,YAAA;AAAA,QACN,QAAA,EAAU,QAAA;AAAA,QACV,KAAA,EAAO,iCAAA;AAAA,QACP,aAAa,CAAA,4BAAA,EAAA,CAAgC,kBAAA,GAAqB,GAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,wDAAA,CAAA;AAAA,QACnF,MAAA,EAAQ,4EAAA;AAAA,QACR,MAAA,EAAQ,iGAAA;AAAA,QACR,iBAAA,EAAmB;AAAA,UACjB,kBAAA;AAAA,UACA,eAAe,cAAA,CAAe;AAAA,SAChC;AAAA,QACA,SAAA,sBAAe,IAAA;AAAK,OACrB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,eAAA;AAAA,EACT;AACF;AAKO,IAAM,gBAAA,GAAN,cAA+BH,mBAAAA,CAAa;AAAA,EACzC,kBAAA;AAAA,EACA,kBAAqC,EAAC;AAAA,EACtC,cAAA,uBAAkD,GAAA,EAAI;AAAA,EACtD,aAAA;AAAA,EACA,YAAA,GAAwB,KAAA;AAAA,EACxB,SAAA;AAAA,EAER,WAAA,GAAc;AACZ,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAI,kBAAA,EAAmB;AACjD,IAAA,IAAA,CAAK,SAAA,GAAYK,uBAAY,GAAA,EAAI;AACjC,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,uBAAA,EAAwB;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAA,GAAyC;AAC/C,IAAA,MAAMC,YAAAA,GAAc,QAAQ,WAAA,EAAY;AACxC,IAAA,MAAM,WAAWC,WAAA,EAAS;AAC1B,IAAA,MAAM,UAAUC,UAAA,EAAQ;AACxB,IAAA,MAAM,UAAU,QAAA,GAAW,OAAA;AAE3B,IAAA,OAAO;AAAA,MACL,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,WAAA,EAAa,CAAA;AAAA;AAAA,MACb,cAAA,EAAgB,CAAA;AAAA,MAChB,sBAAA,EAAwB,CAAA;AAAA,MACxB,eAAA,EAAiB,CAAA;AAAA,MACjB,QAAA,EAAU,CAAA;AAAA,MACV,WAAA,EAAa;AAAA,QACX,KAAA,EAAO,QAAA;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,UAAA,EAAa,UAAU,QAAA,GAAY,GAAA;AAAA,QACnC,UAAUF,YAAAA,CAAY,QAAA;AAAA,QACtB,WAAWA,YAAAA,CAAY,SAAA;AAAA,QACvB,UAAUA,YAAAA,CAAY;AAAA,OACxB;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,aAAA,EAAe,CAAA;AAAA,QACf,kBAAA,EAAoB,CAAA;AAAA,QACpB,cAAA,EAAgB,CAAA;AAAA,QAChB,eAAA,EAAiB,CAAA;AAAA,QACjB,qBAAA,EAAuB;AAAA,OACzB;AAAA,MACA,iBAAA,EAAmB;AAAA,QACjB,eAAA,EAAiB,CAAA;AAAA,QACjB,cAAA,EAAgB,CAAA;AAAA,QAChB,eAAA,EAAiB,CAAA;AAAA,QACjB,gBAAA,EAAkB;AAAA;AACpB,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAwB;AACtB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,aAAA,CAAc,WAAA,GAAcD,sBAAA,CAAY,GAAA,KAAQ,IAAA,CAAK,SAAA;AAG1D,IAAA,IAAA,CAAK,4BAAA,EAA6B;AAElC,IAAA,IAAA,CAAK,KAAK,oBAAA,EAAsB,EAAE,2BAAW,IAAI,IAAA,IAAQ,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAuB;AACrB,IAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,IAAA,IAAA,CAAK,KAAK,oBAAA,EAAsB,EAAE,2BAAW,IAAI,IAAA,IAAQ,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAAA,GAAqC;AAC3C,IAAA,MAAM,uBAAuB,MAAM;AACjC,MAAA,IAAI,CAAC,KAAK,YAAA,EAAc;AACtB,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,mBAAA,EAAoB;AAGzB,MAAA,UAAA,CAAW,sBAAsB,GAAK,CAAA;AAAA,IACxC,CAAA;AAGA,IAAA,UAAA,CAAW,sBAAsB,GAAI,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAA4B;AAClC,IAAA,MAAMC,YAAAA,GAAc,QAAQ,WAAA,EAAY;AACxC,IAAA,MAAM,WAAWC,WAAA,EAAS;AAC1B,IAAA,MAAM,UAAUC,UAAA,EAAQ;AACxB,IAAA,MAAM,UAAU,QAAA,GAAW,OAAA;AAE3B,IAAA,IAAA,CAAK,aAAA,GAAgB;AAAA,MACnB,GAAG,IAAA,CAAK,aAAA;AAAA,MACR,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,WAAA,EAAa;AAAA,QACX,KAAA,EAAO,QAAA;AAAA,QACP,IAAA,EAAM,OAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,UAAA,EAAa,UAAU,QAAA,GAAY,GAAA;AAAA,QACnC,UAAUF,YAAAA,CAAY,QAAA;AAAA,QACtB,WAAWA,YAAAA,CAAY,SAAA;AAAA,QACvB,UAAUA,YAAAA,CAAY;AAAA;AACxB,KACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,wBAAA,EAA0B,IAAA,CAAK,aAAa,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAe,OAAA,EAA8D;AAC3E,IAAA,MAAM,eAAA,GAAmC;AAAA,MACvC,GAAG,OAAA;AAAA,MACH,QAAQH,OAAAA,EAAO;AAAA,MACf,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,eAAe,CAAA;AAGzC,IAAA,IAAI,eAAA,CAAgB,mBAAmB,MAAA,EAAW;AAChD,MAAA,IAAA,CAAK,cAAc,cAAA,CAAe,aAAA,EAAA;AAClC,MAAA,IAAI,gBAAgB,OAAA,EAAS;AAC3B,QAAA,IAAA,CAAK,cAAc,cAAA,CAAe,kBAAA,EAAA;AAAA,MACpC,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,cAAc,cAAA,CAAe,cAAA,EAAA;AAAA,MACpC;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,sBAAsB,eAAe,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YAAA,CAAa,SAAA,EAAmB,QAAA,EAAwB,gBAAA,EAA0B,KAAA,EAAsB;AACtG,IAAA,MAAM,cAAA,GAAiC;AAAA,MACrC,SAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ,SAAA;AAAA,MACR,UAAA,EAAY,CAAA;AAAA,MACZ,SAAA,EAAW,CAAA;AAAA,MACX,YAAA,EAAc,CAAA;AAAA,MACd,UAAA,EAAY,CAAA;AAAA,MACZ,YAAA,EAAc,CAAA;AAAA,MACd,WAAA,EAAa,CAAA;AAAA,MACb,oBAAA,EAAsB,CAAA;AAAA,MACtB,mBAAA,EAAqB,CAAA;AAAA,MACrB,iBAAA,EAAmB,CAAA;AAAA,MACnB,eAAA,EAAiB,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA;AAAA,MACvC,cAAA,EAAgB,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA;AAAA,MACtC,kBAAA,EAAoB,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA;AAAA,MAC1C,QAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAA,EAAW,cAAc,CAAA;AACjD,IAAA,IAAA,CAAK,IAAA,CAAK,mBAAmB,cAAc,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAA,CAAc,WAAmB,OAAA,EAAwC;AACvE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AACjD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,MAAA,CAAO,SAAS,OAAO,CAAA;AAG9B,IAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,MAAA,OAAA,CAAQ,WAAW,OAAA,CAAQ,OAAA,CAAQ,SAAQ,GAAI,OAAA,CAAQ,UAAU,OAAA,EAAQ;AAAA,IAC3E;AAGA,IAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,WAAA,EAAY,CAAE,QAAA;AAC5C,IAAA,OAAA,CAAQ,kBAAA,GAAqB,aAAA;AAC7B,IAAA,OAAA,CAAQ,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,iBAAiB,aAAa,CAAA;AAEzE,IAAA,IAAA,CAAK,IAAA,CAAK,mBAAmB,OAAO,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAA,CAAW,WAAmB,MAAA,EAA6B;AACzD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AACjD,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,OAAA,uBAAc,IAAA,EAAK;AAC3B,IAAA,OAAA,CAAQ,MAAA,GAAS,MAAA;AACjB,IAAA,OAAA,CAAQ,WAAW,OAAA,CAAQ,OAAA,CAAQ,SAAQ,GAAI,OAAA,CAAQ,UAAU,OAAA,EAAQ;AAGzE,IAAA,MAAM,mBAAmB,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA,EAAA,KAAM,EAAA,CAAG,cAAc,SAAS,CAAA;AACrF,IAAA,OAAA,CAAQ,YAAY,gBAAA,CAAiB,MAAA;AAErC,IAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,MAAA,OAAA,CAAQ,mBAAA,GAAsB,gBAAA,CAAiB,MAAA,CAAO,CAAC,GAAA,EAAK,EAAA,KAAO,GAAA,GAAM,EAAA,CAAG,QAAA,EAAU,CAAC,CAAA,GAAI,gBAAA,CAAiB,MAAA;AAC5G,MAAA,OAAA,CAAQ,eAAe,gBAAA,CAAiB,MAAA,CAAO,CAAA,EAAA,KAAM,EAAA,CAAG,OAAO,CAAA,CAAE,MAAA;AACjE,MAAA,OAAA,CAAQ,aAAa,gBAAA,CAAiB,MAAA,CAAO,QAAM,CAAC,EAAA,CAAG,OAAO,CAAA,CAAE,MAAA;AAChE,MAAA,OAAA,CAAQ,WAAA,GAAc,OAAA,CAAQ,YAAA,GAAe,gBAAA,CAAiB,MAAA;AAAA,IAChE;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,iBAAiB,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,uBAAA,CAAwB,aAAA,EAAuB,QAAA,EAAkB,QAAA,EAAsC;AAErG,IAAA,QAAQ,aAAA;AAAe,MACrB,KAAK,aAAA;AACH,QAAA,IAAA,CAAK,cAAc,cAAA,GAAiB,QAAA;AACpC,QAAA;AAAA,MACF,KAAK,qBAAA;AACH,QAAA,IAAA,CAAK,cAAc,sBAAA,GAAyB,QAAA;AAC5C,QAAA;AAAA,MACF,KAAK,cAAA;AACH,QAAA,IAAA,CAAK,cAAc,eAAA,GAAkB,QAAA;AACrC,QAAA;AAAA;AAGJ,IAAA,IAAA,CAAK,KAAK,sBAAA,EAAwB;AAAA,MAChC,aAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA,sBAAe,IAAA;AAAK,KACrB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,SAAA,EAAyD;AAC1E,IAAA,IAAI,oBAAoB,IAAA,CAAK,eAAA;AAC7B,IAAA,IAAI,mBAAmB,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAG9D,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,iBAAA,GAAoB,KAAK,eAAA,CAAgB,MAAA;AAAA,QACvC,QAAM,EAAA,CAAG,SAAA,IAAa,UAAU,KAAA,IAAS,EAAA,CAAG,aAAa,SAAA,CAAU;AAAA,OACrE;AACA,MAAA,gBAAA,GAAmB,gBAAA,CAAiB,MAAA;AAAA,QAClC,OAAK,CAAA,CAAE,SAAA,IAAa,UAAU,KAAA,IAAS,CAAA,CAAE,aAAa,SAAA,CAAU;AAAA,OAClE;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,oBAAA,CAAqB,uBAAA,CAAwB,iBAAiB,CAAA;AAGrF,IAAA,MAAM,yBAAoD,EAAC;AAC3D,IAAA,KAAA,MAAW,WAAW,gBAAA,EAAkB;AACtC,MAAA,IAAI,CAAC,sBAAA,CAAuB,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC7C,QAAA,sBAAA,CAAuB,OAAA,CAAQ,QAAQ,CAAA,GAAI;AAAA,UACzC,KAAA,EAAO,CAAA;AAAA,UACP,aAAA,EAAe,CAAA;AAAA,UACf,eAAA,EAAiB,CAAA;AAAA,UACjB,kBAAA,EAAoB;AAAA,SACtB;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,sBAAA,CAAuB,OAAA,CAAQ,QAAQ,CAAA;AACrD,MAAA,KAAA,CAAM,KAAA,EAAA;AACN,MAAA,KAAA,CAAM,iBAAiB,OAAA,CAAQ,QAAA;AAC/B,MAAA,KAAA,CAAM,mBAAmB,OAAA,CAAQ,UAAA;AACjC,MAAA,IAAI,OAAA,CAAQ,WAAW,WAAA,EAAa;AAClC,QAAA,KAAA,CAAM,kBAAA,EAAA;AAAA,MACR;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,MAAA,CAAO,sBAAsB,CAAA,EAAG;AACzD,MAAA,KAAA,CAAM,cAAc,KAAA,CAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,aAAA,GAAgB,MAAM,KAAA,GAAQ,CAAA;AAC1E,MAAA,KAAA,CAAM,gBAAgB,KAAA,CAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,eAAA,GAAkB,MAAM,KAAA,GAAQ,CAAA;AAC9E,MAAA,KAAA,CAAM,cAAc,KAAA,CAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,kBAAA,GAAqB,MAAM,KAAA,GAAQ,CAAA;AAC/E,MAAA,OAAO,KAAA,CAAM,aAAA;AACb,MAAA,OAAO,KAAA,CAAM,eAAA;AACb,MAAA,OAAO,KAAA,CAAM,kBAAA;AAAA,IACf;AAGA,IAAA,MAAM,iBAAA,GAAoB;AAAA,MACxB,wBAAwB,EAAC;AAAA,MACzB,kBAAkB,EAAC;AAAA,MACnB,gBAAgB;AAAC,KACnB;AAGA,IAAA,MAAM,kBAAkB,oBAAA,CAAqB,uBAAA;AAAA,MAC3C,gBAAA;AAAA,MACA,cAAA;AAAA,MACA,IAAA,CAAK;AAAA,KACP;AAEA,IAAA,OAAO;AAAA,MACL,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,WAAW,SAAA,IAAa;AAAA,QACtB,KAAA,kBAAO,IAAI,IAAA,CAAK,CAAC,CAAA;AAAA,QACjB,GAAA,sBAAS,IAAA;AAAK,OAChB;AAAA,MACA,OAAA,EAAS;AAAA,QACP,eAAe,gBAAA,CAAiB,MAAA;AAAA,QAChC,eAAA,EAAiB,iBAAiB,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,CAAC,CAAA;AAAA,QAC1E,gBAAgB,iBAAA,CAAkB,MAAA;AAAA,QAClC,kBAAA,EAAoB,gBAAA,CAAiB,MAAA,GAAS,CAAA,GAC1C,iBAAiB,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,QAAA,EAAU,CAAC,CAAA,GAAI,iBAAiB,MAAA,GAC5E,CAAA;AAAA,QACJ,kBAAA,EAAoB,iBAAA,CAAkB,MAAA,GAAS,CAAA,GAC3C,iBAAA,CAAkB,MAAA,CAAO,CAAA,EAAA,KAAM,EAAA,CAAG,OAAO,CAAA,CAAE,MAAA,GAAS,iBAAA,CAAkB,MAAA,GACtE,CAAA;AAAA,QACJ,aAAa,iBAAA,CAAkB,MAAA,CAAO,QAAM,CAAC,EAAA,CAAG,OAAO,CAAA,CAAE;AAAA,OAC3D;AAAA,MACA,cAAA;AAAA,MACA,sBAAA;AAAA,MACA,iBAAA;AAAA,MACA,mBAAmB,IAAA,CAAK,aAAA;AAAA,MACxB,eAAA;AAAA,MACA,aAAA,EAAe;AAAA,QACb,UAAA,EAAY,KAAK,GAAA,CAAI,GAAG,iBAAiB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,eAAe,CAAC,CAAA;AAAA,QACpE,SAAA,EAAW,gBAAA,CAAiB,MAAA,GAAS,CAAA,GACjC,iBAAiB,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,MAAM,CAAA,CAAE,cAAA,EAAgB,CAAC,CAAA,GAAI,iBAAiB,MAAA,GAClF,CAAA;AAAA,QACJ,cAAA,EAAgB,KAAK,aAAA,CAAc,QAAA;AAAA,QACnC,kBAAA,EAAoB,IAAA,CAAK,aAAA,CAAc,cAAA,CAAe;AAAA;AACxD,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAA,GAAwD;AACtD,IAAA,OAAO,oBAAA,CAAqB,uBAAA,CAAwB,IAAA,CAAK,eAAe,CAAA;AAAA,EAC1E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,SAAA,EAA+C;AAC/D,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAA,GAAyC;AACvC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAAkC;AAChC,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,OAAO,IAAA,CAAK,aAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,kBAAkB,EAAC;AACxB,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAA,IAAA,CAAK,mBAAmB,KAAA,EAAM;AAC9B,IAAA,IAAA,CAAK,aAAA,GAAgB,KAAK,uBAAA,EAAwB;AAClD,IAAA,IAAA,CAAK,KAAK,iBAAA,EAAmB,EAAE,2BAAW,IAAI,IAAA,IAAQ,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAA,CAAK,cAAA,EAAe;AACpB,IAAA,IAAA,CAAK,mBAAmB,OAAA,EAAQ;AAChC,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AACF;AAKO,IAAM,kBAAN,MAAsB;AAAA,EACnB,gBAAA;AAAA,EAER,YAAY,gBAAA,EAAoC;AAC9C,IAAA,IAAA,CAAK,gBAAA,GAAmB,gBAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,sBAAsB,SAAA,EAA4B;AAChD,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,gBAAA,CAAiB,iBAAA,CAAkB,SAAS,CAAA;AACxE,MAAA,IAAI,cAAA,EAAgB;AAClB,QAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,mBAAA,CAAoB,cAAc,CAAC,CAAA;AAAA,MACtD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,kBAAA,EAAmB;AACjE,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,qBAAA,CAAsB,eAAe,CAAC,CAAA;AAAA,IACzD;AAEA,IAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,oBAAoB,OAAA,EAAiC;AAC3D,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,4dAAA;AAAA,MACA,oFAAA;AAAA,MACA,4dAAA;AAAA,MACA,EAAA;AAAA,MACA,CAAA,YAAA,EAAe,QAAQ,SAAS,CAAA,CAAA;AAAA,MAChC,CAAA,UAAA,EAAa,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK,OAAA,CAAQ,KAAK,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAA;AAAA,MAC1E,CAAA,QAAA,EAAW,OAAA,CAAQ,MAAA,CAAO,WAAA,EAAa,CAAA,CAAA;AAAA,MACvC,CAAA,UAAA,EAAa,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAA;AAAA,MAClD,CAAA,mBAAA,EAAsB,QAAQ,gBAAgB,CAAA,CAAA;AAAA,MAC9C,EAAA;AAAA,MACA,6XAAA;AAAA,MACA,CAAA,YAAA,EAAe,QAAQ,UAAU,CAAA,CAAA;AAAA,MACjC,CAAA,YAAA,EAAe,QAAQ,SAAS,CAAA,CAAA;AAAA,MAChC,kBAAkB,OAAA,CAAQ,WAAA,GAAc,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,MACvD,CAAA,wBAAA,EAA2B,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,oBAAoB,CAAC,CAAA,CAAA;AAAA,MAC5E,CAAA,wBAAA,EAA2B,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,mBAAmB,CAAC,CAAA,CAAA;AAAA,MAC3E,EAAA;AAAA,MACA,sZAAA;AAAA,MACA,CAAA,aAAA,EAAgB,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,eAAe,CAAC,CAAA,CAAA;AAAA,MACzD,CAAA,gBAAA,EAAmB,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,cAAc,CAAC,CAAA,CAAA;AAAA,MAC3D,CAAA,gBAAA,EAAmB,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,kBAAkB,CAAC,CAAA,CAAA;AAAA,MAC/D,EAAA;AAAA,MACA,sYAAA;AAAA,MACA,CAAA,cAAA,EAAiB,QAAQ,UAAU,CAAA,CAAA;AAAA,MACnC,CAAA,gBAAA,EAAmB,QAAQ,YAAY,CAAA,CAAA;AAAA,MACvC,CAAA,YAAA,EAAe,OAAA,CAAQ,SAAA,GAAY,CAAA,GAAA,CAAM,OAAA,CAAQ,UAAA,GAAa,OAAA,CAAQ,SAAA,GAAa,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,KACxG;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,sBAAsB,SAAA,EAAoC;AAChE,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,4dAAA;AAAA,MACA,oFAAA;AAAA,MACA,4dAAA;AAAA,MACA,EAAA;AAAA,MACA,CAAA,kBAAA,EAAqB,SAAA,CAAU,SAAA,CAAU,WAAA,EAAa,CAAA,CAAA;AAAA,MACtD,CAAA,YAAA,EAAe,SAAA,CAAU,SAAA,CAAU,KAAA,CAAM,WAAA,EAAa,CAAA,IAAA,EAAO,SAAA,CAAU,SAAA,CAAU,GAAA,CAAI,WAAA,EAAa,CAAA,CAAA;AAAA,MAClG,EAAA;AAAA,MACA,wXAAA;AAAA,MACA,CAAA,gBAAA,EAAmB,SAAA,CAAU,OAAA,CAAQ,aAAa,CAAA,CAAA;AAAA,MAClD,CAAA,kBAAA,EAAqB,SAAA,CAAU,OAAA,CAAQ,eAAe,CAAA,CAAA;AAAA,MACtD,CAAA,kBAAA,EAAqB,SAAA,CAAU,OAAA,CAAQ,cAAc,CAAA,CAAA;AAAA,MACrD,6BAA6B,IAAA,CAAK,cAAA,CAAe,SAAA,CAAU,OAAA,CAAQ,kBAAkB,CAAC,CAAA,CAAA;AAAA,MACtF,0BAA0B,SAAA,CAAU,OAAA,CAAQ,qBAAqB,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,MAChF,CAAA,cAAA,EAAiB,SAAA,CAAU,OAAA,CAAQ,WAAW,CAAA,CAAA;AAAA,MAC9C,EAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,cAAc,CAAA,CACvD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,UAAA,GAAa,EAAE,UAAU,CAAA;AAE7C,IAAA,KAAA,MAAW,IAAA,IAAQ,WAAA,CAAY,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG;AAC3C,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,CAAA,EAAG,KAAK,IAAI,CAAA,CAAA,CAAA;AAAA,QACZ,CAAA,SAAA,EAAY,KAAK,UAAU,CAAA,iBAAA,EAAA,CAAqB,KAAK,WAAA,GAAc,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,QAClF,CAAA,gBAAA,EAAmB,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,WAAW,CAAC,CAAA,QAAA,EAAW,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA;AAAA,QACxG;AAAA,OACF;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,wXAAA;AAAA,MACA,CAAA,cAAA,EAAiB,SAAA,CAAU,iBAAA,CAAkB,WAAA,CAAY,WAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,EAAM,KAAK,WAAA,CAAY,SAAA,CAAU,iBAAA,CAAkB,WAAA,CAAY,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MAClJ,cAAc,SAAA,CAAU,iBAAA,CAAkB,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,MAC7D,CAAA,kBAAA,EAAqB,SAAA,CAAU,iBAAA,CAAkB,cAAA,CAAe,aAAa,CAAA,CAAA;AAAA,MAC7E,CAAA,wBAAA,EAA2B,SAAA,CAAU,iBAAA,CAAkB,iBAAA,CAAkB,eAAe,CAAA,CAAA;AAAA,MACxF;AAAA,KACF;AAGA,IAAA,IAAI,SAAA,CAAU,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AACxC,MAAA,KAAA,CAAM,KAAK,2UAAiF,CAAA;AAC5F,MAAA,KAAA,MAAW,GAAA,IAAO,UAAU,eAAA,EAAiB;AAC3C,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ,IAAI,GAAA,CAAI,QAAA,CAAS,aAAa,CAAA,EAAA,EAAK,IAAI,KAAK,CAAA,CAAA;AAAA,UAC5C,CAAA,EAAA,EAAK,IAAI,WAAW,CAAA,CAAA;AAAA,UACpB,CAAA,UAAA,EAAa,IAAI,MAAM,CAAA,CAAA;AAAA,UACvB;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,OAAA,EAA8C;AAChE,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,gBAAA,CAAiB,kBAAA,CAAmB,QAAQ,SAAS,CAAA;AAElF,IAAA,IAAI,UAAA;AAEJ,IAAA,QAAQ,QAAQ,MAAA;AAAQ,MACtB,KAAK,MAAA;AACH,QAAA,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,eAAA,EAAiB,IAAA,EAAM,CAAC,CAAA;AACpD,QAAA;AAAA,MAEF,KAAK,KAAA;AACH,QAAA,UAAA,GAAa,IAAA,CAAK,aAAa,eAAe,CAAA;AAC9C,QAAA;AAAA,MAEF,KAAK,MAAA;AAEH,QAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,MAEnD;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA;AAIlE,IAAA,MAAMf,eAAAA,CAAW,MAAWqB,gBAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAG5E,IAAA,MAAMrB,eAAAA,CAAW,SAAA,CAAU,OAAA,CAAQ,UAAA,EAAY,YAAY,OAAO,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,aAAa,MAAA,EAAiC;AACpD,IAAA,MAAM,QAAQ,EAAC;AAGf,IAAA,KAAA,CAAM,KAAK,2EAA2E,CAAA;AACtF,IAAA,KAAA,MAAW,CAAC,MAAM,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,cAAc,CAAA,EAAG;AACjE,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,GAAG,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,UAAU,IAAI,KAAA,CAAM,WAAW,CAAA,CAAA,EAAI,KAAA,CAAM,WAAW,CAAA,CAAA,EAAI,KAAA,CAAM,WAAW,CAAA,CAAA,EAAI,MAAM,WAAW,CAAA;AAAA,OACjH;AAAA,IACF;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,eAAe,YAAA,EAA8B;AACnD,IAAA,IAAI,eAAe,GAAA,EAAM;AACvB,MAAA,OAAO,CAAA,EAAG,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAA;AAAA,IACnC,CAAA,MAAA,IAAW,eAAe,GAAA,EAAO;AAC/B,MAAA,OAAO,CAAA,EAAA,CAAI,YAAA,GAAe,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,IAC5C,CAAA,MAAA,IAAW,eAAe,IAAA,EAAS;AACjC,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,GAAK,CAAA;AAC/C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,MAAS,GAAI,CAAA;AACxD,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,IAAO,CAAA;AAC/C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,OAAW,GAAK,CAAA;AAC3D,MAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAY,KAAA,EAAuB;AACzC,IAAA,MAAM,QAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAC1C,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,OAAO,IAAA,IAAQ,IAAA,IAAQ,SAAA,GAAY,KAAA,CAAM,SAAS,CAAA,EAAG;AACnD,MAAA,IAAA,IAAQ,IAAA;AACR,MAAA,SAAA,EAAA;AAAA,IACF;AAEA,IAAA,OAAO,CAAA,EAAG,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAAA,EAC/C;AACF;AA2BO,SAAS,sBAAA,GAA2C;AACzD,EAAA,OAAO,IAAI,gBAAA,EAAiB;AAC9B;AASO,SAAS,sBAAsB,gBAAA,EAAqD;AACzF,EAAA,OAAO,IAAI,gBAAgB,gBAAgB,CAAA;AAC7C;;;AX5zCA,gBAAA,EAAA;;;AYbA,YAAA,EAAA;;;ACAA,YAAA,EAAA;AAgxBO,IAAM,gBAAA,GAAiD;AAAA,EAC5D,aAAA,EAAe,QAAA;AAAA,EACf,aAAA,EAAe,QAAA;AAAA,EACf,YAAA,EAAc,QAAA;AAAA,EACd,cAAA,EAAgB;AAClB,CAAA;;;ADxvBO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EACzC,WAAA,CACE,OAAA,EACO,KAAA,EACA,KAAA,EACA,WAAA,EACP;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAJN,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,KAAA,GAAA,KAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA,EACd;AACF;AASO,IAAM,iBAAiBF,KAAAA,CAAE,MAAA,EAAO,CACpC,SAAA,CAAU,CAAC,KAAA,KAAU;AAEpB,EAAA,IAAI,CAAC,UAAU,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3D,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,UAAA,GAAa,iBAAiB,KAAK,CAAA;AACzC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAIA,KAAAA,CAAE,QAAA,CAAS,CAAC;AAAA,IACpB,IAAA,EAAMA,MAAE,YAAA,CAAa,kBAAA;AAAA,IACrB,OAAA,EAAS,CAAC,QAAA,EAAU,QAAA,EAAU,SAAS,QAAQ,CAAA;AAAA,IAC/C,QAAA,EAAU,KAAA;AAAA,IACV,MAAM,EAAC;AAAA,IACP,OAAA,EAAS,qBAAqB,KAAK,CAAA,8CAAA;AAAA,GACpC,CAAC,CAAA;AACJ,CAAC,CAAA,CACA,MAAA,CAAO,CAAC,KAAA,KACP,CAAC,QAAA,EAAU,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,EAAG;AAAA,EACzD,OAAA,EAAS;AACX,CAAC;AAKI,IAAMwB,eAAAA,GAAiBxB,MAAE,IAAA,CAAK,CAAC,SAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA,EAAG;AAAA,EAChF,QAAA,EAAU,CAAC,MAAA,EAAQ,GAAA,MAAS;AAAA,IAC1B,OAAA,EAAS,CAAA,mBAAA,EAAsB,GAAA,CAAI,IAAI,CAAA,gDAAA;AAAA,GACzC;AACF,CAAC;AAKM,IAAM,mBAAA,GAAsBA,MAAE,IAAA,CAAK,CAAC,WAAW,WAAA,EAAa,QAAA,EAAU,WAAW,CAAA,EAAG;AAAA,EACzF,QAAA,EAAU,CAAC,MAAA,EAAQ,GAAA,MAAS;AAAA,IAC1B,OAAA,EAAS,CAAA,wBAAA,EAA2B,GAAA,CAAI,IAAI,CAAA,sDAAA;AAAA,GAC9C;AACF,CAAC;AAKM,IAAM,mBAAmBA,KAAAA,CAAE,MAAA,EAAO,CACtC,GAAA,CAAI,+BAA+B,CAAA,CACnC,MAAA;AAAA,EACC,CAAC,KAAA,KAAU,KAAA,KAAU,EAAA,IAAM,KAAA,GAAQ,CAAA;AAAA,EACnC;AACF,CAAA,CACC,UAAU,CAAC,KAAA,KAAU,KAAA,KAAU,EAAA,GAAK,WAAW,KAAK;AAKhD,IAAM,iBAAiBA,KAAAA,CAAE,MAAA,EAAO,CACpC,GAAA,CAAI,GAAG,2BAA2B,CAAA,CAClC,SAAA,CAAU,CAAC,UAAeyB,gBAAA,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,CACxC,MAAA,CAAO,OAAO,QAAA,KAAa;AAC1B,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAMvB,eAAAA,CAAW,IAAA,CAAK,QAAQ,CAAA;AAC5C,IAAA,OAAO,MAAM,MAAA,EAAO;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA,EAAG,0CAA0C;AAKxC,IAAM,sBAAsBF,KAAAA,CAAE,MAAA,EAAO,CACzC,GAAA,CAAI,GAAG,gCAAgC,CAAA,CACvC,SAAA,CAAU,CAAC,UAAeyB,gBAAA,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,CACxC,MAAA,CAAO,OAAO,OAAA,KAAY;AACzB,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAMvB,eAAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AAC3C,IAAA,OAAO,MAAM,WAAA,EAAY;AAAA,EAC3B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA,EAAG,+CAA+C;AAK7C,IAAM,YAAA,GAAeF,KAAAA,CAAE,MAAA,EAAO,CAClC,GAAA,CAAI,GAAG,yBAAyB,CAAA,CAChC,MAAA,CAAO,CAAC,GAAA,KAAQ;AAEf,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,sBAAA;AAAA,IACA,kBAAA;AAAA,IACA,2BAAA;AAAA,IACA,kCAAA;AAAA,IACA,kCAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,SAAS,IAAA,CAAK,CAAA,OAAA,KAAW,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA;AACnD,CAAA,EAAG,wBAAwB;AAKtB,IAAM,eAAA,GAAkBA,KAAAA,CAAE,MAAA,EAAO,CACrC,KAAA;AAAA,EACC,qBAAA;AAAA,EACA;AACF;AAKK,IAAM,WAAA,GAAcA,KAAAA,CAAE,MAAA,EAAO,CACjC,GAAA,CAAI,GAAG,4BAA4B,CAAA,CACnC,MAAA,CAAO,CAAC,KAAA,KAAU;AAEjB,EAAA,OAAO,mBAAA,CAAoB,KAAK,KAAK,CAAA;AACvC,CAAA,EAAG,wCAAwC;AAKtC,IAAM,gBAAA,GAAmBA,MAAE,MAAA,CAAO;AAAA,EACvC,QAAA,EAAU,eAAe,QAAA,EAAS;AAAA,EAClC,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,GAAA,EAAKA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACzB,aAAA,EAAe,iBAAiB,QAAA,EAAS;AAAA,EACzC,KAAA,EAAO,YAAY,QAAA,EAAS;AAAA,EAC5B,WAAA,EAAaA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAClC,OAAA,EAASA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC9B,KAAA,EAAOA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EAC5B,QAAA,EAAUwB,gBAAe,QAAA,EAAS;AAAA,EAClC,OAAA,EAASxB,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,MAAA,EAAQA,KAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC5B,OAAA,EAASA,KAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AACvB,CAAC,EAAE,MAAA;AAKI,IAAM,sBAAA,GAAyB;AAmB/B,SAAS,iBAAiB,QAAA,EAAgC;AAC/D,EAAA,IAAI;AACF,IAAA,OAAO,cAAA,CAAe,MAAM,QAAQ,CAAA;AAAA,EACtC,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBA,MAAE,QAAA,EAAU;AAC/B,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,gDAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,OAAA,IAAW,kBAAA;AAAA,QAC5B,UAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAUO,SAAS,aAAA,CAAc,OAAe,QAAA,EAAiC;AAC5E,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,CAAM,KAAK,CAAA;AAGzC,IAAA,IAAI,aAAa,QAAA,IAAY,CAAC,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAC,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAC,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,EAAG;AAC/G,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAK,CAAA,sCAAA,CAAwC,CAAA;AAAA,IAC/E;AAEA,IAAA,OAAO,SAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBA,MAAE,QAAA,EAAU;AAC/B,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,yFAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,OAAA,IAAW,oBAAA;AAAA,QAC5B,OAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AASO,SAAS,mBAAmB,UAAA,EAA4B;AAC7D,EAAA,IAAI;AACF,IAAA,OAAO,gBAAA,CAAiB,MAAM,UAAU,CAAA;AAAA,EAC1C,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBA,MAAE,QAAA,EAAU;AAC/B,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,wCAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,OAAA,IAAW,yBAAA;AAAA,QAC5B,YAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AASO,SAAS,iBAAiB,QAAA,EAA4B;AAC3D,EAAA,IAAI;AACF,IAAA,OAAOwB,eAAAA,CAAe,MAAM,QAAQ,CAAA;AAAA,EACtC,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBxB,MAAE,QAAA,EAAU;AAC/B,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,mDAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,OAAA,IAAW,mBAAA;AAAA,QAC5B,UAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAUA,eAAsB,aAAA,CACpB,QAAA,EACA,IAAA,GAA6B,MAAA,EACZ;AACjB,EAAA,IAAI;AACF,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,OAAO,MAAM,cAAA,CAAe,UAAA,CAAW,QAAQ,CAAA;AAAA,IACjD,CAAA,MAAO;AACL,MAAA,OAAO,MAAM,mBAAA,CAAoB,UAAA,CAAW,QAAQ,CAAA;AAAA,IACtD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBA,MAAE,QAAA,EAAU;AAC/B,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,8CAAA;AAAA,QACA,uCAAA;AAAA,QACA,+BAA+B,IAAI,CAAA;AAAA,OACrC;AACA,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,MAAM,MAAA,CAAO,CAAC,CAAA,EAAG,OAAA,IAAW,WAAW,IAAI,CAAA,KAAA,CAAA;AAAA,QAC3C,MAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAYO,SAAS,gBAAgB,KAAA,EAAuC;AACrE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IACjB,CAAC,QAAA,EAAU,UAAU,OAAA,EAAS,QAAQ,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AAC/D;AAQO,SAAS,qBAAqB,KAAA,EAAwC;AAC3E,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IACjB,CAAC,SAAA,EAAW,aAAa,QAAA,EAAU,WAAW,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AACvE;AAQO,SAAS,gBAAgB,KAAA,EAAmC;AACjE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IACjB,CAAC,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AACnE;AASA,eAAsB,WAAA,CACpB,QAAA,EACA,IAAA,GAA6B,MAAA,EACX;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAoByB,yBAAQ,QAAQ,CAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,MAAMvB,eAAAA,CAAW,IAAA,CAAK,YAAY,CAAA;AAChD,IAAA,OAAO,SAAS,MAAA,GAAS,KAAA,CAAM,MAAA,EAAO,GAAI,MAAM,WAAA,EAAY;AAAA,EAC9D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAYO,SAAS,mBAAmB,IAAA,EAAsB;AACvD,EAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,IAAI,eAAA,CAAgB,8BAAA,EAAgC,QAAA,EAAU,IAAI,CAAA;AAAA,EAC1E;AAGA,EAAA,OAAO,IAAA,CACJ,QAAQ,mCAAA,EAAqC,EAAE,EAC/C,OAAA,CAAQ,OAAA,EAAS,IAAI,CAAA,CACrB,IAAA,EAAK;AACV;AAQO,SAAS,iBAAiB,QAAA,EAA0B;AACzD,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,MAAM,IAAI,eAAA,CAAgB,4BAAA,EAA8B,UAAA,EAAY,QAAQ,CAAA;AAAA,EAC9E;AAGA,EAAA,MAAM,OAAA,GAAU,QAAA,CACb,OAAA,CAAQ,kBAAA,EAAoB,EAAE,EAC9B,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA,CACxB,IAAA,EAAK;AAER,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,eAAA,CAAgB,8CAAA,EAAgD,UAAA,EAAY,QAAQ,CAAA;AAAA,EAChG;AAEA,EAAA,OAAYuB,yBAAQ,OAAO,CAAA;AAC7B;AAQO,SAAS,eAAe,GAAA,EAAqB;AAClD,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,IAAI,eAAA,CAAgB,0BAAA,EAA4B,QAAA,EAAU,GAAG,CAAA;AAAA,EACrE;AAEA,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,EAAK;AAEzB,EAAA,IAAI;AACF,IAAA,YAAA,CAAa,MAAM,OAAO,CAAA;AAC1B,IAAA,OAAO,OAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBzB,MAAE,QAAA,EAAU;AAC/B,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,oDAAA;AAAA,QACA,8CAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,wBAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAQO,SAAS,kBAAkB,SAAA,EAA2B;AAC3D,EAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,IAAA,MAAM,IAAI,eAAA,CAAgB,6BAAA,EAA+B,WAAA,EAAa,SAAS,CAAA;AAAA,EACjF;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,eAAA,CAAgB,KAAA,CAAM,SAAA,CAAU,IAAA,EAAM,CAAA;AAAA,EAC/C,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBA,MAAE,QAAA,EAAU;AAC/B,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,gDAAA;AAAA,QACA,qDAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,OAAA,IAAW,2BAAA;AAAA,QAC5B,WAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAYO,SAAS,sBAAsB,KAAA,EAAgC;AACpE,EAAA,IAAI,UAAU,KAAA,CAAM,OAAA;AAEpB,EAAA,IAAI,KAAA,CAAM,KAAA,IAAS,KAAA,CAAM,KAAA,KAAU,MAAA,EAAW;AAC5C,IAAA,OAAA,IAAW;AAAA,OAAA,EAAY,MAAM,KAAK,CAAA,CAAA;AAClC,IAAA,OAAA,IAAW;AAAA,OAAA,EAAY,IAAA,CAAK,SAAA,CAAU,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAAA,EACpD;AAEA,EAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,WAAA,CAAY,SAAS,CAAA,EAAG;AACrD,IAAA,OAAA,IAAW,kBAAA;AACX,IAAA,KAAA,CAAM,WAAA,CAAY,OAAA,CAAQ,CAAC,UAAA,EAAY,KAAA,KAAU;AAC/C,MAAA,OAAA,IAAW;AAAA,EAAA,EAAO,KAAA,GAAQ,CAAC,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA;AAAA,IAC5C,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,OAAA;AACT;AAWO,SAAS,oBAAA,CACd,SAAA,EACA,KAAA,EACA,YAAA,EACA,SAAkB,KAAA,EACf;AACH,EAAA,IAAI;AACF,IAAA,OAAO,UAAU,KAAK,CAAA;AAAA,EACxB,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,CAAC,MAAA,IAAU,KAAA,YAAiB,eAAA,EAAiB;AAC/C,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oBAAA,EAAuB,KAAA,CAAM,OAAO,CAAA,sBAAA,CAAwB,CAAA;AAAA,IAC3E;AACA,IAAA,OAAO,YAAA;AAAA,EACT;AACF;AA2CO,SAAS,wBACd,OAAA,EACyB;AACzB,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAChD,IAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,YAAY,CAAA,IAAK,UAAU,MAAA,EAAW;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,QAAQ,GAAA;AAAK,QACX,KAAK,4BAAA;AACH,UAAA,MAAA,CAAO,eAAA,GAAkB,iBAAiB,KAAK,CAAA;AAC/C,UAAA;AAAA,QACF,KAAK,qBAAA;AACH,UAAA,MAAA,CAAO,QAAA,GAAW,iBAAiB,KAAK,CAAA;AACxC,UAAA;AAAA,QACF,KAAK,kCAAA;AACH,UAAA,MAAA,CAAO,oBAAA,GAAuB,kBAAA,CAAmB,QAAA,CAAS,KAAA,EAAO,EAAE,CAAC,CAAA;AACpE,UAAA;AAAA,QACF,KAAK,mBAAA;AACH,UAAA,MAAA,CAAO,OAAA,GAAU,KAAA,CAAM,WAAA,EAAY,KAAM,MAAA;AACzC,UAAA;AAAA,QACF,KAAK,iBAAA;AACH,UAAA,MAAA,CAAO,KAAA,GAAQ,KAAA,CAAM,WAAA,EAAY,KAAM,MAAA;AACvC,UAAA;AAAA,QACF,KAAK,uBAAA;AACH,UAAA,MAAA,CAAO,WAAA,GAAc,KAAA,CAAM,WAAA,EAAY,KAAM,MAAA;AAC7C,UAAA;AAAA,QACF,KAAK,yBAAA;AACH,UAAA,MAAA,CAAO,YAAA,GAAe,KAAA,CAAM,WAAA,EAAY,KAAM,MAAA;AAC9C,UAAA;AAAA;AAEJ,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAA,MAAA,CAAO,KAAK,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,MACxC;AAAA,IACF;AAAA,EACF,CAAC,CAAA;AAED,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,CAAA;AAAA,EAA4C,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MAC7D,aAAA;AAAA,MACA,OAAA;AAAA,MACA,CAAC,qCAAqC,yCAAyC;AAAA,KACjF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,uBAAuB,OAAA,EAA2D;AAChG,EAAA,IAAI;AACF,IAAA,OAAO,gBAAA,CAAiB,MAAM,OAAO,CAAA;AAAA,EACvC,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,KAAA,YAAiBA,MAAE,QAAA,EAAU;AAC/B,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAA,GAAA,KAAO;AACrC,QAAA,MAAMC,MAAAA,GAAO,IAAI,IAAA,CAAK,MAAA,GAAS,IAAI,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,QAAA;AACxD,QAAA,OAAO,CAAA,EAAA,EAAKA,MAAI,CAAA,EAAA,EAAK,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,MAClC,CAAC,CAAA;AAED,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,kCAAA;AAAA,QACA,iCAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,CAAA;AAAA,EAAkC,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QACnD,SAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAYO,SAAS,UAAa,KAAA,EAAyC;AACpE,EAAA,OAAO,KAAA,KAAU,UAAa,KAAA,KAAU,IAAA;AAC1C;AASO,SAAS,aAAa,UAAA,EAA6B;AACxD,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,EAC9B,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,qBAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,CAAC,yBAAA,EAA2B,8BAAA,EAAgC,sBAAsB;AAAA,KACpF;AAAA,EACF;AACF;AASO,SAAS,mBAAA,CAAuB,KAAA,EAAY,KAAA,GAAgB,OAAA,EAAc;AAC/E,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAI;AACrB,EAAA,MAAM,aAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AAClB,MAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,6BAA6B,KAAK,CAAA,CAAA;AAAA,MAClC,KAAA;AAAA,MACA,UAAA;AAAA,MACA,CAAC,4BAA4B,8BAA8B;AAAA,KAC7D;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAWO,SAAS,mBAAA,CACd,KAAA,EACA,GAAA,EACA,GAAA,EACA,QAAgB,OAAA,EACR;AACR,EAAA,IAAI,KAAA,GAAQ,GAAA,IAAO,KAAA,GAAQ,GAAA,EAAK;AAC9B,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,CAAA,EAAG,KAAK,CAAA,iBAAA,EAAoB,GAAG,QAAQ,GAAG,CAAA,CAAA;AAAA,MAC1C,KAAA;AAAA,MACA,KAAA;AAAA,MACA,CAAC,uBAAuB,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,EAAI,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAE;AAAA,KACrE;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAWO,SAAS,oBAAA,CACd,KAAA,EACA,SAAA,EACA,SAAA,EACA,QAAgB,OAAA,EACR;AACR,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,SAAA,IAAa,KAAA,CAAM,SAAS,SAAA,EAAW;AACxD,IAAA,MAAM,IAAI,eAAA;AAAA,MACR,CAAA,EAAG,KAAK,CAAA,iBAAA,EAAoB,SAAS,QAAQ,SAAS,CAAA,WAAA,CAAA;AAAA,MACtD,KAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,QACE,CAAA,gBAAA,EAAmB,MAAM,MAAM,CAAA,CAAA;AAAA,QAC/B,CAAA,iBAAA,EAAoB,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,WAAA;AAAA;AAC5C,KACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;;;AE3zBA,YAAA,EAAA;;;ACAA,YAAA,EAAA;AAWA,UAAA,EAAA;AAMA,UAAA,EAAA;;;ACjBA,YAAA,EAAA;AAWA,UAAA,EAAA;AACA,WAAA,EAAA;AAKO,IAAM,UAAkC,CAAC;AAAA,EAC9C,KAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP,MAAA,EAAQ,YAAA;AAAA,EACR,QAAA,GAAW,GAAA;AAAA,EACX,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAI3C,qBAAA,EAAc;AAC5C,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIM,gBAAS,CAAC,CAAA;AAG5D,EAAA,MAAM,MAAA,GAAS,YAAA,IAAgBZ,sBAAA,CAAe,IAAI,KAAKA,sBAAA,CAAe,IAAA;AAGtE,EAAAc,iBAAU,MAAM;AACd,IAAA,IAAI,YAAY,UAAA,EAAY;AAE5B,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,oBAAA,CAAqB,CAAC,SAAA,KAAA,CAAe,SAAA,GAAY,CAAA,IAAK,OAAO,MAAM,CAAA;AAAA,IACrE,GAAG,QAAQ,CAAA;AAEX,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,GAAG,CAAC,MAAA,CAAO,QAAQ,QAAA,EAAU,QAAA,EAAU,UAAU,CAAC,CAAA;AAGlD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBACEH,cAAAA,CAACF,OAAAA,EAAA,EACC,QAAA,kBAAAD,gBAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,QAAA,EAAA;AAAA,MAAA,SAAA;AAAA,MAAQ,KAAA,GAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,GAAK;AAAA,KAAA,EAAM,CAAA,EACjE,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBACEC,cAAAA,CAACF,OAAAA,EAAA,EAAI,eAAa,MAAA,EACf,QAAA,EAAA,KAAA,oBACCE,cAAAA,CAACD,UAAA,EAAK,KAAA,EAAO,KAAA,CAAM,KAAA,EAAQ,iBAAM,CAAA,EAErC,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,YAAA,GAAe,OAAO,iBAAiB,CAAA;AAE7C,EAAA,uBACEF,eAAAA,CAACC,OAAAA,EAAA,EAAI,eAAa,MAAA,EAChB,QAAA,EAAA;AAAA,oBAAAE,eAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAU,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,IACzC,yBACCF,eAAAA,CAACE,UAAA,EAAK,KAAA,EAAO,MAAM,IAAA,EAAM,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE;AAAA,KAAA,EAAM;AAAA,GAAA,EAErC,CAAA;AAEJ;AAKO,IAAM,iBAKR,CAAC;AAAA,EACJ,KAAA,GAAQ,SAAA;AAAA,EACR,IAAA,GAAO,MAAA;AAAA,EACP,QAAA,GAAW,IAAA;AAAA,EACX;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAIJ,qBAAA,EAAc;AAC5C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIM,gBAAS,CAAC,CAAA;AAE1C,EAAAE,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAY,UAAA,EAAY;AAE7B,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,WAAA,CAAY,CAAC,KAAA,KAAW,KAAA,GAAQ,CAAA,GAAK,CAAC,CAAA;AAAA,IACxC,GAAG,GAAG,CAAA;AAEN,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,QAAA,EAAU,UAAU,CAAC,CAAA;AAEzB,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBAAON,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAQ,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MAAM;AAAA,KAAA,EAAG,CAAA;AAAA,EAC7C;AAEA,EAAA,uBACEF,eAAAA,CAACC,OAAAA,EAAA,EAAI,eAAa,MAAA,EAChB,QAAA,EAAA;AAAA,oBAAAE,cAAAA,CAAC,WAAQ,IAAA,EAAY,CAAA;AAAA,oBACrBH,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,IAAA,EAAM,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE;AAAA,KAAA,EAAM,CAAA;AAAA,IAChC,QAAA,oBACCC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,OAAA,EAAU,QAAA,EAAA,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAA,EAAE;AAAA,GAAA,EAEtD,CAAA;AAEJ;AAKO,IAAM,kBAMR,CAAC;AAAA,EACJ,KAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA,GAAO,MAAA;AAAA,EACP,cAAA,GAAiB,IAAA;AAAA,EACjB;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAIJ,qBAAA,EAAc;AAE5C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAMoE,gBAAAA,GAAkB,KAAA,CAAM,WAAW,CAAA,IAAK,eAAA;AAC9C,IAAA,MAAM,QAAA,GAAW,iBAAiB,CAAA,CAAA,EAAI,WAAA,GAAc,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAA,CAAA,GAAM,EAAA;AAC3E,IAAA,uBACElE,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAChB,QAAA,EAAA;AAAA,MAAAgE,gBAAAA;AAAA,MAAgB,GAAA;AAAA,MAAE;AAAA,KAAA,EACrB,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,WAAW,CAAA,IAAK,eAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,eAAe,KAAA,CAAM,MAAA;AAExC,EAAA,uBACElE,eAAAA,CAACC,OAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,eAAa,MAAA,EACvC,QAAA,EAAA;AAAA,oBAAAD,eAAAA,CAACC,SAAA,EACE,QAAA,EAAA;AAAA,MAAA,CAAC,UAAA,oBAAcE,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,CAAA;AAAA,MACpC,UAAA,oBAAcA,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBAC5CF,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,IAAA,EAAM,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE;AAAA,OAAA,EAAgB,CAAA;AAAA,MAC1C,kCACCF,eAAAA,CAACE,UAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,QAAA,IAAA;AAAA,QAAG,IAAA,CAAK,GAAA,CAAI,WAAA,GAAc,CAAA,EAAG,MAAM,MAAM,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,KAAA,CAAM,MAAA;AAAA,QAAO;AAAA,OAAA,EAAC;AAAA,KAAA,EAEzF,CAAA;AAAA,IAGC,WAAA,GAAc,qBACbC,cAAAA,CAACF,SAAA,EAAI,aAAA,EAAc,QAAA,EAAS,SAAA,EAAW,CAAA,EACpC,QAAA,EAAA,KAAA,CAAM,MAAM,CAAA,EAAG,WAAW,EAAE,GAAA,CAAI,CAAC,MAAM,KAAA,qBACtCD,eAAAA,CAACC,OAAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAE,eAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAS,QAAA,EAAA,QAAA,EAAC,CAAA;AAAA,sBAC7BF,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE;AAAA,OAAA,EAAK;AAAA,KAAA,EAAA,EAFzB,KAGV,CACD,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAKO,IAAM,eAMR,CAAC;AAAA,EACJ,KAAA,GAAQ,YAAA;AAAA,EACR,IAAA,GAAO,MAAA;AAAA,EACP,SAAA,uBAAgB,IAAA,EAAK;AAAA,EACrB,WAAA,GAAc,IAAA;AAAA,EACd;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAIJ,qBAAA,EAAc;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIM,gBAAS,CAAC,CAAA;AAExC,EAAAE,iBAAU,MAAM;AACd,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,UAAA,CAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,CAAU,SAAS,CAAA;AAAA,IAC7C,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,CAAA,EAAG,CAAC,SAAA,EAAW,WAAW,CAAC,CAAA;AAE3B,EAAA,MAAM,aAAA,GAAgB,CAAC,EAAA,KAAuB;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AAEvC,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,OAAA,GAAU,EAAE,CAAA,CAAA,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,GAAG,OAAO,CAAA,CAAA,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,cAAc,WAAA,GAAc,CAAA,EAAA,EAAK,aAAA,CAAc,OAAO,CAAC,CAAA,CAAA,CAAA,GAAM,EAAA;AACnE,IAAA,uBACEN,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAChB,QAAA,EAAA;AAAA,MAAA,KAAA;AAAA,MAAM,KAAA;AAAA,MAAI;AAAA,KAAA,EACb,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEF,eAAAA,CAACC,OAAAA,EAAA,EAAI,eAAa,MAAA,EAChB,QAAA,EAAA;AAAA,oBAAAE,cAAAA,CAAC,WAAQ,IAAA,EAAY,CAAA;AAAA,oBACrBH,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,IAAA,EAAM,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE;AAAA,KAAA,EAAM,CAAA;AAAA,IAChC,+BACCF,eAAAA,CAACE,UAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,MAAA,IAAA;AAAA,MAAG,cAAc,OAAO,CAAA;AAAA,MAAE;AAAA,KAAA,EAAC;AAAA,GAAA,EAEzD,CAAA;AAEJ;AAKO,IAAM,gBAMR,CAAC;AAAA,EACJ,MAAA;AAAA,EACA,QAAA,GAAW,GAAA;AAAA,EACX,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAIJ,qBAAA,EAAc;AAC5C,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIM,gBAAS,CAAC,CAAA;AAE5D,EAAAE,iBAAU,MAAM;AACd,IAAA,IAAI,UAAA,IAAc,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAEvC,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,oBAAA,CAAqB,CAAC,SAAA,KAAA,CAAe,SAAA,GAAY,CAAA,IAAK,OAAO,MAAM,CAAA;AAAA,IACrE,GAAG,QAAQ,CAAA;AAEX,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,GAAG,CAAC,MAAA,CAAO,MAAA,EAAQ,QAAA,EAAU,UAAU,CAAC,CAAA;AAExC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBACEH,eAACD,QAAAA,EAAA,EAAK,OAAO,KAAA,CAAM,KAAA,EAChB,mBAAS,YAAA,EACZ,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,uBACEC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,OAAO,QAAA,EAAA,wBAAA,EAE1B,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,YAAA,GAAe,OAAO,iBAAiB,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,SAAS,KAAA,CAAM,OAAA;AAElC,EAAA,uBACEF,eAAAA,CAACC,OAAAA,EAAA,EAAI,eAAa,MAAA,EAChB,QAAA,EAAA;AAAA,oBAAAE,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,YAAa,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,IACtC,yBACCF,eAAAA,CAACE,UAAA,EAAK,KAAA,EAAO,MAAM,IAAA,EAAM,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MAAE;AAAA,KAAA,EAAM;AAAA,GAAA,EAErC,CAAA;AAEJ;AASO,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAuB,UAAU,GAAA,EAAI;AAAA;AAAA,EAGrD,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAwB,UAAU,GAAA,EAAI;AAAA;AAAA,EAGpD,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA,EAAsB,UAAU,GAAA,EAAI;AAAA;AAAA,EAGlD,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAyB,UAAU,GAAA,EAAI;AAAA;AAAA,EAGvD,KAAA,EAAO,EAAE,IAAA,EAAM,OAAA,EAAwB,UAAU,GAAA,EAAI;AAAA;AAAA,EAGrD,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAuB,UAAU,GAAA,EAAI;AAAA;AAAA,EAGnD,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ,CAAC,WAAA,EAAM,WAAA,EAAM,WAAA,EAAM,WAAA,EAAM,WAAA,EAAM,WAAA,EAAM,WAAA,EAAM,WAAA,EAAM,WAAA,EAAM,WAAA,EAAM,aAAM,WAAI,CAAA;AAAA,IAC/E,QAAA,EAAU;AAAA,GACZ;AAAA;AAAA,EAGA,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ,CAAC,WAAA,EAAM,WAAA,EAAM,WAAI,CAAA;AAAA,IACzB,QAAA,EAAU;AAAA,GACZ;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,MAAA,EAAQ,CAAC,WAAA,EAAM,WAAA,EAAM,aAAM,WAAA,EAAM,WAAA,EAAM,WAAA,EAAM,WAAA,EAAM,WAAI,CAAA;AAAA,IACvD,QAAA,EAAU;AAAA;AAEd;;;AC7UA,YAAA,EAAA;AAWA,UAAA,EAAA;AACA,WAAA,EAAA;AAKO,IAAM,cAA0C,CAAC;AAAA,EACtD,KAAA;AAAA,EACA,GAAA,GAAM,GAAA;AAAA,EACN,KAAA;AAAA,EACA,cAAA,GAAiB,IAAA;AAAA,EACjB,KAAA,GAAQ,EAAA;AAAA,EACR,KAAA,GAAQT,sBAAA;AAAA,EACR,QAAA,GAAW,KAAA;AAAA,EACX;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAIK,qBAAA,EAAc;AAG5C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAK,QAAQ,GAAA,GAAO,GAAA,EAAK,CAAC,CAAA,EAAG,GAAG,CAAA;AACjE,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAO,UAAA,GAAa,MAAO,KAAK,CAAA;AAC5D,EAAA,MAAM,iBAAiB,KAAA,GAAQ,cAAA;AAG/B,EAAoB,MAAM,QAAA,CAAS,MAAA,CAAO,cAAc,CAAA,GAAI,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,cAAc;AAGlG,EAAA,MAAM,cAAA,GAAiB,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,UAAU,CAAC,CAAA,CAAA,CAAA;AAGhD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBACEE,eAAAA,CAACC,OAAAA,EAAA,EAAI,eAAc,QAAA,EAChB,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASE,cAAAA,CAACD,QAAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACvBF,eAAAA,CAACE,QAAAA,EAAA,EAAK,QAAA,EAAA;AAAA,QAAA,YAAA;AAAA,QACO,cAAA;AAAA,QAAe,IAAA;AAAA,QAAG,KAAA;AAAA,QAAM,GAAA;AAAA,QAAE,GAAA;AAAA,QAAI;AAAA,OAAA,EAC3C;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBACEF,eAAAA,CAACC,OAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,eAAa,MAAA,EACtC,QAAA,EAAA;AAAA,MAAA,KAAA,oBACCE,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,OAAQ,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAEnCF,eAAAA,CAACC,OAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAE,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,OAAQ,QAAA,EAAA,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,KAAK,CAAA,EAAE,CAAA;AAAA,QACzD,kCACCF,eAAAA,CAACE,UAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,UAAA,GAAA;AAAA,UAAE;AAAA,SAAA,EAAe;AAAA,OAAA,EAE/C;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEF,eAAAA,CAACC,OAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,eAAa,MAAA,EAEtC,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCE,cAAAA,CAACF,OAAAA,EAAA,EAAI,cAAc,CAAA,EACjB,QAAA,kBAAAE,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,IAAA,EAAO,iBAAM,CAAA,EAClC,CAAA;AAAA,oBAIFF,eAAAA,CAACC,OAAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,eAAAA,CAACE,UAAA,EACC,QAAA,EAAA;AAAA,wBAAAC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAU,QAAA,EAAA,KAAA,CAAM,QAAA,CAAS,MAAA,CAAO,cAAc,CAAA,EAAE,CAAA;AAAA,wBACnEC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,KAAA,EAAQ,QAAA,EAAA,KAAA,CAAM,UAAA,CAAW,MAAA,CAAO,cAAc,CAAA,EAAE;AAAA,OAAA,EACrE,CAAA;AAAA,MACC,kCACCF,eAAAA,CAACE,UAAA,EAAK,KAAA,EAAO,MAAM,IAAA,EAAM,QAAA,EAAA;AAAA,QAAA,GAAA;AAAA,QAAE;AAAA,OAAA,EAAe;AAAA,KAAA,EAE9C;AAAA,GAAA,EACF,CAAA;AAEJ;AAKO,IAAM,kBAMR,CAAC;AAAA,EACJ,KAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA,GAAa,IAAA;AAAA,EACb,eAAA,GAAkB,KAAA;AAAA,EAClB;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAIJ,qBAAA,EAAc;AAE5C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBACEE,eAAAA,CAACC,OAAAA,EAAA,EAAI,eAAc,QAAA,EACjB,QAAA,EAAA;AAAA,sBAAAD,eAAAA,CAACE,UAAA,EAAK,QAAA,EAAA;AAAA,QAAA,iBAAA;AAAA,QAAgB,WAAA,GAAc,CAAA;AAAA,QAAE,MAAA;AAAA,QAAK,KAAA,CAAM;AAAA,OAAA,EAAO,CAAA;AAAA,MACvD,cAAc,KAAA,CAAM,WAAW,qBAC9BF,eAAAA,CAACE,UAAA,EAAK,QAAA,EAAA;AAAA,QAAA,WAAA;AAAA,QAAU,MAAM,WAAW;AAAA,OAAA,EAAE;AAAA,KAAA,EAEvC,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEF,eAAAA,CAACC,OAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,eAAa,MAAA,EAEvC,QAAA,EAAA;AAAA,oBAAAE,eAACF,OAAAA,EAAA,EACE,gBAAM,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AAC1B,MAAA,MAAM,cAAc,KAAA,GAAQ,WAAA;AAC5B,MAAA,MAAM,YAAY,KAAA,KAAU,WAAA;AAG5B,MAAA,IAAI,QAAA,GAAW,EAAA;AACf,MAAA,IAAI,YAAY,KAAA,CAAM,KAAA;AAEtB,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,QAAA,GAAW,QAAA;AACX,QAAA,SAAA,GAAY,KAAA,CAAM,OAAA;AAAA,MACpB,WAAW,SAAA,EAAW;AACpB,QAAA,QAAA,GAAW,QAAA;AACX,QAAA,SAAA,GAAY,KAAA,CAAM,OAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,QAAA;AACX,QAAA,SAAA,GAAY,KAAA,CAAM,KAAA;AAAA,MACpB;AAEA,MAAA,uBACED,eAAAA,CAACC,OAAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAE,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,WAAY,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,QACjC,KAAA,GAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,oBACtBC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,KAAA,EAAO,QAAA,EAAA,QAAA,EAAC;AAAA,OAAA,EAAA,EAHrB,KAKV,CAAA;AAAA,IAEJ,CAAC,CAAA,EACH,CAAA;AAAA,IAGC,UAAA,oBACCC,cAAAA,CAACF,OAAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EACd,QAAA,kBAAAD,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,IAAA,EAChB,QAAA,EAAA;AAAA,MAAA,eAAA,IAAmB,CAAA,EAAG,cAAc,CAAC,CAAA,EAAA,CAAA;AAAA,MACrC,KAAA,CAAM,WAAW,CAAA,IAAK;AAAA,KAAA,EACzB,CAAA,EACF,CAAA;AAAA,oBAIFC,cAAAA,CAACF,OAAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EACd,QAAA,kBAAAD,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,KAAA,EAChB,QAAA,EAAA;AAAA,MAAA,WAAA;AAAA,MAAY,MAAA;AAAA,MAAK,KAAA,CAAM,MAAA;AAAA,MAAO;AAAA,KAAA,EACjC,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAKO,IAAM,2BAKR,CAAC;AAAA,EACJ,KAAA;AAAA,EACA,KAAA,GAAQ,EAAA;AAAA,EACR,KAAA,GAAQ,GAAA;AAAA,EACR;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAIJ,qBAAA,EAAc;AAC5C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIC,uBAAAA,CAAM,SAAS,CAAC,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,uBAAAA,CAAM,SAAS,CAAC,CAAA;AAElD,EAAAA,uBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,IAAI,UAAA,EAAY;AAEhB,IAAA,MAAM,KAAA,GAAQ,YAAY,MAAM;AAC9B,MAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,QAAA,MAAM,OAAO,IAAA,GAAO,SAAA;AACpB,QAAA,IAAI,IAAA,IAAQ,QAAQ,CAAA,EAAG;AACrB,UAAA,YAAA,CAAa,EAAE,CAAA;AACf,UAAA,OAAO,KAAA,GAAQ,CAAA;AAAA,QACjB;AACA,QAAA,IAAI,QAAQ,CAAA,EAAG;AACb,UAAA,YAAA,CAAa,CAAC,CAAA;AACd,UAAA,OAAO,CAAA;AAAA,QACT;AACA,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH,GAAG,KAAK,CAAA;AAER,IAAA,OAAO,MAAM,cAAc,KAAK,CAAA;AAAA,EAClC,GAAG,CAAC,SAAA,EAAW,KAAA,EAAO,KAAA,EAAO,UAAU,CAAC,CAAA;AAExC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBACEC,eAAAA,CAACC,OAAAA,EAAA,EAAI,eAAc,QAAA,EAChB,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASE,cAAAA,CAACD,QAAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACvBC,cAAAA,CAACD,QAAAA,EAAA,EAAK,QAAA,EAAA,eAAA,EAAa;AAAA,KAAA,EACrB,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,MAAA,GAAST,sBAAA,CAAe,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAA;AACxD,EAAA,MAAM,SAAA,GAAYA,sBAAA,CAAe,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA;AAClD,EAAA,MAAM,QAAQA,sBAAA,CAAe,UAAA,CAAW,MAAA,CAAO,KAAA,GAAQ,WAAW,CAAC,CAAA;AAEnE,EAAA,uBACEO,eAAAA,CAACC,OAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,eAAa,MAAA,EACtC,QAAA,EAAA;AAAA,IAAA,KAAA,oBACCE,cAAAA,CAACF,OAAAA,EAAA,EAAI,cAAc,CAAA,EACjB,QAAA,kBAAAE,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,IAAA,EAAO,iBAAM,CAAA,EAClC,CAAA;AAAA,oBAEFF,eAAAA,CAACC,OAAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAE,eAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,OAAQ,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,sBAClCC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAU,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,sBACvCC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,OAAQ,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EACnC;AAAA,GAAA,EACF,CAAA;AAEJ;AAKO,IAAM,mBAMR,CAAC;AAAA,EACJ,KAAA;AAAA,EACA,GAAA,GAAM,GAAA;AAAA,EACN,KAAA;AAAA,EACA,IAAA,GAAO,QAAA;AAAA,EACP;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAIJ,qBAAA,EAAc;AAC5C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAK,QAAQ,GAAA,GAAO,GAAA,EAAK,CAAC,CAAA,EAAG,GAAG,CAAA;AAEjE,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAC,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAA,EAAK,QAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAAA,IACrD,MAAA,EAAQ,EAAE,MAAA,EAAQ,CAAC,oBAAA,EAAO,sBAAO,oBAAA,EAAO,oBAAK,CAAA,EAAG,KAAA,EAAO,CAAA,EAAE;AAAA,IACzD,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAC,gCAAA,EAAS,gCAAA,EAAS,gCAAA,EAAS,gCAAA,EAAS,gCAAA,EAAS,gCAAO,CAAA,EAAG,KAAA,EAAO,CAAA;AAAE,GACpF;AAEA,EAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,EAAA,MAAM,UAAA,GAAa,KAAK,KAAA,CAAO,UAAA,GAAa,OAAQ,MAAA,CAAO,MAAA,CAAO,SAAS,CAAA,CAAE,CAAA;AAC7E,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA;AAE7C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBACEE,eAAAA,CAACC,OAAAA,EAAA,EAAI,eAAc,QAAA,EAChB,QAAA,EAAA;AAAA,MAAA,KAAA,oBAASE,cAAAA,CAACD,QAAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACvBF,eAAAA,CAACE,QAAAA,EAAA,EAAK,QAAA,EAAA;AAAA,QAAA,YAAA;AAAA,QAAW,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,QAAE;AAAA,OAAA,EAAC;AAAA,KAAA,EAC3C,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEF,gBAACC,OAAAA,EAAA,EAAI,eAAc,QAAA,EAAS,UAAA,EAAW,QAAA,EAAS,aAAA,EAAa,MAAA,EAC3D,QAAA,EAAA;AAAA,oBAAAE,eAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,SAAU,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,oBAC1CF,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,IAAA,EAAO,QAAA,EAAA;AAAA,MAAA,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,MAAE;AAAA,KAAA,EAAC,CAAA;AAAA,IACjD,KAAA,oBACCC,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,OAAQ,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EAErC,CAAA;AAEJ;AAKO,IAAM,kBAOR,CAAC;AAAA,EACJ,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAW,GAAIJ,qBAAA,EAAc;AAE5C,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA0B;AAC7C,IAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,MAAM,IAAI,CAAA;AACpC,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,OAAO,IAAA,IAAQ,IAAA,IAAQ,SAAA,GAAY,KAAA,CAAM,SAAS,CAAA,EAAG;AACnD,MAAA,IAAA,IAAQ,IAAA;AACR,MAAA,SAAA,EAAA;AAAA,IACF;AAEA,IAAA,OAAO,CAAA,EAAG,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AAAA,EAC/C,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,cAAA,KAAmC;AACtD,IAAA,OAAO,CAAA,EAAG,WAAA,CAAY,cAAc,CAAC,CAAA,EAAA,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,OAAA,KAA4B;AAC9C,IAAA,IAAI,UAAU,EAAA,EAAI,OAAO,GAAG,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA,CAAA,CAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AAChD,IAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,gBAAgB,CAAA,CAAA,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,UAAA,GAAa,CAAA,GAAK,gBAAA,GAAmB,aAAc,GAAA,GAAM,CAAA;AAE5E,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,uBACEE,eAAAA,CAACC,OAAAA,EAAA,EAAI,eAAc,QAAA,EAChB,QAAA,EAAA;AAAA,MAAA,QAAA,oBAAYD,eAAAA,CAACE,QAAAA,EAAA,EAAK,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QAAO;AAAA,OAAA,EAAS,CAAA;AAAA,sBACnCF,eAAAA,CAACE,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,QAAA,WAAA,CAAY,gBAAgB,CAAA;AAAA,QAAE,KAAA;AAAA,QAAI,YAAY,UAAU,CAAA;AAAA,QAAE,IAAA;AAAA,QAAG,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,QAAE;AAAA,OAAA,EACvF,CAAA;AAAA,MACC,KAAA,oBAASF,eAAAA,CAACE,QAAAA,EAAA,EAAK,QAAA,EAAA;AAAA,QAAA,SAAA;AAAA,QAAQ,YAAY,KAAK;AAAA,OAAA,EAAE,CAAA;AAAA,MAC1C,sBAAA,oBAA0BF,eAAAA,CAACE,QAAAA,EAAA,EAAK,QAAA,EAAA;AAAA,QAAA,OAAA;AAAA,QAAM,WAAW,sBAAsB;AAAA,OAAA,EAAE;AAAA,KAAA,EAC5E,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEF,eAAAA,CAACC,OAAAA,EAAA,EAAI,aAAA,EAAc,QAAA,EAAS,eAAa,MAAA,EACtC,QAAA,EAAA;AAAA,IAAA,QAAA,oBACCE,cAAAA,CAACF,OAAAA,EAAA,EAAI,cAAc,CAAA,EACjB,QAAA,kBAAAE,cAAAA,CAACD,QAAAA,EAAA,EAAK,KAAA,EAAO,KAAA,CAAM,IAAA,EAAO,oBAAS,CAAA,EACrC,CAAA;AAAA,oBAGFC,cAAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,gBAAA;AAAA,QACP,GAAA,EAAK,UAAA;AAAA,QACL,cAAA,EAAgB,IAAA;AAAA,QAChB,KAAA,EAAO;AAAA;AAAA,KACT;AAAA,oBAEAH,eAAAA,CAACC,OAAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,gBAAe,eAAA,EAChC,QAAA,EAAA;AAAA,sBAAAD,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAChB,QAAA,EAAA;AAAA,QAAA,WAAA,CAAY,gBAAgB,CAAA;AAAA,QAAE,KAAA;AAAA,QAAI,YAAY,UAAU;AAAA,OAAA,EAC3D,CAAA;AAAA,MACC,KAAA,oBACCC,cAAAA,CAACD,QAAAA,EAAA,EAAK,OAAO,KAAA,CAAM,KAAA,EAChB,QAAA,EAAA,WAAA,CAAY,KAAK,CAAA,EACpB;AAAA,KAAA,EAEJ,CAAA;AAAA,IAEC,sBAAA,IAA0B,sBAAA,GAAyB,CAAA,oBAClDC,eAACF,OAAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EACd,0BAAAD,eAAAA,CAACE,QAAAA,EAAA,EAAK,KAAA,EAAO,MAAM,KAAA,EAAO,QAAA,EAAA;AAAA,MAAA,OAAA;AAAA,MAClB,WAAW,sBAAsB;AAAA,KAAA,EACzC,CAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;AASO,IAAM,oBAAA,GAAuB,CAClC,WAAA,EACA,QAAA,GAAmB,GAAA,KAChB;AACH,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIH,uBAAAA,CAAM,SAAS,CAAC,CAAA;AAExD,EAAAA,uBAAAA,CAAM,UAAU,MAAM;AACpB,IAAA,MAAM,UAAA,GAAa,YAAA;AACnB,IAAA,MAAM,aAAa,WAAA,GAAc,UAAA;AACjC,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC7B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,OAAA,GAAU,UAAU,CAAC,CAAA;AAG/C,MAAA,MAAM,UAAU,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,UAAU,CAAC,CAAA;AAC5C,MAAA,MAAM,QAAA,GAAW,aAAc,UAAA,GAAa,OAAA;AAE5C,MAAA,eAAA,CAAgB,QAAQ,CAAA;AAExB,MAAA,IAAI,WAAW,CAAA,EAAG;AAChB,QAAA,qBAAA,CAAsB,OAAO,CAAA;AAAA,MAC/B;AAAA,IACF,CAAA;AAEA,IAAA,qBAAA,CAAsB,OAAO,CAAA;AAAA,EAC/B,CAAA,EAAG,CAAC,WAAA,EAAa,QAAQ,CAAC,CAAA;AAE1B,EAAA,OAAO,YAAA;AACT;;;AFvYA,WAAA,EAAA;AAQA,WAAA,EAAA;AAaA,WAAA,EAAA;AAOA,iBAAA,EAAA;AAUA,gBAAA,EAAA;AAUA,gBAAA,EAAA;AAUA,aAAA,EAAA;AAWA,aAAA,EAAA;AAmBA,eAAsB,mBAAmB,OAAA,EAId;AACzB,EAAA,MAAM,EAAE,cAAA,EAAAoE,eAAAA,EAAe,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AACjC,EAAA,MAAM,EAAE,oBAAA,EAAAC,qBAAAA,EAAqB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AAGvC,EAAA,IAAI,CAACD,iBAAe,EAAG;AACrB,IAAA,OAAOC,sBAAqB,OAAO,CAAA;AAAA,EACrC;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,qBAAA,EAAAC,sBAAAA,EAAuB,aAAA,EAAAC,cAAAA,KAAkB,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AACvD,IAAA,MAAM,EAAE,YAAA,EAAA1C,aAAAA,EAAa,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,iBAAA,EAAA,EAAA,oBAAA,CAAA,CAAA;AAC/B,IAAA,MAAM7B,MAAAA,GAAQ,MAAM,OAAO,OAAO,CAAA;AAElC,IAAA,MAAM,EAAE,YAAA,GAAe,EAAA,EAAI,QAAQ,eAAA,EAAiB,SAAA,GAAY,KAAM,GAAI,OAAA;AAE1E,IAAA,OAAO,IAAI,OAAA,CAAQ,CAACuC,QAAAA,KAAY;AAC9B,MAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAAmB;AACvC,QAAAA,SAAQ,MAAM,CAAA;AAAA,MAChB,CAAA;AAEA,MAAA,MAAM,eAAe,MAAM;AACzB,QAAAA,SAAQ,IAAI,CAAA;AAAA,MACd,CAAA;AAEA,MAAA,MAAM,eAAA,GAAkBvC,MAAAA,CAAM,aAAA,CAAc6B,aAAAA,EAAc;AAAA,QACxD,YAAA;AAAA,QACA,QAAA,EAAU,YAAA;AAAA,QACV,QAAA,EAAU,YAAA;AAAA,QACV,SAAA;AAAA,QACA,QAAA,EAAU,IAAA;AAAA,QACV,wBAAA,EAA0B;AAAA,OAC3B,CAAA;AAGD,MAAA,MAAM,WAAWyC,sBAAAA,EAAsB;AACvC,MAAAC,cAAAA,CAAc,eAAe,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC9C,QAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,QAAAhC,SAAQ,IAAI,CAAA;AAAA,MACd,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,8CAA8C,KAAK,CAAA;AAChE,IAAA,OAAO8B,sBAAqB,OAAO,CAAA;AAAA,EACrC;AACF;AAKA,eAAsB,mBAAmB,OAAA,EAId;AACzB,EAAA,MAAM,EAAE,aAAA,EAAAE,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AAChC,EAAA,MAAM,EAAE,kBAAA,EAAAzC,mBAAAA,EAAmB,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,iBAAA,EAAA,EAAA,oBAAA,CAAA,CAAA;AACrC,EAAA,MAAM9B,MAAAA,GAAQ,MAAM,OAAO,OAAO,CAAA;AAElC,EAAA,MAAM,EAAE,WAAA,GAAc,sBAAA,EAAwB,YAAA,GAAe,IAAG,GAAI,OAAA;AAEpE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACuC,QAAAA,KAAY;AAC9B,IAAA,MAAM,YAAA,GAAe,CAAC,MAAA,KAAmB;AACvC,MAAAA,SAAQ,MAAM,CAAA;AAAA,IAChB,CAAA;AAEA,IAAA,MAAM,eAAe,MAAM;AACzB,MAAAA,SAAQ,IAAI,CAAA;AAAA,IACd,CAAA;AAEA,IAAA,MAAM,eAAA,GAAkBvC,MAAAA,CAAM,aAAA,CAAc8B,mBAAAA,EAAoB;AAAA,MAC9D,YAAA;AAAA,MACA,QAAA,EAAU,YAAA;AAAA,MACV,QAAA,EAAU,YAAA;AAAA,MACV;AAAA,KACD,CAAA;AAED,IAAAyC,cAAAA,CAAc,eAAe,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC9C,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,MAAAhC,SAAQ,IAAI,CAAA;AAAA,IACd,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAKA,eAAsB,iBAAiB,OAAA,EAKlB;AACnB,EAAA,MAAM,EAAE,aAAA,EAAAgC,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AAChC,EAAA,MAAM,EAAE,aAAA,EAAAxD,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AAChC,EAAA,MAAMf,MAAAA,GAAQ,MAAM,OAAO,OAAO,CAAA;AAElC,EAAA,MAAM;AAAA,IACJ,KAAA,GAAQ,SAAA;AAAA,IACR,OAAA;AAAA,IACA,YAAA,GAAe,KAAA;AAAA,IACf,WAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAEJ,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACuC,QAAAA,KAAY;AAC9B,IAAA,MAAM,aAAA,GAAgB,MAAMA,QAAAA,CAAQ,IAAI,CAAA;AACxC,IAAA,MAAM,YAAA,GAAe,MAAMA,QAAAA,CAAQ,KAAK,CAAA;AAExC,IAAA,MAAM,eAAA,GAAkBvC,MAAAA,CAAM,aAAA,CAAce,cAAAA,EAAe;AAAA,MACzD,KAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,aAAA;AAAA,MACX,QAAA,EAAU,YAAA;AAAA,MACV,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAAwD,cAAAA,CAAc,eAAe,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC9C,MAAA,OAAA,CAAQ,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAC5D,MAAAhC,SAAQ,KAAK,CAAA;AAAA,IACf,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAKA,eAAsB,UAAU,OAAA,EAId;AAChB,EAAA,MAAM,EAAE,aAAA,EAAAgC,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AAChC,EAAA,MAAM,EAAE,WAAA,EAAA1D,YAAAA,EAAY,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AAC9B,EAAA,MAAMb,MAAAA,GAAQ,MAAM,OAAO,OAAO,CAAA;AAElC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,GAAO,QAAO,GAAI,OAAA;AAE1C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACuC,QAAAA,KAAY;AAC9B,IAAA,MAAM,WAAA,GAAc,MAAMA,QAAAA,EAAQ;AAElC,IAAA,MAAM,eAAA,GAAkBvC,MAAAA,CAAM,aAAA,CAAca,YAAAA,EAAa;AAAA,MACvD,KAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,WAAA;AAAA,MACT;AAAA,KACD,CAAA;AAED,IAAA0D,cAAAA,CAAc,eAAe,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC9C,MAAA,OAAA,CAAQ,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACrD,MAAAhC,QAAAA,EAAQ;AAAA,IACV,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAKA,eAAsB,cAA0B,OAAA,EAMpB;AAC1B,EAAA,MAAM,EAAE,aAAA,EAAAgC,cAAAA,EAAc,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,aAAA,EAAA,EAAA,gBAAA,CAAA,CAAA;AAChC,EAAA,MAAM,EAAE,MAAA,EAAA5E,OAAAA,EAAO,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AACzB,EAAA,MAAM,EAAE,MAAA,EAAA6B,OAAAA,EAAO,GAAI,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,WAAA,EAAA,EAAA,cAAA,CAAA,CAAA;AACzB,EAAA,MAAMxB,MAAAA,GAAQ,MAAM,OAAO,OAAO,CAAA;AAElC,EAAA,MAAM;AAAA,IACJ,KAAA,GAAQ,eAAA;AAAA,IACR,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA,GAAW,KAAA;AAAA,IACX,UAAA,GAAa;AAAA,GACf,GAAI,OAAA;AAEJ,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACuC,QAAAA,KAAY;AAC9B,IAAA,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAmB;AAC1C,MAAAA,SAAQ,KAAK,CAAA;AAAA,IACf,CAAA;AAEA,IAAA,MAAM,eAAe,MAAM;AACzB,MAAAA,SAAQ,IAAI,CAAA;AAAA,IACd,CAAA;AAEA,IAAA,MAAM,kBAAkBvC,MAAAA,CAAM,aAAA;AAAA,MAC5BL,OAAAA;AAAA,MACA,EAAE,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,QAAQ,YAAA,EAAa;AAAA,MAClDK,MAAAA,CAAM,aAAA;AAAA,QAAc,KAAA;AAAA,QAAO,EAAC;AAAA,QAC1BA,MAAAA,CAAM,aAAA,CAAc,MAAA,EAAQ,IAAI,OAAO,CAAA;AAAA,QACvCA,MAAAA,CAAM,cAAcwB,OAAAA,EAAQ;AAAA,UAC1B,OAAA,EAAS,OAAA;AAAA,UACT,QAAA,EAAU,eAAA;AAAA,UACV,QAAA;AAAA,UACA,UAAA;AAAA,UACA,SAAA,EAAW;AAAA,SACZ;AAAA;AACH,KACF;AAEA,IAAA+C,cAAAA,CAAc,eAAe,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAC9C,MAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AACzD,MAAAhC,SAAQ,IAAI,CAAA;AAAA,IACd,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAKO,SAAS,cAAA,GAA0B;AACxC,EAAA,OAAO,OAAO,OAAA,KAAY,WAAA,IACnB,OAAA,CAAQ,MAAA,IACR,QAAQ,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,IAC5B,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAA,IACb,OAAA,CAAQ,IAAI,IAAA,KAAS,MAAA;AAC9B;AAKA,eAAsB,gBAAA,CACpB,aACA,gBAAA,EACY;AACZ,EAAA,IAAI,CAAC,gBAAe,EAAG;AACrB,IAAA,OAAO,gBAAA,EAAiB;AAAA,EAC1B;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,WAAA,EAAY;AAAA,EAC3B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,IAAA,CAAK,mDAAmD,KAAK,CAAA;AACrE,IAAA,OAAO,gBAAA,EAAiB;AAAA,EAC1B;AACF;;;AflTA,YAAA,EAAA;;;AkB3DA,YAAA,EAAA;;;ACAA,YAAA,EAAA;;;ACAA,YAAA,EAAA;AAgCO,IAAK,kBAAA,qBAAAiC,mBAAAA,KAAL;AACL,EAAAA,oBAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,oBAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,oBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,oBAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,oBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,oBAAA,SAAA,CAAA,GAAU,SAAA;AANA,EAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;AAYL,IAAK,iBAAA,qBAAAC,kBAAAA,KAAL;AACL,EAAAA,mBAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,mBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,mBAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,mBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,mBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,mBAAA,OAAA,CAAA,GAAQ,OAAA;AANE,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AA0BL,IAAK,mBAAA,qBAAAC,oBAAAA,KAAL;AACL,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,qBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,qBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,qBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AANA,EAAA,OAAAA,oBAAAA;AAAA,CAAA,EAAA,mBAAA,IAAA,EAAA;AAyWL,IAAK,kBAAA,qBAAAC,mBAAAA,KAAL;AACL,EAAAA,oBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,oBAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,oBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,oBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,oBAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,oBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,oBAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,oBAAA,QAAA,CAAA,GAAS,QAAA;AARC,EAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;AAcL,IAAK,cAAA,qBAAAC,eAAAA,KAAL;AACL,EAAAA,gBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,gBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,gBAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,gBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,gBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,gBAAA,aAAA,CAAA,GAAc,aAAA;AANJ,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;AAsHL,IAAK,mBAAA,qBAAAC,oBAAAA,KAAL;AACL,EAAAA,qBAAA,YAAA,CAAA,GAAa,YAAA;AACb,EAAAA,qBAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,qBAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,qBAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,qBAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,qBAAA,cAAA,CAAA,GAAe,cAAA;AAPL,EAAA,OAAAA,oBAAAA;AAAA,CAAA,EAAA,mBAAA,IAAA,EAAA;AAwDL,IAAK,oBAAA,qBAAAC,qBAAAA,KAAL;AACL,EAAAA,sBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,sBAAA,qBAAA,CAAA,GAAsB,qBAAA;AACtB,EAAAA,sBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,sBAAA,sBAAA,CAAA,GAAuB,sBAAA;AACvB,EAAAA,sBAAA,QAAA,CAAA,GAAS,QAAA;AALC,EAAA,OAAAA,qBAAAA;AAAA,CAAA,EAAA,oBAAA,IAAA,EAAA;AAuDL,IAAK,YAAA,qBAAAC,aAAAA,KAAL;AACL,EAAAA,cAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,cAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,cAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,cAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,cAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,cAAA,QAAA,CAAA,GAAS,QAAA;AANC,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;AAgCL,IAAK,kBAAA,qBAAAC,mBAAAA,KAAL;AACL,EAAAA,oBAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,oBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,oBAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,oBAAA,OAAA,CAAA,GAAQ,OAAA;AAJE,EAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;AAiIL,SAAS,gBAAgB,GAAA,EAAoC;AAClE,EAAA,OACE,OAAO,GAAA,KAAQ,QAAA,IACf,GAAA,KAAQ,IAAA,IACR,eAAe,GAAA,IACf,WAAA,IAAe,GAAA,IACf,SAAA,IAAa,OACb,OAAA,IAAW,GAAA,IACX,UAAU,GAAA,IACV,SAAA,IAAa,OACb,QAAA,IAAY,GAAA;AAEhB;AAQO,SAAS,eAAe,KAAA,EAAsC;AACnE,EAAA,OAAO,CAAC,QAAA,EAAU,QAAA,EAAU,SAAS,QAAQ,CAAA,CAAE,SAAS,KAAK,CAAA;AAC/D;AAKO,SAAS,kBAAkB,KAAA,EAA4C;AAC5E,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,kBAAkB,CAAA,CAAE,SAAS,KAA2B,CAAA;AAC/E;AA4GO,IAAM,YAAA,GAAe;AAAA,EAC1B,OAAA,EAAS,IAAA;AAAA;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,WAAA,EAAa,GAAA;AAAA;AAAA,EACb,aAAA,EAAe,GAAA;AAAA,EACf,gBAAA,EAAkB,QAAA;AAAA,EAClB,kBAAA,EAAoB,GAAA;AAAA;AAAA,EACpB,qBAAA,EAAuB,GAAA;AAAA;AAAA,EACvB,WAAA,EAAa,KAAA;AAAA;AAAA,EACb,gBAAA,EAAkB;AAAA;AACpB;AAKO,IAAM,qBAAA,GAAsD;AAAA,EACjE,MAAA,EAAQ,iBAAA;AAAA,EACR,MAAA,EAAQ,iBAAA;AAAA,EACR,KAAA,EAAO,gBAAA;AAAA,EACP,MAAA,EAAQ;AACV;AAKO,IAAMC,iBAAAA,GAAwD;AAAA,EACnE,aAAA,EAAe,QAAA;AAAA,EACf,aAAA,EAAe,QAAA;AAAA,EACf,YAAA,EAAc,QAAA;AAAA,EACd,cAAA,EAAgB;AAClB;AAKO,IAAM,iBAAA,GAAoB;AAAA;AAAA,EAE/B,IAAA,EAAM,uCAAA;AAAA;AAAA,EAGN,UAAA,EAAY;AAAA,IACV,+CAAA;AAAA,IACA,4CAAA;AAAA,IACA;AAAA,GACF;AAAA;AAAA,EAGA,WAAA,EAAa;AAAA,IACX,gDAAA;AAAA,IACA,uCAAA;AAAA,IACA,yCAAA;AAAA,IACA;AAAA;AAEJ;;;ACjgCA,YAAA,EAAA;AAoDO,IAAM,qBAAA,GAAN,cAAoC1B,mBAAAA,CAAa;AAAA,EAC9C,QAAA,uBAA2C,GAAA,EAAI;AAAA,EAC/C,kBAAiE,EAAC;AAAA,EAClE,cAAA;AAAA,EACA,qBAAA,GAAgC,GAAA;AAAA;AAAA,EAExC,WAAA,GAAc;AACZ,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,SAAA,EAAkC;AAClD,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AAChC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4CAAA,EAA+C,SAAS,CAAA,CAAE,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,OAAA,GAAyB;AAAA,MAC7B,SAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,QAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAS;AAAA,QACP,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,aAAA,EAAe,CAAA;AAAA,QACf,SAAA,EAAW,CAAA;AAAA,QACX,eAAA,EAAiB,CAAA;AAAA,QACjB,WAAA,EAAa,CAAA;AAAA,QACb,mBAAA,EAAqB,CAAA;AAAA,QACrB,mBAAA,EAAqB,CAAA;AAAA,QACrB,mBAAA,EAAqB;AAAA,OACvB;AAAA,MACA,SAAS,EAAC;AAAA,MACV,WAAW;AAAC,KACd;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAGpC,IAAA,MAAM,WAAA,GAAoC;AAAA,MACxC,SAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,IAAA,EAAM,cAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS;AAAA;AACX,KACF;AAEA,IAAA,IAAA,CAAK,WAAW,WAAW,CAAA;AAC3B,IAAA,IAAA,CAAK,IAAA,CAAK,iBAAiB,SAAS,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAA,EAAkC;AACjD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,QAAA,GAAW,KAAA;AACnB,IAAA,OAAA,CAAQ,OAAA,CAAQ,OAAA,mBAAU,IAAI,IAAA,EAAK;AACnC,IAAA,OAAA,CAAQ,OAAA,CAAQ,aAAA,GAAgB,OAAA,CAAQ,OAAA,CAAQ,OAAA,CAAQ,SAAQ,GAAI,OAAA,CAAQ,OAAA,CAAQ,SAAA,CAAU,OAAA,EAAQ;AAGtG,IAAA,MAAM,SAAA,GAAkC;AAAA,MACtC,SAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,IAAA,EAAM,YAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,uBAAA;AAAA,QACT,QAAA,EAAU,QAAQ,OAAA,CAAQ,aAAA;AAAA,QAC1B,QAAA,EAAU;AAAA,UACR,cAAA,EAAgB,QAAQ,OAAA,CAAQ,SAAA;AAAA,UAChC,WAAA,EAAa,OAAA,CAAQ,OAAA,CAAQ,SAAA,GAAY,CAAA,GAAK,OAAA,CAAQ,OAAA,CAAQ,eAAA,GAAkB,OAAA,CAAQ,OAAA,CAAQ,SAAA,GAAa,GAAA,GAAM,CAAA;AAAA,UACnH,mBAAA,EAAqB,QAAQ,OAAA,CAAQ;AAAA;AACvC;AACF,KACF;AAEA,IAAA,IAAA,CAAK,WAAW,SAAS,CAAA;AACzB,IAAA,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,SAAA,EAAW,OAAA,CAAQ,OAAO,CAAA;AAGnD,IAAA,UAAA,CAAW,MAAM;AACf,MAAA,IAAA,CAAK,QAAA,CAAS,OAAO,SAAS,CAAA;AAAA,IAChC,GAAG,GAAI,CAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,CAAiB,UAAkD,SAAA,EAA0B;AAC3F,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,OAAA,CAAQ,SAAA,CAAU,KAAK,QAAQ,CAAA;AAAA,MACjC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,QAAQ,CAAA;AAAA,IACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAA,CAAuB,UAAkD,SAAA,EAA0B;AACjG,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AAChD,QAAA,IAAI,UAAU,EAAA,EAAI;AAChB,UAAA,OAAA,CAAQ,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,QACnC;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,QAAQ,CAAA;AACnD,MAAA,IAAI,UAAU,EAAA,EAAI;AAChB,QAAA,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,SAAA,EAA4B;AACtC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,OAAO,SAAS,QAAA,IAAY,KAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,SAAA,EAA4C;AACrD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,OAAO,SAAS,OAAA,IAAW,IAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA8B;AAC5B,IAAA,OAAO,KAAA,CAAM,KAAK,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,CACtC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAA,KAAM,QAAQ,QAAQ,CAAA,CACzC,IAAI,CAAC,CAAC,SAAS,CAAA,KAAM,SAAS,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,CAAgB,SAAA,EAAmB,QAAA,EAAkB,QAAA,EAAsC;AACzF,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,QAAA,EAAU;AAEnC,IAAA,MAAM,MAAA,GAA+B;AAAA,MACnC,SAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,IAAA,EAAM,YAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,QAAA;AAAA,QACA,OAAA,EAAS,YAAY,QAAQ,CAAA,CAAA;AAAA,QAC7B;AAAA;AACF,KACF;AAEA,IAAA,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,CAAmB,SAAA,EAAmB,QAAA,EAAkB,QAAA,EAAkB,OAAA,EAAwB;AAChG,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,QAAA,EAAU;AAEnC,IAAA,MAAM,MAAA,GAA+B;AAAA,MACnC,SAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,IAAA,EAAM,eAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,QAAA;AAAA,QACA,QAAA,EAAU,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,GAAA,EAAK,QAAQ,CAAC,CAAA;AAAA,QAC7C,OAAA,EAAS,WAAW,CAAA,EAAG,QAAQ,cAAc,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA,QAChE,IAAA,EAAM,IAAA,CAAK,sBAAA,CAAuB,SAAS;AAAA;AAC7C,KACF;AAEA,IAAA,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAmB,SAAA,EAAmB,QAAA,EAAkB,QAAA,EAAkB,OAAA,GAAmB,MAAM,KAAA,EAAsB;AACvH,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,QAAA,EAAU;AAGnC,IAAA,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAA;AAChB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,OAAA,CAAQ,eAAA,EAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAA;AAAA,IAClB;AAGA,IAAA,OAAA,CAAQ,OAAA,CAAQ,mBAAA,GAAsB,IAAA,CAAK,4BAAA,CAA6B,SAAS,QAAQ,CAAA;AAEzF,IAAA,MAAM,MAAA,GAA+B;AAAA,MACnC,SAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,IAAA,EAAM,eAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,QAAA;AAAA,QACA,SAAS,OAAA,GAAU,CAAA,EAAG,QAAQ,CAAA,uBAAA,CAAA,GAA4B,GAAG,QAAQ,CAAA,OAAA,CAAA;AAAA,QACrE,QAAA;AAAA,QACA,KAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR,OAAA;AAAA,UACA,UAAA,EAAY,QAAQ,OAAA,CAAQ,SAAA;AAAA,UAC5B,aAAc,OAAA,CAAQ,OAAA,CAAQ,eAAA,GAAkB,OAAA,CAAQ,QAAQ,SAAA,GAAa;AAAA;AAC/E;AACF,KACF;AAEA,IAAA,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,CAAqB,SAAA,EAAmB,eAAA,EAAyB,eAAA,EAAgC;AAC/F,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,QAAA,EAAU;AAEnC,IAAA,OAAA,CAAQ,QAAQ,gBAAA,GAAmB,eAAA;AACnC,IAAA,OAAA,CAAQ,QAAQ,eAAA,GAAkB,eAAA;AAElC,IAAA,MAAM,MAAA,GAA+B;AAAA,MACnC,SAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,IAAA,EAAM,iBAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,sBAAsB,eAAe,CAAA,EAAG,kBAAkB,CAAA,IAAA,EAAO,eAAe,KAAK,EAAE,CAAA,CAAA;AAAA,QAChG,WAAA,EAAa,eAAA;AAAA,QACb,UAAA,EAAY,eAAA;AAAA,QACZ,QAAA,EAAU,eAAA,GAAmB,eAAA,GAAkB,eAAA,GAAmB,GAAA,GAAM;AAAA;AAC1E,KACF;AAEA,IAAA,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAA,CAAwB,WAAmB,eAAA,EAA+B;AACxE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,QAAA,EAAU;AAEnC,IAAA,OAAA,CAAQ,QAAQ,mBAAA,GAAsB,eAAA;AAGtC,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI,QAAQ,OAAA,CAAQ,eAAA,IAAmB,OAAA,CAAQ,OAAA,CAAQ,kBAAkB,eAAA,EAAiB;AACxF,MAAA,MAAM,mBAAA,GAAsB,OAAA,CAAQ,OAAA,CAAQ,eAAA,GAAkB,eAAA;AAC9D,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA;AACzD,MAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,QAAA,MAAM,aAAA,GAAiB,sBAAsB,aAAA,GAAiB,GAAA;AAC9D,QAAA,GAAA,GAAM,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,aAAa,CAAA;AAAA,MAC3C;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAA+B;AAAA,MACnC,SAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,IAAA,EAAM,oBAAA;AAAA,MACN,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,aAAa,eAAe,CAAA,UAAA,CAAA;AAAA,QACrC,WAAA,EAAa,eAAA;AAAA,QACb,UAAA,EAAY,QAAQ,OAAA,CAAQ,eAAA;AAAA,QAC5B,QAAA,EAAU,QAAQ,OAAA,CAAQ,eAAA,GAAmB,kBAAkB,OAAA,CAAQ,OAAA,CAAQ,kBAAmB,GAAA,GAAM,MAAA;AAAA,QACxG,IAAA,EAAM,IAAA,CAAK,sBAAA,CAAuB,OAAO,CAAA;AAAA,QACzC;AAAA;AACF,KACF;AAEA,IAAA,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,uBAAuB,SAAA,EAAqC;AAC1D,IAAA,OAAO,CAAC,KAAA,KAAyB;AAC/B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,MAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,QAAA,EAAU;AAEnC,MAAA,MAAM,MAAA,GAA+B;AAAA,QACnC,SAAA;AAAA,QACA,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,IAAA,EAAM,eAAA;AAAA,QACN,IAAA,EAAM;AAAA,UACJ,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,SAAS,KAAA,CAAM,OAAA;AAAA,UACf,UAAU,KAAA,CAAM;AAAA;AAClB,OACF;AAEA,MAAA,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,IACxB,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAW,MAAA,EAAoC;AACrD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAO,SAAS,CAAA;AAGlD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,OAAA,CAAQ,KAAK,MAAM,CAAA;AAE3B,MAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,GAAA,EAAK;AAChC,QAAA,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAAA,MAC9C;AAGA,MAAA,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY;AACpC,QAAA,IAAI;AACF,UAAA,QAAA,CAAS,MAAM,CAAA;AAAA,QACjB,SAAS,KAAA,EAAO;AACd,UAAA,OAAA,CAAQ,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAAA,QACpD;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAGA,IAAA,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA,QAAA,KAAY;AACvC,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,MAAM,CAAA;AAAA,MACjB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,sCAAsC,KAAK,CAAA;AAAA,MAC3D;AAAA,IACF,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,SAAA,EAA2B;AACxD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,SAAS,OAAO,CAAA;AAErB,IAAA,MAAM,eAAe,IAAA,CAAK,GAAA,KAAQ,OAAA,CAAQ,SAAA,CAAU,SAAQ,IAAK,GAAA;AACjE,IAAA,OAAO,WAAA,GAAc,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,YAAY,WAAA,GAAc,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,OAAA,EAAgC;AAC7D,IAAA,MAAM,eAAe,IAAA,CAAK,GAAA,KAAQ,OAAA,CAAQ,SAAA,CAAU,SAAQ,IAAK,GAAA;AACjE,IAAA,OAAO,WAAA,GAAc,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,sBAAsB,WAAA,GAAc,CAAA;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA,EAKQ,4BAAA,CAA6B,SAAwB,WAAA,EAA6B;AACxF,IAAA,MAAM,UAAA,GAAa,QAAQ,OAAA,CAAQ,SAAA;AACnC,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,OAAO,WAAA;AAAA,IACT;AAEA,IAAA,MAAM,cAAA,GAAiB,QAAQ,OAAA,CAAQ,mBAAA;AACvC,IAAA,OAAA,CAAS,cAAA,IAAkB,UAAA,GAAa,CAAA,CAAA,GAAM,WAAA,IAAe,UAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAA4B;AAClC,IAAA,IAAA,CAAK,cAAA,GAAiB,YAAY,MAAM;AACtC,MAAA,KAAA,MAAW,CAAC,SAAA,EAAW,OAAO,KAAK,IAAA,CAAK,QAAA,CAAS,SAAQ,EAAG;AAC1D,QAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,UAAA,OAAA,CAAQ,QAAQ,aAAA,GAAgB,IAAA,CAAK,KAAI,GAAI,OAAA,CAAQ,UAAU,OAAA,EAAQ;AACvE,UAAA,OAAA,CAAQ,OAAA,CAAQ,mBAAA,GAAsB,IAAA,CAAK,sBAAA,CAAuB,SAAS,CAAA;AAG3E,UAAA,IAAA,CAAK,IAAA,CAAK,eAAA,EAAiB,SAAA,EAAW,OAAA,CAAQ,OAAO,CAAA;AAAA,QACvD;AAAA,MACF;AAAA,IACF,CAAA,EAAG,KAAK,qBAAqB,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,GAAgB;AACd,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,aAAA,CAAc,KAAK,cAAc,CAAA;AAAA,IACnC;AAGA,IAAA,KAAA,MAAW,SAAA,IAAa,IAAA,CAAK,iBAAA,EAAkB,EAAG;AAChD,MAAA,IAAA,CAAK,WAAW,SAAS,CAAA;AAAA,IAC3B;AAEA,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,gBAAgB,MAAA,GAAS,CAAA;AAAA,EAChC;AACF;;;ACxdA,YAAA,EAAA;AAsDO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,OAAe,WAAA,mBAAc,IAAI,GAAA,EAAuB;AAAA,EACxD,OAAe,YAAA,mBAAe,IAAI,GAAA,EAAoB;AAAA,EACtD,OAAwB,SAAA,GAAY,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAKpC,aAAa,WAAW,gBAAA,EAA+C;AACrE,IAAA,MAAM,OAAA,GAAU,gBAAA,IAAoB,OAAA,CAAQ,GAAA,EAAI;AAChD,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAGpD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA;AAC9C,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,MAAMnE,mBAAAA,CAAG,QAAA,CAAS,YAAY,OAAO,CAAA;AAC3D,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA;AAGvC,MAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAG1B,MAAA,MAAM,iBAAiB,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAa8F,gBAAA,CAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AAG/E,MAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAA,EAAY,cAAc,CAAA;AAC/C,MAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,UAAA,EAAY,IAAA,CAAK,KAAK,CAAA;AAE5C,MAAA,OAAO,cAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,QAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,4BAAA,EAA+B,KAAA,CAAM,OAAO,IAAI,UAAU,CAAA;AAAA,MACzF;AACA,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,+BAAA,EAAkC,UAAU,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IACvF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAqB,eAAe,QAAA,EAAmC;AACrE,IAAA,IAAI,UAAA,GAAkBA,yBAAQ,QAAQ,CAAA;AACtC,IAAA,MAAM,OAAA,GAAeA,gBAAA,CAAA,KAAA,CAAM,UAAU,CAAA,CAAE,IAAA;AAEvC,IAAA,OAAO,eAAe,OAAA,EAAS;AAC7B,MAAA,MAAM,UAAA,GAAkBA,gBAAA,CAAA,IAAA,CAAK,UAAA,EAAY,YAAA,EAAc,UAAU,CAAA;AAEjE,MAAA,IAAI,MAAM9F,mBAAAA,CAAG,UAAA,CAAW,UAAU,CAAA,EAAG;AACnC,QAAA,OAAO,UAAA;AAAA,MACT;AAEA,MAAA,UAAA,GAAkB8F,yBAAQ,UAAU,CAAA;AAAA,IACtC;AAEA,IAAA,MAAM,IAAI,kBAAA;AAAA,MACR,CAAA,sFAAA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,gBAAgB,UAAA,EAAsC;AACnE,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA;AAE9C,IAAA,IAAI,UAAU,QAAA,IAAa,IAAA,CAAK,KAAI,GAAI,QAAA,GAAY,KAAK,SAAA,EAAW;AAClE,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,eAAe,MAAA,EAAyB;AACrD,IAAA,IAAI,CAAC,MAAA,CAAO,UAAA,IAAc,OAAO,MAAA,CAAO,eAAe,QAAA,EAAU;AAC/D,MAAA,MAAM,IAAI,mBAAmB,oDAAoD,CAAA;AAAA,IACnF;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,cAAA,IAAkB,OAAO,MAAA,CAAO,mBAAmB,QAAA,EAAU;AACvE,MAAA,MAAM,IAAI,mBAAmB,gDAAgD,CAAA;AAAA,IAC/E;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,cAAc,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,CAAA,oCAAA,EAAuC,OAAO,cAAc,CAAA,yBAAA;AAAA,OAC9D;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,CAAC,YAAY,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,EAAG;AAC1E,MAAA,IAAA,CAAK,oBAAA,CAAqB,YAAY,YAAY,CAAA;AAAA,IACpD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,oBAAA,CAAqB,UAAA,EAAoB,MAAA,EAA+B;AACrF,IAAA,MAAM,QAAA,GAAW,CAAC,MAAA,EAAQ,SAAA,EAAW,QAAQ,SAAS,CAAA;AACtD,IAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,MAAA,IAAI,EAAE,SAAS,MAAA,CAAA,EAAS;AACtB,QAAA,MAAM,IAAI,kBAAA;AAAA,UACR,CAAA,2BAAA,EAA8B,UAAU,CAAA,2BAAA,EAA8B,KAAK,CAAA,CAAA;AAAA,SAC7E;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,8BAA8B,UAAU,CAAA,wBAAA;AAAA,OAC1C;AAAA,IACF;AAEA,IAAA,IAAI,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,IAAY,MAAA,CAAO,WAAW,CAAA,EAAG;AAC7D,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,8BAA8B,UAAU,CAAA,oCAAA;AAAA,OAC1C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,kBAAA,CAAmB,MAAA,EAAmB,SAAA,EAA8B;AACjF,IAAA,MAAM,iBAAiB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAExD,IAAA,KAAA,MAAW,CAAC,YAAY,YAAY,CAAA,IAAK,OAAO,OAAA,CAAQ,cAAA,CAAe,UAAU,CAAA,EAAG;AAElF,MAAA,YAAA,CAAa,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO;AAE/C,QAAA,IAAI,IAAI,QAAA,CAAS,GAAG,KAAK,CAAMA,gBAAA,CAAA,UAAA,CAAW,GAAG,CAAA,EAAG;AAC9C,UAAA,OAAYA,gBAAA,CAAA,OAAA,CAAQ,SAAA,EAAW,IAAA,EAAM,GAAG,CAAA;AAAA,QAC1C;AACA,QAAA,OAAO,GAAA;AAAA,MACT,CAAC,CAAA;AAGD,MAAA,IAAI,aAAa,GAAA,EAAK;AACpB,QAAA,KAAA,MAAW,CAAC,QAAQ,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,YAAA,CAAa,GAAG,CAAA,EAAG;AACjE,UAAA,IAAI,SAAS,QAAA,CAAS,GAAG,KAAK,CAAMA,gBAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,EAAG;AACxD,YAAA,YAAA,CAAa,IAAI,MAAM,CAAA,GAASA,gBAAA,CAAA,OAAA,CAAQ,SAAA,EAAW,MAAM,QAAQ,CAAA;AAAA,UACnE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,cAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,eAAA,CAAgB,UAAA,EAAqB,gBAAA,EAAqD;AACrG,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,gBAAgB,CAAA;AACrD,IAAA,MAAM,YAAA,GAAe,cAAc,MAAA,CAAO,cAAA;AAE1C,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,UAAA,CAAW,YAAY,CAAA;AACnD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,QAAA,EAAW,YAAY,CAAA,gCAAA,CAAkC,CAAA;AAAA,IACxF;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,uBAAuB,gBAAA,EAAqD;AACvF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,gBAAgB,CAAA;AACrD,IAAA,OAAO,MAAA,CAAO,UAAA,CAAW,MAAA,CAAO,cAAc,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,YAAY,gBAAA,EAA8C;AACrE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,UAAA,CAAW,gBAAgB,CAAA;AACrD,IAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,UAAA,GAAmB;AACxB,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AACvB,IAAA,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,UAAU,gBAAA,EAA6C;AAClE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,cAAA,CAAe,gBAAA,IAAoB,OAAA,CAAQ,KAAK,CAAA;AAC3D,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,cAAc,gBAAA,EAA4C;AACrE,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,gBAAA,IAAoB,OAAA,CAAQ,KAAK,CAAA;AAAA,EAC9D;AACF;;;AC3QA,YAAA,EAAA;AAgCO,IAAM,aAAN,MAAiB;AAAA,EACd,YAAA;AAAA,EACA,QAAA;AAAA,EACA,oBAAA;AAAA,EACA,WAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAAyB,EAAC,EAAG;AACvC,IAAA,IAAA,CAAK,YAAA,GAAe,QAAQ,YAAA,IAAgBxC,wBAAAA,CAAK,KAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,YAAA,EAAc,MAAM,CAAA;AACzF,IAAA,IAAA,CAAK,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACpC,IAAA,IAAA,CAAK,oBAAA,GAAuB,QAAQ,oBAAA,IAAwB,IAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAA,CAAW,QAAA,GAAmB,KAAA,EAAsB;AAExD,IAAA,MAAMtD,mBAAAA,CAAG,SAAA,CAAU,IAAA,CAAK,YAAY,CAAA;AAGpC,IAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA;AAC1E,IAAA,MAAM,OAAA,GAAU,UAAU,CAAC,CAAA;AAC3B,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,CAAC,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA;AACzD,IAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAG3C,IAAA,MAAM,WAAA,GAAc,CAAA,cAAA,EAAiB,QAAQ,CAAA,CAAA,EAAI,aAAa,CAAA,IAAA,CAAA;AAC9D,IAAA,IAAA,CAAK,WAAA,GAAcsD,wBAAAA,CAAK,IAAA,CAAK,IAAA,CAAK,cAAc,WAAW,CAAA;AAG3D,IAAA,MAAM,SAAS,CAAA,qCAAA,EAAA,iBAAwC,IAAI,IAAA,EAAK,EAAE,aAAa;AAAA,CAAA;AAC/E,IAAA,MAAMtD,mBAAAA,CAAG,SAAA,CAAU,IAAA,CAAK,WAAA,EAAa,MAAM,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAA,CAAc,OAAe,OAAA,EAAyB;AAC5D,IAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,IAAA,OAAO,CAAA,EAAG,SAAS,CAAA,GAAA,EAAM,KAAK,MAAM,OAAO;AAAA,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,WAAW,OAAA,EAAgC;AACvD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,IACpE;AACA,IAAA,MAAMA,mBAAAA,CAAG,UAAA,CAAW,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,GAAA,CAAI,KAAA,EAAiB,SAAA,EAAmB,OAAA,EAAiB,iBAA0B,IAAA,EAAqB;AACpH,IAAA,IAAI,KAAA,GAAQ,KAAK,QAAA,EAAU;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,aAAA,CAAc,SAAA,EAAW,OAAO,CAAA;AAG9D,IAAA,MAAM,IAAA,CAAK,WAAW,gBAAgB,CAAA;AAGtC,IAAA,IAAI,IAAA,CAAK,wBAAwB,cAAA,EAAgB;AAC/C,MAAA,OAAA,CAAQ,GAAA,CAAI,gBAAA,CAAiB,IAAA,EAAM,CAAA;AAAA,IACrC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,OAAA,EAAiB,cAAA,GAA0B,KAAA,EAAsB;AAC3E,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,cAAgB,OAAA,EAAS,SAAS,cAAc,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,CAAK,OAAA,EAAiB,cAAA,GAA0B,IAAA,EAAqB;AACzE,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,aAAe,MAAA,EAAQ,SAAS,cAAc,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,CAAQ,OAAA,EAAiB,cAAA,GAA0B,IAAA,EAAqB;AAC5E,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,gBAAkB,SAAA,EAAW,SAAS,cAAc,CAAA;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,OAAA,EAAiB,cAAA,GAA0B,IAAA,EAAqB;AAC1E,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,cAAgB,OAAA,EAAS,SAAS,cAAc,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,OAAA,EAAiB,cAAA,GAA0B,IAAA,EAAqB;AAC7E,IAAA,MAAM,IAAA,CAAK,GAAA,CAAI,CAAA,iBAAmB,UAAA,EAAY,SAAS,cAAc,CAAA;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAqC;AACnC,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,KAAA,EAAuB;AACjC,IAAA,IAAA,CAAK,QAAA,GAAW,KAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,OAAA,EAAwB;AACxC,IAAA,IAAA,CAAK,oBAAA,GAAuB,OAAA;AAAA,EAC9B;AACF,CAAA;AAMO,IAAM,YAAN,MAAgB;AAAA,EACb,MAAA;AAAA,EACA,WAAA,GAAuB,KAAA;AAAA,EAE/B,YAAY,OAAA,EAAyB;AACnC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,UAAA,CAAW,OAAO,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AAClC,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAM,OAAA,EAAgC;AAC1C,IAAA,MAAM,KAAK,iBAAA,EAAkB;AAC7B,IAAA,MAAM,KAAK,MAAA,CAAO,KAAA,CAAM,CAAA,MAAA,EAAS,OAAO,IAAI,KAAK,CAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAK,OAAA,EAAgC;AACzC,IAAA,MAAM,KAAK,iBAAA,EAAkB;AAC7B,IAAA,MAAM,KAAK,MAAA,CAAO,IAAA,CAAK,CAAA,MAAA,EAAS,OAAO,IAAI,KAAK,CAAA;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,OAAA,EAAgC;AAC5C,IAAA,MAAM,KAAK,iBAAA,EAAkB;AAC7B,IAAA,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,CAAA,MAAA,EAAS,OAAO,IAAI,KAAK,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,OAAA,EAAiB,cAAA,GAA0B,KAAA,EAAsB;AAC3E,IAAA,MAAM,KAAK,iBAAA,EAAkB;AAC7B,IAAA,MAAM,KAAK,MAAA,CAAO,KAAA,CAAM,CAAA,MAAA,EAAS,OAAO,IAAI,cAAc,CAAA;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAqC;AACnC,IAAA,OAAO,IAAA,CAAK,OAAO,cAAA,EAAe;AAAA,EACpC;AAAA,EAEA,MAAc,iBAAA,GAAmC;AAC/C,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA,IACxB;AAAA,EACF;AACF,CAAA;AAKA,IAAI,eAAA,GAAoC,IAAA;AAKjC,SAAS,aAAa,OAAA,EAAoC;AAC/D,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAA,eAAA,GAAkB,IAAI,UAAU,OAAO,CAAA;AAAA,EACzC;AACA,EAAA,OAAO,eAAA;AACT;;;ACpPA,YAAA,EAAA;;;ACAA,YAAA,EAAA;AA6BA,IAAM,gBAAN,MAAoB;AAAA,EACV,SAAA,GAAqB,KAAA;AAAA,EACrB,kBAAmC,EAAC;AAAA,EAC3B,cAAA,GAAyB,GAAA;AAAA;AAAA,EAClC,uBAAA,GAA+C,IAAA;AAAA;AAAA;AAAA;AAAA,EAKvD,QAAA,GAAoB;AAClB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAAuB;AAC/B,IAAA,MAAM,YAAY,IAAA,CAAK,SAAA;AACvB,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AAGjB,IAAA,IAAI,aAAa,CAAC,MAAA,IAAU,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC3D,MAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,0BAA0B,QAAA,EAAqC;AAC7D,IAAA,IAAA,CAAK,uBAAA,GAA0B,QAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CAAe,SAAc,MAAA,EAAuB;AAElD,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAuB;AAAA,MAC3B,OAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,sBAAe,IAAA;AAAK,KACtB;AAEA,IAAA,IAAA,CAAK,eAAA,CAAgB,KAAK,KAAK,CAAA;AAG/B,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,GAAS,IAAA,CAAK,cAAA,EAAgB;AACrD,MAAA,IAAA,CAAK,gBAAgB,KAAA,EAAM;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAAuC;AACrC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,eAAe,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAA4B;AAC1B,IAAA,IAAA,CAAK,gBAAgB,MAAA,GAAS,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,IAAA,CAAK,eAAA,CAAgB,MAAA,KAAW,CAAA,EAAG;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,KAAK,eAAA,CAAgB,MAAA;AAGzC,IAAA,OAAA,CAAQ,KAAA,CAAMwB,uBAAAA,CAAM,MAAA,CAAO,IAAA,CAAK;AAAA,8BAAA,EAAyB,WAAW,CAAA,gBAAA,EAAmB,WAAA,GAAc,IAAI,GAAA,GAAM,EAAE,uCAAuC,CAAC,CAAA;AACzJ,IAAA,OAAA,CAAQ,KAAA,CAAMA,uBAAAA,CAAM,IAAA,CAAK,0EAA0E,CAAC,CAAA;AAIpG,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,eAAA,EAAiB;AACxC,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,OAAO,CAAA;AAAA,MAC3C,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,KAAA,CAAM,MAAM,OAAO,CAAA;AAAA,MAC7B;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAIzB,IAAA,IAAI,KAAK,uBAAA,EAAyB;AAEhC,MAAA,YAAA,CAAa,MAAM;AAGjB,QAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AAGzB,QAAA,IAAI,KAAK,uBAAA,EAAyB;AAChC,UAAA,IAAA,CAAK,uBAAA,EAAwB;AAAA,QAC/B;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,qBAAA,GAA8B;AAC5B,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAqD;AACnD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAK,eAAA,CAAgB,MAAA;AAAA,MAC5B,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,EACF;AACF,CAAA;AAKA,IAAM,mBAAA,GAAsB,IAAI,aAAA,EAAc;AAKvC,SAAS,gBAAA,GAA4B;AAC1C,EAAA,OAAO,oBAAoB,QAAA,EAAS;AACtC;AAYO,SAAS,mBAAA,CAAoB,SAAc,MAAA,EAAuB;AACvE,EAAA,mBAAA,CAAoB,cAAA,CAAe,SAAS,MAAM,CAAA;AACpD;;;AD/IO,IAAM,yBAAN,MAA6B;AAAA,EAC1B,OAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAAmC,EAAC,EAAG;AACjD,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,aAAA,EAAe,OAAA,CAAQ,aAAA,KAAkB,OAAA,CAAQ,OAAO,KAAA,IAAS,KAAA,CAAA;AAAA,MACjE,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ;AAAA,KACpC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,EAAoB;AAGxB,IAAA,IAAI,kBAAiB,EAAG;AACtB,MAAA,mBAAA,CAAoB,OAAO,CAAA;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,aAAA,EAAe;AAI9B,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAIpC,MAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,IAAI,CAAC,QAAQ,QAAA,CAAS,IAAI,KAAK,CAAC,OAAA,CAAQ,QAAA,CAASuE,MAAG,CAAA,EAAG;AACrD,UAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAMA,MAAG,CAAA;AAAA,QAC/B;AAAA,MACF,CAAA,MAAO;AAEL,QAAA,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,MACvB;AAAA,IAIF,CAAA,MAAO;AAEL,MAAA,IAAI,OAAO,YAAY,QAAA,EAAU;AAC/B,QAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AACjC,QAAA,IAAI,CAAC,QAAQ,QAAA,CAAS,IAAI,KAAK,CAAC,OAAA,CAAQ,QAAA,CAASA,MAAG,CAAA,EAAG;AACrD,UAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAMA,MAAG,CAAA;AAAA,QAC/B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,MAAM,OAAO,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,eAAA,CAAgB,QAAgB,OAAA,EAAoB;AAGlD,IAAA,IAAI,kBAAiB,EAAG;AACtB,MAAA,mBAAA,CAAoB,SAAS,MAAM,CAAA;AACnC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,QAAQ,aAAA,EAAe;AAC9B,MAAA,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,KAAA,CAAM,UAAU,CAAA;AAAA,IACtC;AAGA,IAAA,OAAA,CAAQ,KAAA,CAAM,QAAQ,OAAO,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA2B;AACzB,IAAA,OAAO,KAAK,OAAA,CAAQ,aAAA;AAAA,EACtB;AACF,CAAA;AAKA,IAAI,YAAA,GAA8C,IAAA;AAK3C,SAAS,yBAAA,GAAoD;AAClE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,YAAA,GAAe,IAAI,sBAAA,EAAuB;AAAA,EAC5C;AACA,EAAA,OAAO,YAAA;AACT;AAoBO,SAAS,+BAAA,CAAgC,QAAgB,OAAA,EAAoB;AAClF,EAAA,yBAAA,EAA0B,CAAE,eAAA,CAAgB,MAAA,EAAQ,OAAO,CAAA;AAC7D;;;ALrFO,IAAM,gBAAN,MAAoB;AAAA,EAazB,YACU,OAAA,EACR;AADQ,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAER,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAI,kBAAA,EAAmB;AAC9C,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAI,gBAAA,CAAiB;AAAA,MAC3C,WAAA,EAAa,EAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACX,CAAA;AAGD,IAAA,IAAI,QAAQ,uBAAA,EAAyB;AACnC,MAAA,IAAA,CAAK,qBAAA,GAAwB,IAAI,qBAAA,EAAsB;AACvD,MAAA,IAAA,CAAK,mBAAmB,OAAA,CAAQ,SAAA,IAAa,CAAA,QAAA,EAAW,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,IACpE;AAEA,IAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC5B,MAAA,IAAA,CAAK,eAAA,CAAgB,WAAA,CAAY,OAAA,CAAQ,gBAAgB,CAAA;AAAA,IAC3D;AAGA,IAAA,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW,CAAE,KAAA,CAAM,CAAA,KAAA,KAAS;AACtC,MAAA,OAAA,CAAQ,KAAA,CAAM,oCAAoC,KAAK,CAAA;AAAA,IACzD,CAAC,CAAA;AAAA,EACH;AAAA,EAnCQ,eAAA;AAAA,EACA,cAAA,GAAiB,IAAI,qBAAA,EAAsB;AAAA,EAC3C,cAAA,GAAiB,IAAI,kBAAA,EAAmB;AAAA,EACxC,gBAAA;AAAA,EACA,aAAA,uBAA6C,GAAA,EAAI;AAAA,EACjD,qBAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA,GAA6B,CAAA;AAAA,EAC7B,sBAAA,GAAiC,GAAA;AAAA;AAAA,EACjC,YAAA,GAAuB,CAAA;AAAA,EACvB,SAAS,YAAA,EAAa;AAAA,EA2B9B,MAAM,OAAA,GAAyB;AAE7B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,cAAc,CAAC,IAAA,CAAK,QAAQ,UAAA,EAAY;AACxD,MAAA,MAAM,IAAI,mBAAmB,uDAAuD,CAAA;AAAA,IACtF;AAGA,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,4BAA4B,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MAChE;AAAA,IACF,SAAS,KAAA,EAAO;AAEd,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,sCAAsC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,QAC5F;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA4B;AAEhC,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,qEAAqE,CAAA,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IACzG;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,OAAA,EAAqD;AAElE,IAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,CAAiB,gBAAA,CAAiB,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC7D,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,gBAAA,CAAiB,mBAAA,CAAoB,QAAQ,QAAQ,CAAA;AAC3E,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,6BAAA,EAAgC,OAAA,CAAQ,QAAQ,CAAA,eAAA,EAAkB,IAAA,CAAK,IAAA,CAAK,QAAA,GAAW,GAAI,CAAC,CAAA,SAAA,CAAW,CAAA;AAAA,IACtI;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,MAAA,GAAS,CAAA,EAAG,OAAA,CAAQ,QAAQ,IAAI,SAAS,CAAA,CAAA;AAG/C,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,MAAM,KAAK,gBAAA,EAAiB;AAE1D,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,IAAA,CAAK,YAAA,EAAc,EAAE,QAAA,EAAU,OAAA,CAAQ,UAAU,MAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,CAAA;AAG5F,MAAA,MAAM,KAAK,iBAAA,CAAkB;AAAA,QAC3B,SAAA,EAAW,KAAK,gBAAA,IAAoB,SAAA;AAAA,QACpC,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAK,iBAAA,EAAkB;AAAA,QAC9B,IAAA,EAAM,YAAA;AAAA,QACN,OAAA,EAAS,CAAA,SAAA,EAAY,OAAA,CAAQ,QAAQ,GAAG,OAAA,CAAQ,SAAA,GAAY,CAAA,iBAAA,EAAoB,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAC,KAAK,EAAE,CAAA,CAAA;AAAA,QACxH,MAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,WAAW,OAAA,CAAQ,SAAA;AAAA,UACnB,KAAA,EAAO;AAAA;AACT,OACD,CAAA;AAGD,MAAA,IAAI,IAAA,CAAK,qBAAA,IAAyB,IAAA,CAAK,gBAAA,EAAkB;AACvD,QAAA,IAAA,CAAK,qBAAA,CAAsB,eAAA;AAAA,UACzB,IAAA,CAAK,gBAAA;AAAA,UACL,OAAA,CAAQ,QAAA;AAAA,UACR,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,MAAA;AAAO,SACzC;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,cAAA,EAAiB,OAAA,CAAQ,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAC,CAAA,CAAE,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MAC5G;AAGA,MAAA,IAAA,CAAK,gBAAA,CAAiB,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAA;AAGpD,MAAA,MAAM,KAAK,iBAAA,CAAkB;AAAA,QAC3B,SAAA,EAAW,KAAK,gBAAA,IAAoB,SAAA;AAAA,QACpC,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAK,iBAAA,EAAkB;AAAA,QAC9B,IAAA,EAAM,MAAA;AAAA,QACN,OAAA,EAAS,CAAA,6BAAA,EAAgC,OAAA,CAAQ,QAAQ,CAAA,CAAA;AAAA,QACzD,MAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,KAAA,EAAO;AAAA;AACT,OACD,CAAA;AAGD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,GAAA;AAC1C,MAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,SAAA,EAAW,SAAS,CAAA;AAG1D,MAAA,MAAM,KAAK,iBAAA,CAAkB;AAAA,QAC3B,SAAA,EAAW,KAAK,gBAAA,IAAoB,SAAA;AAAA,QACpC,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAK,iBAAA,EAAkB;AAAA,QAC9B,IAAA,EAAM,UAAA;AAAA,QACN,OAAA,EAAS,CAAA,UAAA,EAAa,OAAA,CAAQ,QAAQ,CAAA,YAAA,CAAA;AAAA,QACtC,MAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,KAAA,EAAO;AAAA;AACT,OACD,CAAA;AAGD,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,OAAA,CAAQ,WAAW,IAAA,CAAK,cAAA,CAAe,WAAA,CAAY,QAAQ,CAAA,CAAE,OAAA;AACrG,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,eAAA,EAAkB,OAAO,uBAAuB,OAAA,CAAQ,OAAO,qBAAqB,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,UAAA,EAAa,IAAA,CAAK,eAAe,WAAA,CAAY,QAAQ,EAAE,OAAO,CAAA,CAAA,CAAG,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAG3M,MAAA,MAAM,SAAS,MAAM,IAAI,OAAA,CAAa,CAAC5C,UAAS,MAAA,KAAW;AACzD,QAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,UAAA,MAAA,CAAO,IAAI,gBAAgB,CAAA,WAAA,EAAc,OAAA,CAAQ,QAAQ,CAAA,kBAAA,EAAqB,OAAO,IAAI,CAAC,CAAA;AAAA,QAC5F,GAAG,OAAO,CAAA;AAEV,QAAA,IAAA,CAAK,oBAAoB,MAAA,EAAQ;AAAA,UAC/B,MAAM,OAAA,CAAQ,QAAA;AAAA,UACd,SAAA,EAAW,OAAA,CAAQ,SAAA,IAAa;AAAC,SACnC,EAAG,OAAO,CAAA,CACP,IAAA,CAAK,CAAA,CAAA,KAAK;AAAE,UAAA,YAAA,CAAa,KAAK,CAAA;AAAG,UAAAA,SAAQ,CAAC,CAAA;AAAA,QAAG,CAAC,CAAA,CAC9C,KAAA,CAAM,CAAA,CAAA,KAAK;AAAE,UAAA,YAAA,CAAa,KAAK,CAAA;AAAG,UAAA,MAAA,CAAO,CAAC,CAAA;AAAA,QAAG,CAAC,CAAA;AAAA,MACnD,CAAC,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG9B,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAG7C,MAAA,MAAM,KAAK,iBAAA,CAAkB;AAAA,QAC3B,SAAA,EAAW,KAAK,gBAAA,IAAoB,SAAA;AAAA,QACpC,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAK,iBAAA,EAAkB;AAAA,QAC9B,IAAA,EAAM,aAAA;AAAA,QACN,SAAS,CAAA,EAAG,OAAA,CAAQ,QAAQ,CAAA,yBAAA,EAA4B,QAAQ,MAAM,OAAA,CAAQ,MAAA,GAAS,MAAM,CAAA,aAAA,EAAgB,OAAA,CAAQ,UAAU,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAA,GAAQ,CAAA,aAAA,EAAgB,OAAO,CAAA,CAAE,CAAA,CAAA;AAAA,QACvK,MAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,QAAA;AAAA,UACA,OAAA,EAAS,IAAA;AAAA,UACT,gBAAgB,OAAA,CAAQ,MAAA;AAAA,UACxB,KAAA,EAAO;AAAA;AACT,OACD,CAAA;AAGD,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,kBAAA,CAAmB,OAAO,CAAA;AACrD,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,IAAA,CAAK,gBAAA,CAAiB,eAAA,CAAgB,aAAA,CAAc,SAAA,EAAW,cAAc,SAAS,CAAA;AAAA,MACxF;AAEA,MAAA,MAAM,QAAA,GAA6B;AAAA,QACjC,MAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA,EAAS,IAAA;AAAA,QACT,QAAA;AAAA,QACA,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,MAAA,EAAQ;AAAA,OACV;AAGA,MAAA,IAAI,IAAA,CAAK,qBAAA,IAAyB,IAAA,CAAK,gBAAA,EAAkB;AACvD,QAAA,IAAA,CAAK,qBAAA,CAAsB,kBAAA;AAAA,UACzB,IAAA,CAAK,gBAAA;AAAA,UACL,OAAA,CAAQ,QAAA;AAAA,UACR,QAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,iBAAiB,QAAQ,CAAA;AAEnC,MAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,QAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,QAAQ,CAAA,EAAA,CAAI,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MAC1E;AAEA,MAAA,OAAO,QAAA;AAAA,IAET,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AAEpC,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAG9B,MAAA,MAAM,KAAK,iBAAA,CAAkB;AAAA,QAC3B,SAAA,EAAW,KAAK,gBAAA,IAAoB,SAAA;AAAA,QACpC,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,KAAK,iBAAA,EAAkB;AAAA,QAC9B,IAAA,EAAM,OAAA;AAAA,QACN,OAAA,EAAS,CAAA,EAAG,OAAA,CAAQ,QAAQ,CAAA,cAAA,EAAiB,QAAQ,CAAA,IAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,QAClH,MAAA;AAAA,QACA,QAAA,EAAU;AAAA,UACR,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,QAAA;AAAA,UACA,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,UAC5D,KAAA,EAAO;AAAA;AACT,OACD,CAAA;AAGD,MAAA,IAAI,IAAA,CAAK,qBAAA,IAAyB,IAAA,CAAK,gBAAA,EAAkB;AACvD,QAAA,IAAA,CAAK,qBAAA,CAAsB,kBAAA;AAAA,UACzB,IAAA,CAAK,gBAAA;AAAA,UACL,OAAA,CAAQ,QAAA;AAAA,UACR,QAAA;AAAA,UACA,KAAA;AAAA,UACA,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SACvD;AAAA,MACF;AAEA,MAAA,IAAA,CAAK,IAAA,CAAK,cAAc,EAAE,QAAA,EAAU,QAAQ,QAAA,EAAU,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,CAAA;AAE/E,MAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uBAAA,EAA0B,QAAQ,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAC,CAAA,CAAE,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACrI;AAEA,MAAA,MAAM,IAAI,YAAA;AAAA,QACR,qBAAqB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,QAC3E,EAAE,IAAA,EAAM,OAAA,CAAQ,QAAA,EAAU,UAAU,SAAA,EAAU;AAAA,QAC9C,gBAAA;AAAA,QACA;AAAA,UACE,IAAA,EAAA,2BAAA;AAAA,UACA,KAAA,EAAO,KAAA;AAAA,UACP,QAAA,EAAU,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA;AAAU;AAC3C,OACF;AAAA,IACF,CAAA,SAAE;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,KAAA,EAAM;AAAA,MACrB,SAAS,YAAA,EAAc;AAErB,QAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,UAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,YAAY,CAAA;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,GAAiC;AAErC,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,MAAM,KAAK,gBAAA,EAAiB;AAE1D,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,GAAA;AAC1C,MAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,SAAA,EAAW,SAAS,CAAA;AAC1D,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,SAAA,CAAU,KAAA,CAAA,EAAW,EAAE,OAAA,EAAS,SAAA,EAAW,sBAAA,EAAwB,IAAA,EAAM,CAAA;AAErG,MAAA,OAAO,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,QAC/B,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,WAAA,EAAa,KAAK,WAAA,IAAe,EAAA;AAAA,QACjC,aAAa,IAAA,CAAK;AAAA,OACpB,CAAE,CAAA;AAAA,IACJ,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,sBAAA,EAAyB,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,EAAI,KAAc,CAAA;AAAA,IAChI,CAAA,SAAE;AACA,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,KAAA,EAAM;AAAA,MACrB,SAAS,YAAA,EAAc;AACrB,QAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,UAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,YAAY,CAAA;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAA,GAA6E;AAE3E,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,kBAAA,GAAqB,IAAA,CAAK,sBAAA,EAAwB;AAE/D,MAAA,IAAA,CAAK,cAAA,EAAe,CAAE,IAAA,CAAK,MAAM;AAC/B,QAAA,IAAA,CAAK,kBAAA,GAAqB,GAAA;AAAA,MAC5B,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAEf,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,GAAyB;AAC7B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,WAAA,GAAuB;AAErB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,SAAA,GAAiB;AACf,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAK,mBAAA,EAAoB;AAAA,MAChC,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAI,GAAK,KAAK,cAAA,CAAuB,SAAA;AAAA,MAClD,oBAAA,EAAuB,IAAA,CAAK,gBAAA,CAAyB,YAAA,IAAgB,CAAA;AAAA,MACrE,gBAAA,EAAmB,IAAA,CAAK,gBAAA,CAAyB,UAAA,IAAc,CAAA;AAAA,MAC/D,eAAA,EAAiB,GAAA;AAAA,MACjB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,YAAA,EAAoC;AACxD,IAAA,MAAM,MAAA,GAAS,eAAe,qBAAA,EAAsB;AACpD,IAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,YAAY,CAAA;AAErD,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,uBAAA,EAA0B,YAAY,CAAA,CAAA,EAAI,YAAY,IAAI,CAAA;AAAA,IACzF;AAEA,IAAA,OAAO;AAAA,MACL,GAAG,IAAA;AAAA,MACH,MAAA,EAAQ,IAAA,CAAK,WAAA,EAAY,GAAI,WAAA,GAAc,aAAA;AAAA,MAC3C,WAAA,EAAa;AAAA,QACX,eAAA,EAAiB,GAAA;AAAA,QACjB,WAAA,EAAa;AAAA;AACf,KACF;AAAA,EACF;AAAA,EAEA,WAAW,QAAA,EAAwC;AACjD,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,WAAA,CAAY,QAAQ,CAAA;AAAA,EAClD;AAAA,EAEA,aAAA,CAAc,QAAiB,QAAA,EAAqB;AAClD,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,aAAA,CAAc,MAAA,EAAW,QAAQ,QAAQ,CAAA;AAAA,EACtE;AAAA,EAEA,WAAW,SAAA,EAAwB;AACjC,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,UAAA,CAAW,SAAS,CAAA;AAAA,EACjD;AAAA,EAEA,oBAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,eAAe,aAAA,EAAc;AAAA,EAC3C;AAAA,EAEA,kBAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,iBAAiB,SAAA,EAAU;AAAA,EACzC;AAAA,EAEA,iBAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,cAAA;AAAA,EACd;AAAA,EAEA,kBAAA,CAAmB,WAAmB,KAAA,EAAqB;AACzD,IAAA,IAAA,CAAK,cAAA,CAAe,kBAAA,CAAmB,SAAA,EAAW,KAAK,CAAA;AAAA,EACzD;AAAA,EAEA,WAAW,SAAA,EAAyB;AAClC,IAAA,IAAA,CAAK,cAAA,CAAe,WAAW,SAAS,CAAA;AAAA,EAC1C;AAAA,EAEA,OAAA,GAAgB;AAEd,IAAA,IAAI,KAAK,qBAAA,EAAuB;AAC9B,MAAA,IAAA,CAAK,sBAAsB,OAAA,EAAQ;AAAA,IACrC;AAEA,IAAA,IAAA,CAAK,UAAA,EAAW,CAAE,KAAA,CAAM,MAAM;AAAA,IAE9B,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,uBAAuB,SAAA,EAAmC;AAC9D,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAC/B,MAAA,MAAM,IAAI,MAAM,iFAAiF,CAAA;AAAA,IACnG;AAEA,IAAA,MAAM,eAAA,GAAkB,aAAa,IAAA,CAAK,gBAAA;AAC1C,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,MAAM,IAAI,MAAM,gDAAgD,CAAA;AAAA,IAClE;AAEA,IAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,WAAA,CAAY,eAAe,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,SAAA,EAAmC;AAC7D,IAAA,IAAI,CAAC,KAAK,qBAAA,EAAuB;AAEjC,IAAA,MAAM,eAAA,GAAkB,aAAa,IAAA,CAAK,gBAAA;AAC1C,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,UAAA,CAAW,eAAe,CAAA;AAAA,IAC7D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,CAAqB,iBAAyB,eAAA,EAAgC;AAC5E,IAAA,IAAI,IAAA,CAAK,qBAAA,IAAyB,IAAA,CAAK,gBAAA,EAAkB;AACvD,MAAA,IAAA,CAAK,qBAAA,CAAsB,oBAAA;AAAA,QACzB,IAAA,CAAK,gBAAA;AAAA,QACL,eAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,eAAA,EAA+B;AACrD,IAAA,IAAI,IAAA,CAAK,qBAAA,IAAyB,IAAA,CAAK,gBAAA,EAAkB;AACvD,MAAA,IAAA,CAAK,qBAAA,CAAsB,uBAAA;AAAA,QACzB,IAAA,CAAK,gBAAA;AAAA,QACL;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAA,GAA8D;AAC5D,IAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAA,GAA2B;AACzB,IAAA,IAAI,CAAC,IAAA,CAAK,qBAAA,IAAyB,CAAC,KAAK,gBAAA,EAAkB;AACzD,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,UAAA,CAAW,IAAA,CAAK,gBAAgB,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKA,yBAAA,GAAqC;AACnC,IAAA,IAAI,CAAC,IAAA,CAAK,qBAAA,IAAyB,CAAC,KAAK,gBAAA,EAAkB;AACzD,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,WAAA,CAAY,IAAA,CAAK,gBAAgB,CAAA;AAAA,EACrE;AAAA,EAEA,EAAA,CAAG,OAAe,QAAA,EAA0B;AAC1C,IAAA,IAAI,CAAC,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AAAA,IAClC;AACA,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA,CAAG,KAAK,QAAQ,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAA4B;AAClC,IAAA,OAAO,EAAE,IAAA,CAAK,YAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAkB,KAAA,EAAqC;AACnE,IAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,MAAA,MAAM,IAAA,CAAK,eAAA,CAAgB,oBAAA,CAAqB,KAAK,CAAA;AAAA,IACvD;AAAA,EACF;AAAA,EAEQ,IAAA,CAAK,OAAe,IAAA,EAAkB;AAC5C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AAC7C,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,QAAA,CAAS,QAAQ,CAAA,OAAA,KAAW;AAC1B,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,QACd,SAAS,KAAA,EAAO;AACd,UAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,YAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,2BAAA,EAA8B,KAAK,KAAK,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAC,CAAA,CAAE,CAAA,CAAE,MAAM,CAAA,GAAA,KAAO;AAAA,YAEjI,CAAC,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF,CAAC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAGA,MAAc,oBAAA,GAAsC;AAClD,IAAA,MAAM,UAAA,GAAa,KAAK,OAAA,CAAQ,UAAA;AAEhC,IAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,4BAAA,EAA+B,UAAU,CAAA,CAAE,CAAA,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IAC/E;AAIA,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,kBAAA,CAAmB,UAAU,CAAA;AAE7D,IAAA,IAAI,YAAA,CAAa,SAAS,YAAA,EAAc;AAEtC,MAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,uCAAA,EAA0C,YAAA,CAAa,OAAO,CAAA,CAAA,EAAI,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACnI;AAIA,MAAA,MAAM,SAAA,GAAY;AAAA;AAAA,QAEhB,gBAAA,EAAkB,GAAA;AAAA,QAClB,aAAA,EAAe,OAAA;AAAA;AAAA,QAEf,GAAG,YAAA,CAAa;AAAA,OAClB;AAEA,MAAA,IAAA,CAAK,SAAA,GAAY,IAAI6C,6BAAA,CAAqB;AAAA,QACxC,SAAS,YAAA,CAAa,OAAA;AAAA,QACtB,IAAA,EAAM,YAAA,CAAa,IAAA,IAAQ,EAAC;AAAA,QAC5B,MAAA,EAAQ,MAAA;AAAA;AAAA,QACR,GAAA,EAAK;AAAA,OACN,CAAA;AAGD,MAAA,IAAA,CAAK,kBAAA,CAAmB,KAAK,SAAS,CAAA;AAAA,IACxC,CAAA,MAAA,IAAW,YAAA,CAAa,IAAA,KAAS,KAAA,EAAO;AAEtC,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,wCAAA,EAA2C,UAAU,CAAA,CAAE,CAAA;AAAA,IACtF,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,wBAAA,EAA2B,UAAU,CAAA,CAAE,CAAA;AAAA,IACtE;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,UAAA,EAA8H;AAC7J,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAK,GAAI,MAAM,uBAAA,CAAwB,eAAA;AAAA,QAC9D,UAAA;AAAA,QACA,KAAK,OAAA,CAAQ;AAAA,OACf;AAEA,MAAA,IAAA,CAAK,OAAO,KAAA,CAAM,CAAA,iBAAA,EAAoB,UAAU,CAAA,oBAAA,CAAsB,CAAA,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACtF,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,OAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAK,MAAA,CAAO;AAAA,OACd;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,CAAA,sCAAA,EAAyC,KAAK,CAAA,CAAE,CAAA,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACpF,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,CAAA,4CAAA,CAA8C,CAAA,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAGlF,MAAA,MAAM,YAAA,GAAoC;AAAA,QACxC,eAAA,EAAiB;AAAA,UACf,IAAA,EAAM,YAAA;AAAA,UACN,OAAA,EAAS,uBAAA;AAAA;AAAA,UACT,MAAM;AAAC;AACT,OACF;AAEA,MAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,QAAA,MAAM,MAAA,GAAS,aAAa,UAAU,CAAA;AAEtC,QAAA,IAAI,MAAA,CAAO,SAAS,YAAA,EAAc;AAChC,UAAA,MAAM,aAAA,GAAgB,MAAM,IAAA,CAAK,kBAAA,CAAmB,OAAO,OAAO,CAAA;AAClE,UAAA,IAAI,CAAC,aAAA,EAAe;AAClB,YAAA,MAAM,IAAI,kBAAA;AAAA,cACR,CAAA,YAAA,EAAe,OAAO,OAAO,CAAA,8EAAA,CAAA;AAAA,cAC7B,MAAA;AAAA,cACA,MAAA;AAAA,cACA;AAAA,gBACE,mBAAA,EAAqB;AAAA,kBACnB,kEAAA;AAAA,kBACA,sEAAA;AAAA,kBACA,8CAAA;AAAA,kBACA,iEAAA;AAAA,kBACA;AAAA;AACF;AACF,aACF;AAAA,UACF;AAAA,QACF;AACA,QAAA,OAAO,MAAA;AAAA,MACT;AAGA,MAAA,MAAM,aAAA,GAAgB;AAAA,QACpB,GAAG,UAAU,CAAA,CAAA;AAAA;AAAA,QACb,kBAAkB,UAAU,CAAA,CAAA;AAAA,QAC5B1C,yBAAK,OAAA,CAAQzD,qBAAAA,CAAG,SAAQ,EAAG,CAAA,WAAA,EAAc,UAAU,CAAA,CAAE,CAAA;AAAA,QACrDyD,wBAAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,gBAAA,IAAoB,QAAQ,GAAA,EAAI,EAAG,CAAA,EAAG,UAAU,CAAA,CAAE;AAAA,OAC9E;AAEA,MAAA,KAAA,MAAW,cAAc,aAAA,EAAe;AACtC,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,MAAMC,eAAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAC9C,UAAA,IAAI,KAAA,CAAM,QAAO,EAAG;AAClB,YAAA,OAAO;AAAA,cACL,IAAA,EAAM,YAAA;AAAA,cACN,OAAA,EAAS,UAAA;AAAA,cACT,MAAM;AAAC,aACT;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,iBAAiB,UAAU,CAAA,qFAAA;AAAA,OAC7B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,OAAA,EAAmC;AAClE,IAAA,OAAO,IAAI,OAAA,CAAQ,CAACJ,QAAAA,KAAY;AAC9B,MAAA,MAAM,YAAA,GAAe8C,mBAAA,CAAM,OAAA,EAAS,CAAC,OAAO,CAAA,EAAG;AAAA,QAC7C,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA,OACjC,CAAA;AAED,MAAA,YAAA,CAAa,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AACjC,QAAA9C,QAAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,MACpB,CAAC,CAAA;AAED,MAAA,YAAA,CAAa,EAAA,CAAG,SAAS,MAAM;AAC7B,QAAAA,SAAQ,KAAK,CAAA;AAAA,MACf,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,gBAAA,GAAiF;AAC7F,IAAA,IAAI,SAAA;AAGJ,IAAA,IAAI,IAAA,CAAK,QAAQ,UAAA,EAAY;AAE3B,MAAA,MAAM,eAAe,MAAM,IAAA,CAAK,kBAAA,CAAmB,IAAA,CAAK,QAAQ,UAAU,CAAA;AAC1E,MAAA,IAAI,YAAA,CAAa,SAAS,YAAA,EAAc;AAEtC,QAAA,MAAM,SAAA,GAAY;AAAA;AAAA,UAEhB,gBAAA,EAAkB,GAAA;AAAA,UAClB,aAAA,EAAe,OAAA;AAAA;AAAA,UAEf,GAAG,YAAA,CAAa;AAAA,SAClB;AAEA,QAAA,SAAA,GAAY,IAAI6C,6BAAA,CAAqB;AAAA,UACnC,SAAS,YAAA,CAAa,OAAA;AAAA,UACtB,IAAA,EAAM,YAAA,CAAa,IAAA,IAAQ,EAAC;AAAA,UAC5B,MAAA,EAAQ,MAAA;AAAA;AAAA,UACR,GAAA,EAAK;AAAA,SACN,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,yBAAA,EAA4B,YAAA,CAAa,IAAI,CAAA,CAAE,CAAA;AAAA,MAC9E;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,UAAA,GAAa,KAAK,OAAA,CAAQ,UAAA;AAChC,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,QAAA,CAAS,KAAK,CAAA;AAG1C,MAAA,MAAM,SAAA,GAAY;AAAA;AAAA,QAEhB,gBAAA,EAAkB,GAAA;AAAA,QAClB,aAAA,EAAe,OAAA;AAAA;AAAA,QAEf,GAAG,KAAK,OAAA,CAAQ;AAAA,OAClB;AAEA,MAAA,SAAA,GAAY,IAAIA,6BAAA,CAAqB;AAAA,QACnC,OAAA,EAAS,WAAW,QAAA,GAAW,UAAA;AAAA,QAC/B,IAAA,EAAM,QAAA,GAAW,CAAC,UAAU,IAAI,EAAC;AAAA,QACjC,MAAA,EAAQ,MAAA;AAAA;AAAA,QACR,GAAA,EAAK;AAAA,OACN,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,MAAA,GAAS,IAAIE,eAAA,CAAO;AAAA,MACxB,IAAA,EAAM,cAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX,EAAG;AAAA,MACD,YAAA,EAAc;AAAA,QACZ,OAAO;AAAC;AACV;AAAA,KAED,CAAA;AAGD,IAAA,IAAA,CAAK,mBAAmB,SAAS,CAAA;AAEjC,IAAA,OAAO,EAAE,WAAW,MAAA,EAAO;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,mBAAA,CACZ,MAAA,EACA,WAAA,EACA,SAAA,EACA,UAAkB,CAAA,EACJ;AACd,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,8BAAA,EAAiC,WAAA,CAAY,IAAI,CAAA,MAAA,EAAS,SAAS,CAAA,oBAAA,EAAuB,OAAO,CAAA,CAAA,CAAG,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACtI,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC/C,QAAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AACpC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,2CAAA,EAA8C,WAAA,CAAY,IAAI,CAAA,OAAA,EAAU,cAAc,CAAA,aAAA,EAAgB,SAAS,CAAA,GAAA,CAAK,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AACtJ,QAAA,MAAA,CAAO,IAAI,gBAAgB,CAAA,WAAA,EAAc,WAAA,CAAY,IAAI,CAAA,kBAAA,EAAqB,SAAS,IAAI,CAAC,CAAA;AAAA,MAC9F,GAAG,SAAS,CAAA;AAoBZ,MAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,KAAkB;AAE1C,QAAA,MAAMgD,UAAS,YAAA,EAAa;AAC5B,QAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,gBAAA,EAAmB,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA,CAAE,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAE1E,QAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AAItB,UAAA,+BAAA,CAAgC,yBAAyB,QAAQ,CAAA;AAAA,QACnE;AAGA,QAAA,IAAI;AACF,UAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,IAAA,EAAM;AACrD,YAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,QAAA,IAAY,QAAA,CAAS,OAAA,IAAW,CAAA;AAC/D,YAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,EAAA;AAGpC,YAAA,IAAA,CAAK,KAAK,UAAA,EAAY;AAAA,cACpB,UAAU,WAAA,CAAY,IAAA;AAAA,cACtB,QAAA,EAAU,aAAA;AAAA,cACV,OAAA;AAAA,cACA,SAAA,sBAAe,IAAA,EAAK;AAAA,cACpB,IAAA,EAAM;AAAA,aACP,CAAA;AAAA,UACH;AAAA,QACF,SAAS,KAAA,EAAO;AAEd,UAAA,IAAI,IAAA,CAAK,QAAQ,KAAA,EAAO;AACtB,YAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,wCAAA,EAA2C,KAAK,CAAA,CAAE,CAAA;AAAA,UACtE;AAAA,QACF;AAAA,MACF,CAAA;AAGA,MAAA,MAAM,cAAA,GAAiB;AAAA,QACrB,OAAA,EAAS,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,IAAK,CAAA;AAAA;AAAA,QAClC,sBAAA,EAAwB,IAAA;AAAA,QACxB,UAAA,EAAY,gBAAA;AAAA,QACZ,iBAAiB,SAAA,GAAW;AAAA,OAC9B;AAEA,MAAA,MAAA,CAAO,SAAS,WAAA,EAAa,MAAA,EAAW,cAAc,CAAA,CACnD,KAAK,CAAA,MAAA,KAAU;AACd,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AACpC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,+BAAA,EAAkC,WAAA,CAAY,IAAI,OAAO,cAAc,CAAA,EAAA,CAAI,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAC7G,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAAhD,SAAQ,MAAM,CAAA;AAAA,MAChB,CAAC,CAAA,CACA,KAAA,CAAM,OAAM,KAAA,KAAS;AACpB,QAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AACpC,QAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,+BAAA,EAAkC,WAAA,CAAY,IAAI,CAAA,OAAA,EAAU,cAAc,CAAA,IAAA,EAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA,CAAE,MAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAClI,QAAA,YAAA,CAAa,KAAK,CAAA;AAGlB,QAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,CAAS,OAAO,KAAK,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,mBAAmB,CAAA,EAAG;AAClF,UAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,8DAAA,CAAgE,CAAA,CAAE,MAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AAElG,UAAA,IAAI,UAAU,CAAA,EAAG;AACf,YAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,SAAA,EAAY,WAAA,CAAY,IAAI,CAAA,UAAA,EAAa,OAAA,GAAU,CAAC,CAAA,IAAA,CAAM,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,YAAC,CAAC,CAAA;AAG5F,YAAA,IAAI;AACF,cAAA,MAAM,EAAE,WAAW,YAAA,EAAc,MAAA,EAAQ,WAAU,GAAI,MAAM,KAAK,gBAAA,EAAiB;AACnF,cAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,SAAA,EAAW,YAAA,EAAc,GAAM,CAAA;AAG7D,cAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,mBAAA,CAAoB,WAAW,WAAA,EAAa,SAAA,EAAW,UAAU,CAAC,CAAA;AACjG,cAAAA,SAAQ,WAAW,CAAA;AACnB,cAAA;AAAA,YACF,SAAS,UAAA,EAAY;AACnB,cAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,cAAA,EAAiB,OAAA,GAAU,CAAC,CAAA,SAAA,EAAY,UAAA,CAAW,OAAO,CAAA,CAAE,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,cAAC,CAAC,CAAA;AAC9F,cAAA,MAAA,CAAO,UAAU,CAAA;AACjB,cAAA;AAAA,YACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,+BAAA,EAAkC,WAAA,CAAY,IAAI,CAAA,CAAE,CAAA,CAAE,MAAM,MAAM;AAAA,YAAC,CAAC,CAAA;AAAA,UACxF;AAAA,QACF;AAEA,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd,CAAC,CAAA;AAAA,IACL,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAA,CACZ,MAAA,EACA,SAAA,EACA,SAAA,EACe;AACf,IAAA,OAAO,IAAI,OAAA,CAAQ,CAACA,QAAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,QAAA,MAAA,CAAO,IAAI,eAAA,CAAgB,CAAA,+BAAA,EAAkC,SAAS,IAAI,CAAC,CAAA;AAAA,MAC7E,GAAG,SAAS,CAAA;AAEZ,MAAA,MAAA,CAAO,QAAQ,SAAA,EAAW;AAAA,QACxB,OAAA,EAAS,SAAA;AAAA,QACT,sBAAA,EAAwB;AAAA;AAAA,OAEzB,CAAA,CACE,IAAA,CAAK,MAAM;AACV,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAAA,QAAAA,EAAQ;AAAA,MACV,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,KAAA,KAAS;AACd,QAAA,YAAA,CAAa,KAAK,CAAA;AAClB,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd,CAAC,CAAA;AAAA,IACL,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBAAmB,SAAA,EAAuC;AAChE,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AACzB,MAAA,MAAMH,UAAU,SAAA,CAAkB,MAAA;AAClC,MAAA,MAAMC,SAAS,SAAA,CAAkB,KAAA;AACjC,MAAA,IAAI,MAAA,EAAQ;AAEV,QAAA,MAAMmD,aAAY,YAAA,EAAa;AAG/B,QAAA,MAAA,CAAO,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB;AACnC,UAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,EAAS,CAAE,IAAA,EAAK;AACtC,UAAA,IAAI,OAAA,EAAS;AAEX,YAAAA,UAAAA,CAAU,MAAM,CAAA,aAAA,EAAgB,OAAO,IAAI,KAAK,CAAA,CAAE,MAAM,MAAM;AAAA,YAE9D,CAAC,CAAA;AAAA,UACH;AAAA,QACF,CAAC,CAAA;AAGD,QAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAa;AAC/B,UAAA,MAAM,IAAA,GAAO,GAAA,EAAK,OAAA,IAAW,MAAA,CAAO,GAAG,CAAA;AACvC,UAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,UAAA,MAAM,gBAAA,GAAmB,CAAC,OAAA,EAAS,aAAA,EAAe,cAAc,gBAAA,EAAkB,mBAAA,EAAqB,0BAA0B,CAAA,CAC9H,IAAA,CAAK,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AAC9B,UAAA,MAAM,MAAA,GAAS,mBAAmB,0BAAA,GAA6B,4BAAA;AAC/D,UAAAA,UAAAA,CAAU,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AAAA,QAE5D,CAAC,CAAA;AAAA,MACH;AAGA,MAAA,IAAIpD,OAAAA,IAAU,OAAOA,OAAAA,CAAO,EAAA,KAAO,UAAA,EAAY;AAC7C,QAAAA,OAAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAa;AAC/B,UAAA,MAAM,OAAA,GAAU,GAAA,EAAK,OAAA,IAAW,MAAA,CAAO,GAAG,CAAA;AAC1C,UAAA,SAAA,CAAU,MAAM,CAAA,2BAAA,EAA8B,OAAO,IAAI,KAAK,CAAA,CAAE,MAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AAAA,QAChF,CAAC,CAAA;AAAA,MACH;AACA,MAAA,IAAIC,MAAAA,IAAS,OAAOA,MAAAA,CAAM,EAAA,KAAO,UAAA,EAAY;AAC3C,QAAAA,MAAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAa;AAC9B,UAAA,MAAM,OAAA,GAAU,GAAA,EAAK,OAAA,IAAW,MAAA,CAAO,GAAG,CAAA;AAC1C,UAAA,SAAA,CAAU,MAAM,CAAA,0BAAA,EAA6B,OAAO,IAAI,KAAK,CAAA,CAAE,MAAM,MAAM;AAAA,UAAC,CAAC,CAAA;AAAA,QAC/E,CAAC,CAAA;AAAA,MACH;AAGA,MAAA,MAAM,YAAA,GAAoB,SAAA;AAC1B,MAAA,MAAM,KAAA,GAAa,YAAA,EAAc,KAAA,IAAS,YAAA,EAAc,WAAW,YAAA,EAAc,MAAA;AACjF,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAI;AACF,UAAA,KAAA,CAAM,EAAA,GAAK,OAAA,EAAS,CAAC,GAAA,KAAa;AAChC,YAAA,MAAM,OAAA,GAAU,GAAA,EAAK,OAAA,IAAW,MAAA,CAAO,GAAG,CAAA;AAC1C,YAAA,MAAM,KAAA,GAAQ,QAAQ,WAAA,EAAY;AAClC,YAAA,MAAM,gBAAA,GAAmB,CAAC,OAAA,EAAS,aAAA,EAAe,cAAc,gBAAA,EAAkB,mBAAA,EAAqB,0BAA0B,CAAA,CAC9H,IAAA,CAAK,CAAA,CAAA,KAAK,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,CAAA;AAC9B,YAAA,MAAM,MAAA,GAAS,mBAAmB,gCAAA,GAAmC,2BAAA;AACrE,YAAA,SAAA,CAAU,KAAA,CAAM,GAAG,MAAM,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,YAAC,CAAC,CAAA;AAAA,UAC/D,CAAC,CAAA;AAED,UAAA,KAAA,CAAM,KAAA,EAAO,EAAA,GAAK,OAAA,EAAS,CAAC,QAAa,SAAA,CAAU,KAAA,CAAM,CAAA,0BAAA,EAA6B,GAAA,EAAK,WAAW,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,MAAM,MAAM;AAAA,UAAC,CAAC,CAAC,CAAA;AACnI,UAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,GAAK,OAAA,EAAS,CAAC,QAAa,SAAA,CAAU,KAAA,CAAM,CAAA,2BAAA,EAA8B,GAAA,EAAK,WAAW,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,MAAM,MAAM;AAAA,UAAC,CAAC,CAAC,CAAA;AACrI,UAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,GAAK,OAAA,EAAS,CAAC,QAAa,SAAA,CAAU,KAAA,CAAM,CAAA,2BAAA,EAA8B,GAAA,EAAK,WAAW,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,MAAM,MAAM;AAAA,UAAC,CAAC,CAAC,CAAA;AAAA,QACvI,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AAAA,IAGhB;AAAA,EACF;AAAA,EAEA,MAAc,cAAA,GAAgC;AAC5C,IAAA,MAAM,EAAE,SAAA,EAAW,MAAA,EAAO,GAAI,MAAM,KAAK,gBAAA,EAAiB;AAE1D,IAAA,IAAI;AAEF,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,GAAA;AAC1C,MAAA,MAAM,IAAA,CAAK,kBAAA,CAAmB,MAAA,EAAQ,SAAA,EAAW,SAAS,CAAA;AAE1D,MAAA,MAAM,MAAA,CAAO,UAAU,KAAA,CAAA,EAAW;AAAA,QAChC,OAAA,EAAS,SAAA;AAAA,QACT,sBAAA,EAAwB;AAAA;AAAA,OAEzB,CAAA;AAAA,IACH,CAAA,SAAE;AACA,MAAA,IAAI;AACF,QAAA,MAAM,OAAO,KAAA,EAAM;AAAA,MACrB,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAkB,MAAA,EAAqB;AAC7C,IAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,IAAI,MAAA,IAAU,OAAO,MAAA,KAAW,QAAA,EAAU;AAExC,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,OAAO,KAAA,CAAM,QAAQ,MAAA,CAAO,OAAO,IAC/B,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,OAAO,CAAA,KAAM,WAAW,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA,GAChF,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA;AAAA,MAC3B;AAEA,MAAA,IAAI,OAAO,IAAA,EAAM;AACf,QAAA,OAAO,MAAA,CAAO,IAAA;AAAA,MAChB;AAEA,MAAA,OAAO,IAAA,CAAK,UAAU,MAAM,CAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,OAAO,MAAM,CAAA;AAAA,EACtB;AAAA,EAEQ,mBAAmB,OAAA,EAAgE;AAEzF,IAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,KAAA,CAAM,iCAAiC,CAAA;AACtE,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,uDAAuD,CAAA;AAExF,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,SAAA,GAAY,QAAA,CAAS,cAAA,CAAe,CAAC,CAAC,CAAA;AAC5C,MAAA,IAAI,YAAY,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,IAAO,CAAA;AAE7C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,GAAG,KAAA,EAAO,OAAA,EAAS,IAAI,CAAA,GAAI,UAAA;AACjC,QAAA,IAAI,IAAA,GAAO,SAAS,KAAK,CAAA;AACzB,QAAA,MAAM,MAAA,GAAS,SAAS,OAAO,CAAA;AAE/B,QAAA,IAAI,IAAA,EAAM;AACR,UAAA,IAAI,IAAA,CAAK,WAAA,EAAY,KAAM,IAAA,IAAQ,SAAS,EAAA,EAAI;AAC9C,YAAA,IAAA,IAAQ,EAAA;AAAA,UACV,WAAW,IAAA,CAAK,WAAA,EAAY,KAAM,IAAA,IAAQ,SAAS,EAAA,EAAI;AACrD,YAAA,IAAA,GAAO,CAAA;AAAA,UACT;AAAA,QACF;AAEA,QAAA,SAAA,uBAAgB,IAAA,EAAK;AACrB,QAAA,SAAA,CAAU,QAAA,CAAS,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,CAAC,CAAA;AAGrC,QAAA,IAAI,SAAA,CAAU,OAAA,EAAQ,IAAK,IAAA,CAAK,KAAI,EAAG;AACrC,UAAA,SAAA,CAAU,OAAA,CAAQ,SAAA,CAAU,OAAA,EAAQ,GAAI,CAAC,CAAA;AAAA,QAC3C;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,WAAW,SAAA,EAAU;AAAA,IAChC;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKO,IAAM,qBAAN,MAAyB;AAAA,EACtB,YAAgC,EAAC;AAAA,EACjC,gBAAA,GAA6B;AAAA,IACnC,+CAAA;AAAA,IACA,4CAAA;AAAA,IACA;AAAA,GACF;AAAA,EAEQ,cAAA,GAA2B;AAAA,IACjC,0CAAA;AAAA,IACA,sCAAA;AAAA,IACA;AAAA,GACF;AAAA,EAEA,YAAY,QAAA,EAAwC;AAClD,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,QAAQ,CAAA;AAC5B,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AAC7C,MAAA,IAAI,QAAQ,EAAA,EAAI;AACd,QAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,MAChC;AAAA,IACF,CAAA;AAAA,EACF;AAAA,EAEA,MAAM,qBAAqB,KAAA,EAA+B;AACxD,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAA;AAEnD,MAAA,KAAA,MAAW,QAAA,IAAY,KAAK,SAAA,EAAW;AACrC,QAAA,IAAI;AACF,UAAA,MAAM,SAAS,aAAa,CAAA;AAAA,QAC9B,SAAS,KAAA,EAAO;AAEd,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,yBAAA,EAA4B,KAAK,CAAA,CAAE,CAAA;AAAA,QACnD;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,iCAAA,EAAoC,KAAK,CAAA,CAAE,CAAA;AAAA,IAC3D;AAAA,EACF;AAAA,EAEQ,aAAa,SAAA,EAA2B;AAC9C,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,OAAA,EAAS,YAAA;AAAA,MACT,UAAA,EAAY,aAAA;AAAA,MACZ,UAAA,EAAY,UAAA;AAAA,MACZ,OAAA,EAAS,OAAA;AAAA,MACT,OAAA,EAAS,OAAA;AAAA,MACT,SAAA,EAAW,MAAA;AAAA,MACX,YAAA,EAAc,YAAA;AAAA;AAAA,MACd,aAAA,EAAe;AAAA;AAAA,KACjB;AACA,IAAA,OAAO,OAAA,CAAQ,SAAS,CAAA,IAAK,MAAA;AAAA,EAC/B;AAAA,EAEA,iBAAA,CAAkB,MAAc,SAAA,EAAoC;AAElE,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,IAAI,EAAE,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,IAAA,EAAM,CAAA;AACzD,IAAA,MAAM,SAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,kBAAA,CAAmB,IAAI,CAAA;AAC1C,MAAA,IAAI,KAAA,EAAO;AAET,QAAA,KAAA,CAAM,SAAA,GAAY,aAAa,KAAA,CAAM,SAAA;AACrC,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,mBAAmB,KAAA,EAA+B;AACxD,IAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAO,IAAA,CAAK,mBAAmB,KAAK,CAAA;AAAA,IACtC,CAAA,MAAA,IAAW,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,EAAM;AACtD,MAAA,OAAO,IAAA,CAAK,iBAAiB,KAAK,CAAA;AAAA,IACpC;AAEA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,MACX,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,OAAO,KAAK;AAAA,KACvB;AAAA,EACF;AAAA,EAEQ,mBAAmB,OAAA,EAAgC;AAEzD,IAAA,MAAM,gBAAA,GAAmB,eAAA;AACzB,IAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,OAAO,CAAA,EAAG;AAClC,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,EAAA;AAAA,QACX,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,IAAA,EAAM,OAAA;AAAA,QACN,OAAA,EAAS,OAAA;AAAA,QACT,QAAA,EAAU;AAAA,UACR,iBAAA,EAAmB;AAAA;AACrB,OACF;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,uCAAA;AACvB,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,cAAc,CAAA;AACjD,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,GAAG,OAAA,EAAS,KAAA,EAAO,SAAA,EAAW,OAAO,CAAA,GAAI,YAAA;AAC/C,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,EAAA;AAAA,QACX,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,IAAA,EAAM,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA;AAAA,QACjC,OAAA;AAAA,QACA,OAAA,EAAS,QAAQ,WAAA,EAAY;AAAA,QAC7B,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAAA,QACzB,QAAQ,CAAA,EAAG,OAAA,CAAQ,WAAA,EAAa,IAAI,KAAK,CAAA,CAAA;AAAA,QACzC,QAAA,EAAU,QAAQ,WAAA;AAAY,OAChC;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,gBAAA,EAAkB;AAC3C,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACnC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,YAAA,GAAe,KAAA,CAAM,CAAC,CAAA,IAAK,SAAA;AACjC,QAAA,OAAO;AAAA,UACL,SAAA,EAAW,EAAA;AAAA,UACX,SAAA,sBAAe,IAAA,EAAK;AAAA,UACpB,IAAA,EAAM,YAAA;AAAA,UACN,OAAA,EAAS,OAAA;AAAA,UACT,QAAA,EAAU,YAAA;AAAA,UACV,QAAA,EAAU;AAAA,YACR;AAAA;AACF,SACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,cAAA,EAAgB;AACzC,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACnC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,OAAA,GAAU,yBAAA,CAA0B,IAAA,CAAK,OAAO,CAAA;AACtD,QAAA,OAAO;AAAA,UACL,SAAA,EAAW,EAAA;AAAA,UACX,SAAA,sBAAe,IAAA,EAAK;AAAA,UACpB,IAAA,EAAM,UAAU,OAAA,GAAU,aAAA;AAAA,UAC1B,OAAA,EAAS,OAAA;AAAA,UACT,QAAA,EAAU,MAAM,CAAC;AAAA,SACnB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,EAAA;AAAA,MACX,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAAA,EAEQ,iBAAiB,KAAA,EAA8B;AACrD,IAAA,MAAM,QAAA,GAAW,KAAA;AAEjB,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,SAAS,SAAA,IAAa,EAAA;AAAA,MACjC,WAAW,IAAI,IAAA,CAAK,SAAS,SAAA,IAAa,IAAA,CAAK,KAAK,CAAA;AAAA,MACpD,IAAA,EAAM,SAAS,IAAA,IAAQ,SAAA;AAAA,MACvB,SAAS,QAAA,CAAS,OAAA,IAAW,SAAS,OAAA,IAAW,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,MACrE,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,UAAU,QAAA,CAAS;AAAA,KACrB;AAAA,EACF;AACF,CAAA;AAKO,IAAM,iBAAN,MAAqB;AAAA,EAC1B,OAAwB,cAAA,GAAiB;AAAA,IACvC,MAAA,EAAQ,iBAAA;AAAA,IACR,MAAA,EAAQ,iBAAA;AAAA,IACR,KAAA,EAAO,gBAAA;AAAA,IACP,MAAA,EAAQ;AAAA,GACV;AAAA,EAEA,OAAwB,gBAAA,GAAmB;AAAA,IACzC,aAAA,EAAe,QAAA;AAAA,IACf,aAAA,EAAe,QAAA;AAAA,IACf,YAAA,EAAc,QAAA;AAAA,IACd,cAAA,EAAgB;AAAA,GAClB;AAAA,EAEA,OAAO,YAAY,QAAA,EAA0B;AAC3C,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,qBAAA,CAAsB,QAAQ,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,UAA8C,CAAA;AAEnF,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAI,YAAY,IAAI,CAAA;AAAA,IAChF;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,OAAO,sBAAsB,QAAA,EAA0B;AACrD,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,WAAA,EAAY,CAAE,IAAA,EAAK;AAG/C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,UAAgD,CAAA;AAC1F,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,WAAA;AAAA,IACT;AAGA,IAAA,IAAI,UAAA,IAAc,KAAK,cAAA,EAAgB;AACrC,MAAA,OAAO,UAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,kBAAA,EAAqB,QAAQ,CAAA,CAAA,EAAI,YAAY,IAAI,CAAA;AAAA,EAChF;AAAA,EAEA,OAAO,qBAAA,GAAwC;AAC7C,IAAA,OAAO;AAAA,MACL;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,qDAAA;AAAA,QACb,YAAA,EAAc,CAAC,QAAA,EAAU,UAAA,EAAY,aAAa,SAAS,CAAA;AAAA,QAC3D,MAAA,EAAQ,CAAC,YAAA,EAAc,UAAA,EAAY,WAAW,CAAA;AAAA,QAC9C,OAAA,EAAS,CAAC,aAAA,EAAe,aAAa;AAAA,OACxC;AAAA,MACA;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,sDAAA;AAAA,QACb,YAAA,EAAc,CAAC,cAAA,EAAgB,aAAA,EAAe,WAAW,CAAA;AAAA,QACzD,QAAQ,CAAC,MAAA,EAAO,OAAA,EAAQ,YAAA,EAAc,YAAY,mBAAmB,CAAA;AAAA,QACrE,OAAA,EAAS,CAAC,cAAc;AAAA,OAC1B;AAAA,MACA;AAAA,QACE,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,+CAAA;AAAA,QACb,YAAA,EAAc,CAAC,iBAAA,EAAmB,YAAA,EAAc,eAAe,CAAA;AAAA,QAC/D,MAAA,EAAQ,CAAC,OAAO,CAAA;AAAA,QAChB,SAAS;AAAC,OACZ;AAAA,MACA;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,WAAA,EAAa,wDAAA;AAAA,QACb,YAAA,EAAc,CAAC,QAAA,EAAU,YAAA,EAAc,UAAU,CAAA;AAAA,QACjD,MAAA,EAAQ,CAAC,gBAAA,EAAkB,kBAAkB,CAAA;AAAA,QAC7C,OAAA,EAAS,CAAC,YAAY;AAAA;AACxB,KACF;AAAA,EACF;AAAA,EAEA,OAAO,iBAAiB,IAAA,EAAuB;AAC7C,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,sBAAsB,IAAI,CAAA;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF,CAAA;AAwFO,IAAM,0BAAN,MAA8B;AAAA;AAAA;AAAA;AAAA,EAInC,aAAa,eAAA,CACX,UAAA,EACA,gBAAA,EACuE;AACvE,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,eAAA,CAAgB,YAAY,gBAAgB,CAAA;AAGvF,MAAA,IAAI,YAAA,CAAa,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAChC,QAAA,MAAM,YAAA,GAAe,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA;AACxC,QAAA,MAAM,IAAA,CAAK,mBAAmB,YAAY,CAAA;AAAA,MAC5C;AAEA,MAAA,MAAMkD,UAAS,YAAA,EAAa;AAC5B,MAAAA,OAAAA,CAAO,MAAM,CAAA,qBAAA,EAAwB,YAAA,CAAa,IAAI,CAAA,CAAE,CAAA,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACxE,MAAAA,OAAAA,CAAO,MAAM,CAAA,SAAA,EAAY,YAAA,CAAa,OAAO,CAAA,CAAE,CAAA,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAC/D,MAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,MAAA,EAAS,YAAA,CAAa,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAEnE,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,YAAA;AAAA,QACR,SAAS,YAAA,CAAa,OAAA;AAAA,QACtB,MAAM,YAAA,CAAa;AAAA,OACrB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,CAAA,yJAAA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA,EAIA,aAAa,mBAAmB,UAAA,EAAsC;AACpE,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM5C,eAAAA,CAAW,IAAA,CAAK,UAAU,CAAA;AAC9C,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,EAAO;AAC7B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,6BAAA,EAAgC,UAAU,CAAA,CAAE,CAAA;AAAA,MAC3E;AACA,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,kBAAA,CAAmB,CAAA,8BAAA,EAAiC,UAAU,CAAA,GAAA,EAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IACvF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,UAAU,gBAAA,EAA6C;AAClE,IAAA,OAAO,eAAA,CAAgB,UAAU,gBAAgB,CAAA;AAAA,EACnD;AAAA,EAEA,OAAO,kBAAA,CACL,YAAA,EACA,OAAA,GAAqC,EAAC,EACpB;AAClB,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,YAAA,CAAa,IAAA,CAAK,CAAC,CAAA;AAAA;AAAA,MAC/B,YAAY,YAAA,CAAa,IAAA;AAAA,MACzB,OAAA,EAAU,YAAA,CAAa,OAAA,GAAU,GAAA,IAAS,IAAA;AAAA;AAAA,MAC1C,OAAA,EAAS,CAAA;AAAA,MACT,aAAa,YAAA,CAAa,GAAA;AAAA,MAC1B,GAAG;AAAA,KACL;AAAA,EACF;AACF,CAAA;AAQO,SAAS,eAAA,CAAgB,OAAA,GAA4B,EAAC,EAAkB;AAE7E,EAAA,IAAI,OAAA,CAAQ,OAAA,IAAW,IAAA,IAAQ,OAAA,CAAQ,IAAI,qBAAA,EAAuB;AAChE,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA;AACvD,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,IAAK,SAAS,CAAA,EAAG;AACvC,MAAA,OAAA,CAAQ,OAAA,GAAU,MAAA;AAAA,IACpB;AAAA,EACF;AACA,EAAA,OAAO,IAAI,cAAc,OAAO,CAAA;AAClC;AAKA,eAAsB,yBAAA,CACpB,UAAA,EACA,gBAAA,EACA,iBAAA,GAA+C,EAAC,EACxB;AACxB,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,MAAA,EAAO,GAAI,MAAM,uBAAA,CAAwB,eAAA,CAAgB,YAAY,gBAAgB,CAAA;AAC7F,IAAA,MAAM,aAAA,GAAgB,uBAAA,CAAwB,kBAAA,CAAmB,MAAA,EAAQ;AAAA,MACvE,gBAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,MAAM4C,UAAS,YAAA,EAAa;AAC5B,IAAAA,OAAAA,CAAO,MAAM,CAAA,oCAAA,EAAuC,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACjF,IAAA,OAAO,IAAI,cAAc,aAAa,CAAA;AAAA,EACxC,SAAS,KAAA,EAAO;AAEd,IAAA,MAAMA,UAAS,YAAA,EAAa;AAC5B,IAAAA,QAAO,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAE,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAC5E,IAAAA,OAAAA,CAAO,KAAA,CAAM,CAAA,iDAAA,CAAmD,CAAA,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAGhF,IAAA,OAAO,IAAI,aAAA,CAAc;AAAA,MACvB,UAAA;AAAA;AAAA,MACA,gBAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAAA,EACH;AACF;AAGO,IAAM,mBAAN,MAAuB;AAAA,EAM5B,YAAoB,MAAA,EAAa;AAAb,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAc;AAAA,EAL1B,aAAA,uBAAyC,GAAA,EAAI;AAAA,EAC7C,WAAA,GAAsB,KAAK,GAAA,EAAI;AAAA,EAC/B,eAAA,GAA0B,EAAA;AAAA,EAC1B,eAAA;AAAA,EAIR,iBAAiB,QAAA,EAA2B;AAC1C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,WAAA,IAAe,EAAA;AAC/C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,GAAA;AAEzC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,IAAI,GAAA,GAAM,IAAA,CAAK,WAAA,IAAe,QAAA,EAAU;AACtC,MAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AACzB,MAAA,IAAA,CAAK,WAAA,GAAc,GAAA;AAAA,IACrB;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AAEzD,IAAA,IAAI,IAAA,CAAK,eAAA,IAAmB,CAAA,IAAK,IAAA,CAAK,mBAAmB,CAAA,EAAG;AAC1D,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,YAAA,GAAe,WAAA;AAAA,EACxB;AAAA,EAEA,cAAc,QAAA,EAAwB;AACpC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AACzD,IAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAA,EAAU,YAAA,GAAe,CAAC,CAAA;AAEjD,IAAA,IAAI,IAAA,CAAK,kBAAkB,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,eAAA,EAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEA,eAAA,CAAgB,WAAmB,SAAA,EAAuB;AACxD,IAAA,IAAA,CAAK,eAAA,GAAkB,SAAA;AACvB,IAAA,IAAA,CAAK,eAAA,GAAkB,SAAA;AAAA,EACzB;AAAA,EAEA,oBAAoB,QAAA,EAA0B;AAC5C,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,WAAA,IAAe,EAAA;AAC/C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,GAAA;AACzC,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA,IAAK,CAAA;AAEzD,IAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,MAAA,OAAO,CAAA;AAAA,IACT;AAEA,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,WAAA;AACvC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAA,GAAW,YAAY,CAAA;AAAA,EAC5C;AAAA,EAEA,SAAA,GAAiB;AACf,IAAA,OAAO;AAAA,MACL,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,iBAAiB,IAAA,CAAK,eAAA;AAAA,MACtB,aAAA,EAAe,KAAK,aAAA,CAAc;AAAA,KACpC;AAAA,EACF;AACF,CAAA;AAEO,IAAM,qBAAN,MAAyB;AAAA,EAC9B,cAAc,YAAA,EAA8B;AAC1C,IAAA,OAAO,cAAA,CAAe,YAAY,YAAY,CAAA;AAAA,EAChD;AAAA,EAEA,aAAA,CAAc,cAAsB,KAAA,EAAwB;AAC1D,IAAA,MAAM,WAAA,GAAwC;AAAA,MAC5C,QAAA,EAAU,CAAC,YAAA,EAAc,UAAA,EAAY,WAAW,CAAA;AAAA,MAChD,UAAU,CAAC,MAAA,EAAO,OAAA,EAAQ,UAAA,EAAY,cAAc,mBAAmB,CAAA;AAAA,MACvE,OAAA,EAAS,CAAC,OAAO,CAAA;AAAA,MACjB,QAAA,EAAU,CAAC,gBAAA,EAAkB,kBAAkB;AAAA,KACjD;AAEA,IAAA,MAAM,MAAA,GAAS,YAAY,YAAY,CAAA;AACvC,IAAA,OAAO,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA;AAAA,EAC3C;AAAA,EAEA,gBAAgB,YAAA,EAA8B;AAC5C,IAAA,MAAM,QAAA,GAAmC;AAAA,MACvC,QAAA,EAAU,YAAA;AAAA,MACV,QAAA,EAAU,MAAA;AAAA,MACV,OAAA,EAAS,OAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,OAAO,QAAA,CAAS,YAAY,CAAA,IAAK,eAAA;AAAA,EACnC;AAAA,EAEA,YAAY,YAAA,EAA2B;AACrC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAO,IAAA,CAAK,eAAA,CAAgB,YAAY,CAAA;AAAA,MACxC,WAAW,EAAC;AAAA,MACZ,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAAA,EAEA,qBAAA,GAAkC;AAChC,IAAA,OAAO,CAAC,QAAA,EAAU,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAA;AAAA,EAC/C;AAAA,EAEA,mBAAA,GAAgC;AAC9B,IAAA,OAAO,CAAC,aAAA,EAAe,aAAA,EAAe,YAAA,EAAc,cAAc,CAAA;AAAA,EACpE;AACF,CAAA;AAEO,IAAM,wBAAN,MAA4B;AAAA,EACzB,QAAA,uBAAiC,GAAA,EAAI;AAAA,EAE7C,aAAA,CAAc,SAAA,EAAoB,MAAA,EAAiB,QAAA,EAAqB;AACtE,IAAA,MAAM,EAAA,GAAK,SAAA,IAAa,CAAA,QAAA,EAAW,IAAA,CAAK,KAAK,CAAA,CAAA;AAC7C,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,SAAA,EAAW,EAAA;AAAA,MACX,MAAA;AAAA,MACA,QAAA,EAAU,YAAY,EAAC;AAAA,MACvB,iBAAiB,EAAC;AAAA,MAClB,KAAA,EAAA,cAAA;AAAA,MACA,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,YAAA,sBAAkB,IAAA;AAAK,KACzB;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,EAAA,EAAI,OAAO,CAAA;AAC7B,IAAA,OAAO,OAAA;AAAA,EACT;AAAA,EAEA,WAAW,SAAA,EAAwB;AACjC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAAA,EACpC;AAAA,EAEA,kBAAA,CAAmB,WAAmB,KAAA,EAAqB;AACzD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAA,GAAQ,KAAA;AAChB,MAAA,OAAA,CAAQ,YAAA,uBAAmB,IAAA,EAAK;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,WAAW,SAAA,EAAyB;AAClC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAA,GAAA,WAAA;AAAA,IACV;AAAA,EACF;AAAA,EAEA,aAAA,GAAqB;AACnB,IAAA,MAAM,WAAW,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAClD,IAAA,OAAO;AAAA,MACL,eAAe,QAAA,CAAS,MAAA;AAAA,MACxB,gBAAgB,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,gCAA6B,CAAE,MAAA;AAAA,MACtE,cAAc,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,4BAA2B,CAAE,MAAA;AAAA,MAClE,mBAAmB,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,sCAAgC,CAAE,MAAA;AAAA,MAC5E,oBAAA,EAAsB,QAAA,CAAS,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,eAAA,CAAgB,MAAA,EAAQ,CAAC;AAAA,KACrF;AAAA,EACF;AACF,CAAA;;;AO9uDA,YAAA,EAAA;;;ACAA,YAAA,EAAA;;;ACAA,YAAA,EAAA;;;ACAA,YAAA,EAAA;;;ACAA,YAAA,EAAA;;;ACAA,YAAA,EAAA;AAUO,IAAK,aAAA,qBAAAE,cAAAA,KAAL;AAEL,EAAAA,eAAA,QAAA,CAAA,GAAS,QAAA;AAGT,EAAAA,eAAA,YAAA,CAAA,GAAa,YAAA;AAGb,EAAAA,eAAA,eAAA,CAAA,GAAgB,eAAA;AAGhB,EAAAA,eAAA,KAAA,CAAA,GAAM,KAAA;AAGN,EAAAA,eAAA,UAAA,CAAA,GAAW,UAAA;AAGX,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AAGV,EAAAA,eAAA,KAAA,CAAA,GAAM,KAAA;AAGN,EAAAA,eAAA,KAAA,CAAA,GAAM,KAAA;AAGN,EAAAA,eAAA,UAAA,CAAA,GAAW,UAAA;AAGX,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AAGV,EAAAA,eAAA,UAAA,CAAA,GAAW,UAAA;AAhCD,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAsCL,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AAEL,EAAAA,eAAA,KAAA,CAAA,GAAM,KAAA;AAGN,EAAAA,eAAA,QAAA,CAAA,GAAS,QAAA;AAGT,EAAAA,eAAA,MAAA,CAAA,GAAO,MAAA;AAGP,EAAAA,eAAA,UAAA,CAAA,GAAW,UAAA;AAGX,EAAAA,eAAA,OAAA,CAAA,GAAQ,OAAA;AAdE,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAoBL,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AAEL,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AAGA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,SAAM,CAAA,CAAA,GAAN,KAAA;AAGA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,YAAS,CAAA,CAAA,GAAT,QAAA;AAGA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,UAAO,CAAA,CAAA,GAAP,MAAA;AAGA,EAAAA,cAAAA,CAAAA,cAAAA,CAAA,aAAU,CAAA,CAAA,GAAV,SAAA;AAdU,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAoBL,IAAK,qBAAA,qBAAAC,sBAAAA,KAAL;AAEL,EAAAA,uBAAA,WAAA,CAAA,GAAY,WAAA;AAGZ,EAAAA,uBAAA,OAAA,CAAA,GAAQ,OAAA;AAGR,EAAAA,uBAAA,UAAA,CAAA,GAAW,UAAA;AAGX,EAAAA,uBAAA,sBAAA,CAAA,GAAuB,sBAAA;AAGvB,EAAAA,uBAAA,mBAAA,CAAA,GAAoB,mBAAA;AAGpB,EAAAA,uBAAA,QAAA,CAAA,GAAS,QAAA;AAjBC,EAAA,OAAAA,sBAAAA;AAAA,CAAA,EAAA,qBAAA,IAAA,EAAA;AAuBL,IAAM,yBAAA,GAAkE;AAAA,EAC7E,CAAC,wBAAuB,MAAA;AAAA,EACxB,CAAC,gCAA2B,QAAA;AAAA,EAC5B,CAAC,sCAA8B,MAAA;AAAA,EAC/B,CAAC,kBAAoB,MAAA;AAAA,EACrB,CAAC,4BAAyB,QAAA;AAAA,EAC1B,CAAC,0BAAwB,QAAA;AAAA,EACzB,CAAC,kBAAoB,KAAA;AAAA,EACrB,CAAC,kBAAoB,KAAA;AAAA,EACrB,CAAC,4BAAyB,UAAA;AAAA,EAC1B,CAAC,0BAAwB,MAAA;AAAA,EACzB,CAAC,4BAAyB,UAAA;AAC5B;AAKO,IAAM,yBAAA,GAA0E;AAAA,EACrF,CAAC,wBAAuB,OAAA;AAAA,EACxB,CAAC,gCAA2B,mBAAA;AAAA,EAC5B,CAAC,sCAA8B,mBAAA;AAAA,EAC/B,CAAC,kBAAoB,OAAA;AAAA,EACrB,CAAC,4BAAyB,UAAA;AAAA,EAC1B,CAAC,0BAAwB,OAAA;AAAA,EACzB,CAAC,kBAAoB,mBAAA;AAAA,EACrB,CAAC,kBAAoB,UAAA;AAAA,EACrB,CAAC,4BAAyB,WAAA;AAAA,EAC1B,CAAC,0BAAwB,OAAA;AAAA,EACzB,CAAC,4BAAyB,WAAA;AAC5B;AAKO,SAAS,oBAAoB,QAAA,EAAkC;AACpE,EAAA,MAAM,QAAA,GAAW,0BAA0B,QAAQ,CAAA;AACnD,EAAA,OAAO,QAAA,KAAa,uBAA+B,QAAA,KAAa,UAAA;AAClE;AAKO,SAAS,oBAAoB,QAAA,EAAwC;AAC1E,EAAA,MAAM,QAAA,GAAW,0BAA0B,QAAQ,CAAA;AAEnD,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,OAAA;AACH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,MAAA;AACH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,CAAA;AAAA,IACT,KAAK,KAAA;AAAA,IACL;AACE,MAAA,OAAO,CAAA;AAAA;AAEb;;;AD2HO,SAAS,kBAAA,CACd,IAAA,EACA,QAAA,EACA,OAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAU,OAAA,EAAS,QAAA,IAAA,QAAA;AAAA,IACnB,UAAU,OAAA,EAAS,QAAA,IAAA,CAAA;AAAA,IACnB,UAAU,OAAA,EAAS,QAAA,IAAA,WAAA;AAAA,IACnB,SAAA,sBAAe,IAAA,EAAK;AAAA,IACpB,WAAA,EAAa,SAAS,WAAA,IAAe,KAAA;AAAA,IACrC,GAAG;AAAA,GACL;AACF;AAKO,SAAS,qBAAA,CACd,MACA,SAAA,EACc;AAEd,EAAA,MAAM,UAAA,GAAa,KAAK,QAAA,EAAS;AACjC,EAAA,MAAM,iBAAiB,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,EAAE,WAAA,EAAY;AAE5D,EAAA,IAAI,QAAA;AACJ,EAAA,QAAQ,cAAA;AAAgB,IACtB,KAAK,QAAA;AACH,MAAA,QAAA,GAAA,QAAA;AACA,MAAA;AAAA,IACF,KAAK,YAAA;AACH,MAAA,QAAA,GAAA,YAAA;AACA,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,QAAA,GAAA,eAAA;AACA,MAAA;AAAA,IACF,KAAK,KAAA;AACH,MAAA,QAAA,GAAA,KAAA;AACA,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,QAAA,GAAA,UAAA;AACA,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,QAAA,GAAA,SAAA;AACA,MAAA;AAAA,IACF,KAAK,KAAA;AACH,MAAA,QAAA,GAAA,KAAA;AACA,MAAA;AAAA,IACF,KAAK,KAAA;AACH,MAAA,QAAA,GAAA,KAAA;AACA,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,QAAA,GAAA,SAAA;AACA,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,QAAA,GAAA,UAAA;AACA,MAAA;AAAA,IACF,KAAK,UAAA;AACH,MAAA,QAAA,GAAA,UAAA;AACA,MAAA;AAAA,IACF;AACE,MAAA,QAAA,GAAA,UAAA;AAAA;AAGJ,EAAA,OAAO,kBAAA,CAAmB,IAAA,EAAM,QAAA,EAAU,SAAS,CAAA;AACrD;AAKO,SAAS,kBAAA,CACd,SACA,QAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IACH,QAAA,EAAU;AAAA,MACR,GAAG,OAAA,CAAQ,QAAA;AAAA,MACX,GAAG;AAAA;AACL,GACF;AACF;AAKO,SAAS,sBAAA,CACd,aACA,WAAA,EACkB;AAClB,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,WAAA,GAAc,eAAA,CAAgB,WAAW,CAAA,GAAI,MAAA;AAAA,IAC5D,WAAA;AAAA,IACA,UAAA,EAAY,mBAAmB,WAAW,CAAA;AAAA,IAC1C,WAAW,iBAAA;AAAkB,GAC/B;AACF;AAKA,SAAS,gBAAgB,KAAA,EAAsB;AAC7C,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,KAAA,CAAM,OAAA,GAAU,MAAM,KAAK,CAAA;AACnD,EAAA,OAAO,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACjC;AAKA,SAAS,iBAAA,GAA4B;AACnC,EAAA,OAAO,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AACtE;AAKA,SAAS,mBAAmB,KAAA,EAAuB;AACjD,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,OAAO,YAAA,IAAgB,OAAA,IAAW,YAAA,IAAgB,YAAA,CAAa,KAAA,EAAO;AACpE,IAAA,KAAA,EAAA;AACA,IAAA,YAAA,GAAe,YAAA,CAAa,KAAA;AAAA,EAC9B;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,SAAS,WAAW,GAAA,EAAqB;AACvC,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAA,CAAI,QAAQ,CAAA,EAAA,EAAK;AACnC,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,UAAA,CAAW,CAAC,CAAA;AAC7B,IAAA,IAAA,GAAA,CAAS,IAAA,IAAQ,KAAK,IAAA,GAAQ,IAAA;AAC9B,IAAA,IAAA,GAAO,IAAA,GAAO,IAAA;AAAA,EAChB;AACA,EAAA,OAAO,IAAA,CAAK,IAAI,IAAI,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AAChD;;;ADvYO,IAAK,kBAAA,qBAAAC,mBAAAA,KAAL;AAEL,EAAAA,oBAAA,OAAA,CAAA,GAAQ,OAAA;AAGR,EAAAA,oBAAA,UAAA,CAAA,GAAW,UAAA;AAGX,EAAAA,oBAAA,QAAA,CAAA,GAAS,QAAA;AAGT,EAAAA,oBAAA,OAAA,CAAA,GAAQ,OAAA;AAGR,EAAAA,oBAAA,QAAA,CAAA,GAAS,QAAA;AAGT,EAAAA,oBAAA,UAAA,CAAA,GAAW,UAAA;AAGX,EAAAA,oBAAA,QAAA,CAAA,GAAS,QAAA;AApBC,EAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;AAoGL,IAAe,aAAA,GAAf,cAAqC,KAAA,CAAwC;AAAA;AAAA,EAElE,EAAA;AAAA;AAAA,EASA,OAAA;AAAA;AAAA,EAGA,WAAA;AAAA;AAAA,EAGA,KAAA;AAAA;AAAA,EAGA,MAAA;AAAA;AAAA,EAGA,SAAA;AAAA;AAAA,EAGN,kBAA6C,EAAC;AAAA;AAAA;AAAA;AAAA,EAKxD,WAAA,CACE,SACA,OAAA,EASA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AAEb,IAAA,IAAA,CAAK,IAAA,GAAO,KAAK,WAAA,CAAY,IAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,uBAAgB,IAAA,EAAK;AAC1B,IAAA,IAAA,CAAK,EAAA,GAAK,KAAK,eAAA,EAAgB;AAC/B,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AACtB,IAAA,IAAA,CAAK,eAAA,GAAkB,OAAA,CAAQ,eAAA,IAAmB,EAAC;AAGnD,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,OAAA,GACnB,qBAAA,CAAsB,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,OAAO,CAAA,GACnD,qBAAA,CAAsB,OAAA,CAAQ,IAAI,CAAA;AAGtC,IAAA,IAAA,CAAK,WAAA,GAAc;AAAA,MACjB,GAAG,sBAAA,CAAuB,OAAA,CAAQ,KAAK,CAAA;AAAA,MACvC,GAAG,OAAA,CAAQ;AAAA,KACb;AAGA,IAAA,IAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO;AAClC,MAAA,IAAA,CAAK,KAAA,GAAQ,CAAA,EAAG,IAAA,CAAK,KAAK;AAAA,WAAA,EAAgB,IAAA,CAAK,MAAM,KAAK,CAAA,CAAA;AAAA,IAC5D;AAGA,IAAA,MAAA,CAAO,eAAe,IAAA,EAAM,OAAA,EAAS,EAAE,UAAA,EAAY,OAAO,CAAA;AAC1D,IAAA,MAAA,CAAO,eAAe,IAAA,EAAM,aAAA,EAAe,EAAE,UAAA,EAAY,OAAO,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,QAAA,GAA0B;AAC5B,IAAA,OAAO,KAAK,OAAA,CAAQ,QAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAA0B;AAC5B,IAAA,OAAO,KAAK,OAAA,CAAQ,QAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAA,GAAkC;AACpC,IAAA,OAAO,KAAK,OAAA,CAAQ,QAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKO,OAAO,IAAA,EAA0B;AACtC,IAAA,OAAO,KAAK,IAAA,KAAS,IAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKO,WAAW,QAAA,EAAkC;AAClD,IAAA,OAAO,KAAK,QAAA,KAAa,QAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,aAAA,GAAyB;AAC9B,IAAA,OAAO,IAAA,CAAK,gBAAgB,MAAA,GAAS,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAA,GAAgD;AACrD,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,gBAAgB,QAAA,EAA2C;AACtE,IAAA,MAAM,SAAS,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,QAAQ,CAAA;AAC/D,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,WAAA,EAAa,oBAAoB,QAAQ,CAAA,WAAA,CAAA;AAAA,QACzC,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,WAAA,EAAa,oBAAoB,QAAQ,CAAA,0BAAA,CAAA;AAAA,QACzC,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,OAAO,OAAA,EAAQ;AAAA,IAC9B,SAAS,KAAA,EAAO;AACd,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,WAAA,EAAa,CAAA,iBAAA,EAAoB,QAAQ,CAAA,UAAA,EAAa,KAAA,YAAiB,QAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,QAC5G,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,QAC/D,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,wBAAA,GAAkD;AAEvD,IAAA,MAAM,YAAY,IAAA,CAAK,eAAA,CAAgB,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,WAAW,CAAA;AAC9D,IAAA,IAAI,WAAW,OAAO,SAAA;AAGtB,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,MAAA,CAAO,CAAC,MAAM,OAAA,KAAY;AACpD,MAAA,IAAI,CAAC,MAAM,OAAO,OAAA;AAClB,MAAA,MAAM,QAAA,GAAW,KAAK,kBAAA,IAAsB,CAAA;AAC5C,MAAA,MAAM,WAAA,GAAc,QAAQ,kBAAA,IAAsB,CAAA;AAClD,MAAA,OAAO,WAAA,GAAc,WAAW,OAAA,GAAU,IAAA;AAAA,IAC5C,GAAG,IAA6B,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,WAAA,GAAuB;AAC5B,IAAA,OAAO,KAAK,OAAA,CAAQ,WAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKO,aAAA,GAAwB;AAC7B,IAAA,OAAO,IAAA,CAAK,QAAQ,UAAA,IAAc,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKO,cAAc,OAAA,EAAyB;AAC5C,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,UAAA;AAC5B,IAAA,IAAI,CAAC,QAAQ,OAAO,GAAA;AAEpB,IAAA,OAAO,IAAA,CAAK,kBAAA,EAAmB,CAAE,cAAA,CAAe,OAAO,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKO,YAAY,QAAA,EAA2B;AAC5C,IAAA,OAAO,IAAA,CAAK,WAAA,EAAY,IAAK,QAAA,GAAW,KAAK,aAAA,EAAc;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAA,GAAsC;AAC3C,IAAA,MAAM,MAAA,GAAS,KAAK,OAAA,CAAQ,UAAA;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,IAAI,0BAAA,CAA2B,GAAA,EAAM,GAAA,EAAO,GAAG,IAAI,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,IAAI,0BAAA;AAAA,MACT,MAAA,CAAO,YAAA;AAAA,MACP,MAAA,CAAO,QAAA;AAAA,MACP,MAAA,CAAO,iBAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,YAAY,QAAA,EAAwC;AACzD,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,GAAG,IAAA,CAAK,OAAA;AAAA,MACR,QAAA,EAAU;AAAA,QACR,GAAG,KAAK,OAAA,CAAQ,QAAA;AAAA,QAChB,GAAG;AAAA;AACL,KACF;AAGA,IAAA,MAAA,CAAO,cAAA,CAAe,MAAM,SAAA,EAAW;AAAA,MACrC,KAAA,EAAO,UAAA;AAAA,MACP,QAAA,EAAU,KAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACb,CAAA;AAED,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAkB,MAAA,EAA8B;AACrD,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAC,GAAG,IAAA,CAAK,iBAAiB,MAAM,CAAA;AACvD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,MAAA,GAAkC;AACvC,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,WAAA,EAAY;AAAA,MACtC,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,KAAA,EAAO,KAAK,KAAA,GAAQ;AAAA,QAClB,IAAA,EAAM,KAAK,KAAA,CAAM,IAAA;AAAA,QACjB,OAAA,EAAS,KAAK,KAAA,CAAM,OAAA;AAAA,QACpB,KAAA,EAAO,KAAK,KAAA,CAAM;AAAA,OACpB,GAAI;AAAA,KACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,cAAA,GAAyB;AAC9B,IAAA,IAAI,UAAU,IAAA,CAAK,OAAA;AAEnB,IAAA,IAAI,KAAK,OAAA,CAAQ,mBAAA,IAAuB,KAAK,OAAA,CAAQ,mBAAA,CAAoB,SAAS,CAAA,EAAG;AACnF,MAAA,OAAA,IAAW,kBAAA;AACX,MAAA,IAAA,CAAK,OAAA,CAAQ,mBAAA,CAAoB,OAAA,CAAQ,CAAC,YAAY,KAAA,KAAU;AAC9D,QAAA,OAAA,IAAW;AAAA,EAAA,EAAO,KAAA,GAAQ,CAAC,CAAA,EAAA,EAAK,UAAU,CAAA,CAAA;AAAA,MAC5C,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,OAAA,CAAQ,kBAAA,IAAsB,KAAK,OAAA,CAAQ,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjF,MAAA,OAAA,IAAW,oBAAA;AACX,MAAA,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB,OAAA,CAAQ,CAAA,IAAA,KAAQ;AAC9C,QAAA,OAAA,IAAW;AAAA,IAAA,EAAS,IAAI,CAAA,CAAA;AAAA,MAC1B,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAA0B;AAChC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,OAAA,EAAQ;AACzC,IAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AACrD,IAAA,OAAO,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAAA,EACpC;AACF;AAKO,IAAM,6BAAN,MAA4D;AAAA,EACjE,WAAA,CACmB,YAAA,EACD,QAAA,EACC,UAAA,EACD,SAAA,EAChB;AAJiB,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AACD,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACC,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACD,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EACf;AAAA,EAEH,eAAe,OAAA,EAAyB;AACtC,IAAA,MAAM,cAAc,IAAA,CAAK,YAAA,GAAe,KAAK,GAAA,CAAI,IAAA,CAAK,YAAY,OAAO,CAAA;AACzE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,WAAA,EAAa,KAAK,QAAQ,CAAA;AAEjD,IAAA,IAAI,KAAK,SAAA,EAAW;AAElB,MAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,GAAA,GAAM,IAAA,CAAK,MAAA,EAAO;AACzC,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,MAAM,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKO,IAAM,wBAAN,MAAuD;AAAA,EAC5D,WAAA,CACmB,SAAA,EACD,QAAA,EACA,SAAA,GAAqB,KAAA,EACrC;AAHiB,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AACD,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EACf;AAAA,EAEH,eAAe,OAAA,EAAyB;AACtC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,IAAa,OAAA,GAAU,CAAA,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAE5C,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,GAAA,GAAM,IAAA,CAAK,MAAA,EAAO;AACzC,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,MAAM,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKO,IAAM,uBAAN,MAAsD;AAAA,EAC3D,WAAA,CACmB,UAAA,EACD,QAAA,GAAmB,UAAA,EACnB,YAAqB,KAAA,EACrC;AAHiB,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AACD,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EACf;AAAA,EAEH,eAAe,QAAA,EAA0B;AACvC,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,GAAa,GAAA,GAAM,KAAK,MAAA,EAAO;AACnD,MAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAA,GAAa,MAAM,CAAA;AAAA,IAC5C;AAEA,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AACF;;;AGxhBA,YAAA,EAAA;AAaO,IAAK,SAAA,qBAAAC,UAAAA,KAAL;AAML,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,0BAAA,CAAA,GAA2B,0BAAA;AAG3B,EAAAA,WAAA,kBAAA,CAAA,GAAmB,kBAAA;AAGnB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,iBAAA,CAAA,GAAkB,iBAAA;AAGlB,EAAAA,WAAA,qBAAA,CAAA,GAAsB,qBAAA;AAGtB,EAAAA,WAAA,sBAAA,CAAA,GAAuB,sBAAA;AAGvB,EAAAA,WAAA,2BAAA,CAAA,GAA4B,2BAAA;AAO5B,EAAAA,WAAA,2BAAA,CAAA,GAA4B,2BAAA;AAG5B,EAAAA,WAAA,2BAAA,CAAA,GAA4B,2BAAA;AAG5B,EAAAA,WAAA,yBAAA,CAAA,GAA0B,yBAAA;AAG1B,EAAAA,WAAA,2BAAA,CAAA,GAA4B,2BAAA;AAG5B,EAAAA,WAAA,yBAAA,CAAA,GAA0B,yBAAA;AAG1B,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,6BAAA,CAAA,GAA8B,6BAAA;AAG9B,EAAAA,WAAA,6BAAA,CAAA,GAA8B,6BAAA;AAO9B,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,sBAAA,CAAA,GAAuB,sBAAA;AAGvB,EAAAA,WAAA,mBAAA,CAAA,GAAoB,mBAAA;AAGpB,EAAAA,WAAA,mBAAA,CAAA,GAAoB,mBAAA;AAGpB,EAAAA,WAAA,wBAAA,CAAA,GAAyB,wBAAA;AAOzB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,qBAAA,CAAA,GAAsB,qBAAA;AAGtB,EAAAA,WAAA,wBAAA,CAAA,GAAyB,wBAAA;AAGzB,EAAAA,WAAA,2BAAA,CAAA,GAA4B,2BAAA;AAG5B,EAAAA,WAAA,oBAAA,CAAA,GAAqB,oBAAA;AAGrB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,yBAAA,CAAA,GAA0B,yBAAA;AAG1B,EAAAA,WAAA,iBAAA,CAAA,GAAkB,iBAAA;AAGlB,EAAAA,WAAA,oBAAA,CAAA,GAAqB,oBAAA;AAGrB,EAAAA,WAAA,yBAAA,CAAA,GAA0B,yBAAA;AAG1B,EAAAA,WAAA,sBAAA,CAAA,GAAuB,sBAAA;AAGvB,EAAAA,WAAA,sBAAA,CAAA,GAAuB,sBAAA;AAOvB,EAAAA,WAAA,oBAAA,CAAA,GAAqB,oBAAA;AAGrB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,6BAAA,CAAA,GAA8B,6BAAA;AAG9B,EAAAA,WAAA,2BAAA,CAAA,GAA4B,2BAAA;AAG5B,EAAAA,WAAA,6BAAA,CAAA,GAA8B,6BAAA;AAG9B,EAAAA,WAAA,wBAAA,CAAA,GAAyB,wBAAA;AAGzB,EAAAA,WAAA,4BAAA,CAAA,GAA6B,4BAAA;AAG7B,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAOxB,EAAAA,WAAA,mBAAA,CAAA,GAAoB,mBAAA;AAGpB,EAAAA,WAAA,wBAAA,CAAA,GAAyB,wBAAA;AAGzB,EAAAA,WAAA,iBAAA,CAAA,GAAkB,iBAAA;AAGlB,EAAAA,WAAA,iBAAA,CAAA,GAAkB,iBAAA;AAGlB,EAAAA,WAAA,yBAAA,CAAA,GAA0B,yBAAA;AAG1B,EAAAA,WAAA,mBAAA,CAAA,GAAoB,mBAAA;AAGpB,EAAAA,WAAA,yBAAA,CAAA,GAA0B,yBAAA;AAG1B,EAAAA,WAAA,2BAAA,CAAA,GAA4B,2BAAA;AAO5B,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,sBAAA,CAAA,GAAuB,sBAAA;AAGvB,EAAAA,WAAA,iBAAA,CAAA,GAAkB,iBAAA;AAGlB,EAAAA,WAAA,aAAA,CAAA,GAAc,aAAA;AAGd,EAAAA,WAAA,gBAAA,CAAA,GAAiB,gBAAA;AAGjB,EAAAA,WAAA,iBAAA,CAAA,GAAkB,iBAAA;AAOlB,EAAAA,WAAA,kBAAA,CAAA,GAAmB,kBAAA;AAGnB,EAAAA,WAAA,iBAAA,CAAA,GAAkB,iBAAA;AAGlB,EAAAA,WAAA,qBAAA,CAAA,GAAsB,qBAAA;AAGtB,EAAAA,WAAA,kBAAA,CAAA,GAAmB,kBAAA;AAGnB,EAAAA,WAAA,mBAAA,CAAA,GAAoB,mBAAA;AAGpB,EAAAA,WAAA,mBAAA,CAAA,GAAoB,mBAAA;AAGpB,EAAAA,WAAA,sBAAA,CAAA,GAAuB,sBAAA;AAGvB,EAAAA,WAAA,iBAAA,CAAA,GAAkB,iBAAA;AAOlB,EAAAA,WAAA,2BAAA,CAAA,GAA4B,2BAAA;AAG5B,EAAAA,WAAA,iBAAA,CAAA,GAAkB,iBAAA;AAGlB,EAAAA,WAAA,mBAAA,CAAA,GAAoB,mBAAA;AAGpB,EAAAA,WAAA,qBAAA,CAAA,GAAsB,qBAAA;AAGtB,EAAAA,WAAA,mBAAA,CAAA,GAAoB,mBAAA;AAGpB,EAAAA,WAAA,qBAAA,CAAA,GAAsB,qBAAA;AAGtB,EAAAA,WAAA,oBAAA,CAAA,GAAqB,oBAAA;AAGrB,EAAAA,WAAA,6BAAA,CAAA,GAA8B,6BAAA;AAO9B,EAAAA,WAAA,sBAAA,CAAA,GAAuB,sBAAA;AAGvB,EAAAA,WAAA,sBAAA,CAAA,GAAuB,sBAAA;AAGvB,EAAAA,WAAA,8BAAA,CAAA,GAA+B,8BAAA;AAG/B,EAAAA,WAAA,wBAAA,CAAA,GAAyB,wBAAA;AAGzB,EAAAA,WAAA,wBAAA,CAAA,GAAyB,wBAAA;AAGzB,EAAAA,WAAA,2BAAA,CAAA,GAA4B,2BAAA;AAG5B,EAAAA,WAAA,4BAAA,CAAA,GAA6B,4BAAA;AAG7B,EAAAA,WAAA,4BAAA,CAAA,GAA6B,4BAAA;AAO7B,EAAAA,WAAA,2BAAA,CAAA,GAA4B,2BAAA;AAG5B,EAAAA,WAAA,2BAAA,CAAA,GAA4B,2BAAA;AAG5B,EAAAA,WAAA,wBAAA,CAAA,GAAyB,wBAAA;AAGzB,EAAAA,WAAA,0BAAA,CAAA,GAA2B,0BAAA;AAG3B,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAGxB,EAAAA,WAAA,mBAAA,CAAA,GAAoB,mBAAA;AAGpB,EAAAA,WAAA,wBAAA,CAAA,GAAyB,wBAAA;AA/Tf,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AAqUL,IAAM,qBAAA,GAAgD;AAAA,EAC3D,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAY,YAAA;AAAA,EACZ,MAAA,EAAQ,eAAA;AAAA,EACR,GAAA,EAAK,KAAA;AAAA,EACL,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU;AACZ;AAKO,SAAS,qBAAqB,IAAA,EAAyB;AAC5D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAChC,EAAA,OAAO,qBAAA,CAAsB,MAAM,CAAA,IAAK,SAAA;AAC1C;AAKO,SAAS,qBAAqB,IAAA,EAA0B;AAC7D,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,sBAAA;AAAA,IACA,wBAAA;AAAA,IACA,uBAAA;AAAA,IACA,yBAAA;AAAA,IACA,yBAAA;AAAA,IACA,2BAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,qBAAA;AAAA,IACA,6BAAA;AAAA,GACF;AAEA,EAAA,OAAO,cAAA,CAAe,SAAS,IAAI,CAAA;AACrC;AAKO,SAAS,yBAAyB,IAAA,EAA0B;AACjE,EAAA,MAAM,qBAAA,GAAwB;AAAA,IAC5B,0BAAA;AAAA,IACA,2BAAA;AAAA,IACA,2BAAA;AAAA,IACA,uBAAA;AAAA,IACA,uBAAA;AAAA,IACA,uBAAA;AAAA,IACA,iBAAA;AAAA,IACA,oBAAA;AAAA,IACA,uBAAA;AAAA,IACA,uBAAA;AAAA,IACA,uBAAA;AAAA,IACA,sBAAA;AAAA,IACA,8BAAA;AAAA,GACF;AAEA,EAAA,OAAO,qBAAA,CAAsB,SAAS,IAAI,CAAA;AAC5C;;;ACjZA,YAAA,EAAA;AAsKO,IAAM,uBAAN,MAA2B;AAAA,EACxB,UAAA,uBAAiB,GAAA,EAA8B;AAAA,EAC/C,SAAA,uBAAgB,GAAA,EAAsC;AAAA,EACtD,eAAA,uBAAsB,GAAA,EAAwC;AAAA;AAAA;AAAA;AAAA,EAK/D,gBAAA,CAAiB,UAA4B,QAAA,EAA0C;AAC5F,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,QAAQ,CAAA;AACzC,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,EAAA,EAAI,QAAQ,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAA,CACL,OACA,WAAA,EACc;AACd,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,wBAAA,CAAyB,KAAA,EAAO,WAAW,CAAA;AAC7E,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,oBAAA,CAAqB,oBAAA,EAAsB,OAAO,WAAW,CAAA;AAE3F,IAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,MAAA,CAAO,CAAC,OAAO,QAAA,KAAa;AACjE,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,SAAS,EAAE,CAAA;AAC/C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,OAAO,QAAQ,QAAA,CAAS,YAAA,CAAa,OAAO,IAAA,CAAK,aAAA,CAAc,KAAK,CAAC,CAAA;AAAA,MACvE;AACA,MAAA,OAAO,KAAA;AAAA,IACT,GAAG,CAAC,CAAA;AAEJ,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,+BAAA,CAAgC,gBAAA,EAAkB,KAAK,CAAA;AACvF,IAAA,MAAMC,4BAA2B,gBAAA,CAAiB,IAAA,CAAK,CAAA,CAAA,KAAK,CAAC,EAAE,WAAW,CAAA;AAE1E,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAAA,MAC7B,KAAA;AAAA,MACA,UAAA,EAAY,gBAAA;AAAA,MACZ,QAAA,EAAU;AAAA,QACR,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,aAAA;AAAA,QACA,kBAAA;AAAA,QACA,wBAAA,EAAAA;AAAA;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAa,mBAAA,CACX,IAAA,EACA,WAAA,EACyB;AACzB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,OAAO,WAAW,CAAA;AAC1D,IAAA,IAAI,UAAA,GAA6B;AAAA,MAC/B,OAAA,EAAS,KAAA;AAAA,MACT,WAAA,EAAa,kCAAA;AAAA,MACb,WAAA,EAAa;AAAA,KACf;AAEA,IAAA,KAAA,MAAW,QAAA,IAAY,KAAK,UAAA,EAAY;AACtC,MAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,IAAc,CAAA,EAAG;AACjD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,SAAS,EAAE,CAAA;AAC/C,MAAA,IAAI,CAAC,YAAY,CAAC,QAAA,CAAS,SAAS,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA,EAAG;AACxD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,eAAA,CAAgB,QAAA,EAAU,UAAU,OAAO,CAAA;AACtE,MAAA,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA;AAEtC,MAAA,IAAI,OAAA,CAAQ,OAAO,OAAA,EAAS;AAC1B,QAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,MACjB;AAEA,MAAA,UAAA,GAAa,OAAA,CAAQ,MAAA;AAGrB,MAAA,OAAA,CAAQ,aAAA,EAAA;AACR,MAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,QAAA,OAAA,CAAQ,cAAc,OAAA,CAAQ,QAAA;AAAA,MAChC;AAAA,IACF;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,uBAAuB,KAAA,EAAyC;AACrE,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,wBAAA,CAAyB,KAAK,CAAA;AAEhE,IAAA,KAAA,MAAW,YAAY,oBAAA,EAAsB;AAC3C,MAAA,IAAI,SAAS,WAAA,EAAa;AACxB,QAAA,WAAA,CAAY,KAAK,CAAA,IAAA,EAAO,QAAA,CAAS,IAAI,CAAA,EAAA,EAAK,QAAA,CAAS,WAAW,CAAA,CAAE,CAAA;AAAA,MAClE,CAAA,MAAO;AACL,QAAA,WAAA,CAAY,IAAA,CAAK,CAAA,qBAAA,EAAwB,QAAA,CAAS,WAAW,CAAA,CAAE,CAAA;AAAA,MACjE;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,QAAQ,mBAAA,EAAqB;AACrC,MAAA,WAAA,CAAY,IAAA,CAAK,GAAG,KAAA,CAAM,OAAA,CAAQ,mBAAmB,CAAA;AAAA,IACvD;AAEA,IAAA,OAAO,WAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,mBAAmB,KAAA,EAAkD;AAC1E,IAAA,OAAO,KAAK,eAAA,CAAgB,GAAA,CAAI,KAAA,CAAM,EAAE,KAAK,EAAC;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAA,CACN,OACA,WAAA,EAC6B;AAC7B,IAAA,MAAM,aAAiC,EAAC;AAExC,IAAA,KAAA,MAAW,QAAA,IAAY,IAAA,CAAK,UAAA,CAAW,MAAA,EAAO,EAAG;AAE/C,MAAA,IAAI,CAAC,QAAA,CAAS,oBAAA,CAAqB,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,EAAG;AAC3D,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,QAAA,CAAS,mBAAmB,CAAC,QAAA,CAAS,gBAAgB,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,EAAG;AAC9E,QAAA;AAAA,MACF;AAGA,MAAA,IAAI,WAAA,EAAa,iBAAA,EAAmB,QAAA,CAAS,QAAA,CAAS,EAAE,CAAA,EAAG;AACzD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,aAAa,mBAAA,EAAqB;AACpC,QAAA,IAAI,CAAC,WAAA,CAAY,mBAAA,CAAoB,QAAA,CAAS,QAAA,CAAS,EAAE,CAAA,EAAG;AAC1D,UAAA;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,CAAC,WAAA,EAAa,sBAAA,IAA0B,QAAA,CAAS,WAAA,EAAa;AAChE,QAAA;AAAA,MACF;AAEA,MAAA,UAAA,CAAW,KAAK,QAAQ,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,UAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,CACN,UAAA,EACA,KAAA,EACA,WAAA,EAC6B;AAC7B,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,WAAW,CAAA;AAErD,IAAA,OAAO,CAAC,GAAG,UAAU,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAEpC,MAAA,IAAI,aAAa,mBAAA,EAAqB;AACpC,QAAA,MAAM,MAAA,GAAS,WAAA,CAAY,mBAAA,CAAoB,OAAA,CAAQ,EAAE,EAAE,CAAA;AAC3D,QAAA,MAAM,MAAA,GAAS,WAAA,CAAY,mBAAA,CAAoB,OAAA,CAAQ,EAAE,EAAE,CAAA;AAE3D,QAAA,IAAI,MAAA,KAAW,EAAA,IAAM,MAAA,KAAW,EAAA,EAAI;AAClC,UAAA,OAAO,MAAA,GAAS,MAAA;AAAA,QAClB;AACA,QAAA,IAAI,MAAA,KAAW,IAAI,OAAO,EAAA;AAC1B,QAAA,IAAI,MAAA,KAAW,IAAI,OAAO,CAAA;AAAA,MAC5B;AAGA,MAAA,IAAI,CAAA,CAAE,QAAA,KAAa,CAAA,CAAE,QAAA,EAAU;AAC7B,QAAA,OAAO,CAAA,CAAE,WAAW,CAAA,CAAE,QAAA;AAAA,MACxB;AAGA,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAE,EAAE,CAAA;AACzC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,EAAE,EAAE,CAAA;AAEzC,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,0BAAA,CAA2B,KAAA,EAAO,OAAO,CAAA;AACjE,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,0BAAA,CAA2B,KAAA,EAAO,OAAO,CAAA;AAEjE,QAAA,IAAI,UAAU,KAAA,EAAO;AACnB,UAAA,OAAO,KAAA,GAAQ,KAAA;AAAA,QACjB;AAAA,MACF;AAGA,MAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,YAAA,CAAa,KAAA,EAAO,OAAO,CAAA;AACnD,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,YAAA,CAAa,KAAA,EAAO,OAAO,CAAA;AAEnD,QAAA,OAAO,KAAA,GAAQ,KAAA;AAAA,MACjB;AAEA,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,+BAAA,CACN,YACA,KAAA,EACQ;AACR,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,CAAA;AAEpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,KAAK,CAAA;AACxC,IAAA,IAAI,mBAAA,GAAsB,CAAA;AAE1B,IAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,SAAS,EAAE,CAAA;AAC/C,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,WAAA,GAAc,QAAA,CAAS,0BAAA,CAA2B,KAAA,EAAO,OAAO,CAAA;AACtE,QAAA,mBAAA,IAAwB,CAAA,GAAI,WAAA;AAAA,MAC9B;AAAA,IACF;AAEA,IAAA,OAAO,CAAA,GAAI,mBAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,eAAA,CACZ,QAAA,EACA,QAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAM,SAAA,GAAY,KAAK,iBAAA,EAAkB;AAEzC,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,kBAAA;AAAA,QACxB,MAAM,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA;AAAA,QAC9B,SAAS,OAAA,IAAW;AAAA,OACtB;AAEA,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,SAAA;AAAA,QACJ,QAAA;AAAA,QACA,SAAA,EAAW,IAAI,IAAA,CAAK,SAAS,CAAA;AAAA,QAC7B,QAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA,EAAS,EAAE,GAAG,OAAA,CAAQ,gBAAA;AAAiB,OACzC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAE9B,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,SAAA;AAAA,QACJ,QAAA;AAAA,QACA,SAAA,EAAW,IAAI,IAAA,CAAK,SAAS,CAAA;AAAA,QAC7B,QAAA;AAAA,QACA,MAAA,EAAQ;AAAA,UACN,OAAA,EAAS,KAAA;AAAA,UACT,WAAA,EAAa,8BAA8B,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,UACjG,KAAA,EAAO,iBAAiB,KAAA,GAAQ,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAC/D,WAAA,EAAa;AAAA,SACf;AAAA,QACA,OAAA,EAAS,EAAE,GAAG,OAAA,CAAQ,gBAAA;AAAiB,OACzC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,kBAAA,CACZ,EAAA,EACA,SAAA,EACY;AACZ,IAAA,OAAO,IAAI,OAAA,CAAQ,CAACxD,QAAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,kCAAA,EAAqC,SAAS,IAAI,CAAC,CAAA;AAAA,MACtE,GAAG,SAAS,CAAA;AAEZ,MAAA,EAAA,EAAG,CACA,KAAK,CAAA,MAAA,KAAU;AACd,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAAA,SAAQ,MAAM,CAAA;AAAA,MAChB,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,KAAA,KAAS;AACd,QAAA,YAAA,CAAa,OAAO,CAAA;AACpB,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,MACd,CAAC,CAAA;AAAA,IACL,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,CACN,OACA,WAAA,EACiB;AACjB,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAA;AAEtD,IAAA,OAAO;AAAA,MACL,KAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA,EAAe,iBAAiB,MAAA,GAAS,CAAA;AAAA,MACzC,eAAA,EAAiB,WAAA;AAAA,MACjB,YAAY,WAAA,EAAa;AAAA,KAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,CAAc,OAAsB,OAAA,EAAgC;AAC1E,IAAA,MAAM,UAAU,IAAA,CAAK,eAAA,CAAgB,IAAI,KAAA,CAAM,EAAE,KAAK,EAAC;AACvD,IAAA,IAAA,CAAK,eAAA,CAAgB,IAAI,KAAA,CAAM,EAAA,EAAI,CAAC,GAAG,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,KAAA,EAA8B;AACnD,IAAA,OAAO,QAAQ,KAAA,CAAM,EAAE,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAA4B;AAClC,IAAA,OAAO,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,IAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAAA,EACzE;AACF;AAGO,IAAM,oBAAA,GAAuB,IAAI,oBAAA;;;ACpgBxC,YAAA,EAAA;AAeO,IAAe,WAAA,GAAf,cAAmC,aAAA,CAAc;AAAA,EACtC,QAAA,GAAA,QAAA;AAElB;AAKO,IAAM,iBAAA,GAAN,cAAgC,WAAA,CAAY;AAAA,EACjC,IAAA,GAAA,uBAAA;AAAA,EAEhB,WAAA,CACE,QAAA,EACA,SAAA,EACA,OAAA,EAIA;AACA,IAAA,MAAM,OAAA,GAAU,YACZ,CAAA,sBAAA,EAAyB,SAAS,KAAK,QAAQ,CAAA,CAAA,GAC/C,mBAAmB,QAAQ,CAAA,CAAA;AAE/B,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,uBAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,OAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,QAAA;AAAA,UACA,SAAA;AAAA,UACA,GAAG,SAAS,OAAA,EAAS;AAAA,SACvB;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,mCAAA;AAAA,UACA,kDAAA;AAAA,UACA,wBAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,aAAA;AAAA,UACJ,WAAA,EAAa,yBAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,KAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,sBAAA;AAAA,UACJ,WAAA,EAAa,4BAAA;AAAA,UACb,IAAA,EAAA,UAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,qBAAA,GAAN,cAAoC,WAAA,CAAY;AAAA,EACrC,IAAA,GAAA,0BAAA;AAAA,EAEhB,WAAA,CACE,YAAA,EACA,SAAA,EACA,OAAA,EAIA;AACA,IAAA,MAAM,OAAA,GAAU,CAAA,sBAAA,EAAyB,SAAS,CAAA,eAAA,EAAkB,YAAY,CAAA,CAAA;AAEhF,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,0BAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,OAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,QAAA,EAAU,YAAA;AAAA,UACV,SAAA;AAAA,UACA,GAAG,SAAS,OAAA,EAAS;AAAA,SACvB;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,kCAAA;AAAA,UACA,iDAAA;AAAA,UACA,sCAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,mBAAA;AAAA,UACJ,WAAA,EAAa,uCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,6BAAA;AAAA,UACJ,WAAA,EAAa,6BAAA;AAAA,UACb,IAAA,EAAA,UAAA;AAAA,UACA,WAAA,EAAa,KAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,aAAA,GAAN,cAA4B,WAAA,CAAY;AAAA,EAC7B,IAAA,GAAA,kBAAA;AAAA,EAEhB,WAAA,CACE,SAAA,EACA,aAAA,EACA,cAAA,EACA,OAAA,EAIA;AACA,IAAA,IAAI,OAAA,GAAU,+BAA+B,SAAS,CAAA,CAAA;AACtD,IAAA,IAAI,iBAAiB,cAAA,EAAgB;AACnC,MAAA,OAAA,IAAW,CAAA,YAAA,EAAe,aAAa,CAAA,aAAA,EAAgB,cAAc,CAAA,CAAA,CAAA;AAAA,IACvE;AAEA,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,kBAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,OAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,SAAA;AAAA,UACA,aAAA;AAAA,UACA,cAAA;AAAA,UACA,GAAG,SAAS,OAAA,EAAS;AAAA,SACvB;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,kDAAA;AAAA,UACA,gCAAA;AAAA,UACA,0BAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,kBAAA;AAAA,UACJ,WAAA,EAAa,0BAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,oBAAA;AAAA,UACJ,WAAA,EAAa,0BAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,kBAAA,GAAN,cAAiC,WAAA,CAAY;AAAA,EAClC,IAAA,GAAA,uBAAA;AAAA,EAEhB,WAAA,CACE,YAAA,EACA,SAAA,EACA,OAAA,EAIA;AACA,IAAA,MAAM,OAAA,GAAU,CAAA,4BAAA,EAA+B,SAAS,CAAA,EAAA,EAAK,YAAY,CAAA,CAAA;AAEzE,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,uBAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,OAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,QAAA,EAAU,YAAA;AAAA,UACV,SAAA;AAAA,UACA,GAAG,SAAS,OAAA,EAAS;AAAA,SACvB;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,uCAAA;AAAA,UACA,oCAAA;AAAA,UACA,mCAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,oBAAA;AAAA,UACJ,WAAA,EAAa,uCAAA;AAAA,UACb,IAAA,EAAA,UAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,oBAAA;AAAA,UACJ,WAAA,EAAa,iCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,KAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,OAAA,GAAN,cAAsB,WAAA,CAAY;AAAA,EACvB,IAAA,GAAA,iBAAA;AAAA,EAEhB,WAAA,CACE,SAAA,EACA,OAAA,EACA,OAAA,EAIA;AACA,IAAA,IAAI,OAAA,GAAU,oBAAoB,SAAS,CAAA,CAAA;AAC3C,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,IAAW,KAAK,OAAO,CAAA,CAAA;AAAA,IACzB;AAEA,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,iBAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,OAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,SAAA;AAAA,UACA,OAAA;AAAA,UACA,GAAG,SAAS,OAAA,EAAS;AAAA,SACvB;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,wCAAA;AAAA,UACA,8BAAA;AAAA,UACA,yBAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa,IAAA;AAAA,QACb,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,YAAA,EAAc,GAAA;AAAA,UACd,QAAA,EAAU,GAAA;AAAA,UACV,iBAAA,EAAmB,CAAA;AAAA,UACnB,SAAA,EAAW;AAAA;AACb,OACF;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,iBAAA;AAAA,UACJ,WAAA,EAAa,yBAAA;AAAA,UACb,IAAA,EAAA,OAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,qBAAA;AAAA,UACJ,WAAA,EAAa,8BAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,gBAAA,GAAN,cAA+B,WAAA,CAAY;AAAA,EAChC,IAAA,GAAA,qBAAA;AAAA,EAEhB,WAAA,CACEG,MAAAA,EACA,MAAA,EACA,OAAA,EAIA;AACA,IAAA,IAAI,OAAA,GAAU,iBAAiBA,MAAI,CAAA,CAAA;AACnC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAA,IAAW,KAAK,MAAM,CAAA,CAAA,CAAA;AAAA,IACxB;AAEA,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,qBAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,OAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,QAAA,EAAUA,MAAAA;AAAA,UACV,MAAA;AAAA,UACA,GAAG,SAAS,OAAA,EAAS;AAAA,SACvB;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,8BAAA;AAAA,UACA,8CAAA;AAAA,UACA,gDAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,gBAAA;AAAA,UACJ,WAAA,EAAa,iCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,0BAAA;AAAA,UACJ,WAAA,EAAa,iCAAA;AAAA,UACb,IAAA,EAAA,UAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,iBAAA,GAAN,cAAgC,WAAA,CAAY;AAAA,EACjC,IAAA,GAAA,sBAAA;AAAA,EAEhB,WAAA,CACE,QAAA,EACA,SAAA,EACA,cAAA,EACA,OAAA,EAIA;AACA,IAAA,IAAI,OAAA,GAAU,CAAA,kBAAA,EAAqB,SAAS,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA;AACzD,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAA,IAAW,gBAAgB,cAAc,CAAA,CAAA,CAAA;AAAA,IAC3C;AAEA,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,sBAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,OAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,QAAA;AAAA,UACA,SAAA;AAAA,UACA,cAAA;AAAA,UACA,GAAG,SAAS,OAAA,EAAS;AAAA,SACvB;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,2CAAA;AAAA,UACA,qDAAA;AAAA,UACA,iDAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa,IAAA;AAAA,QACb,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,YAAA,EAAc,GAAA;AAAA,UACd,QAAA,EAAU,GAAA;AAAA,UACV,iBAAA,EAAmB,GAAA;AAAA,UACnB,SAAA,EAAW;AAAA;AACb,OACF;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,gBAAA;AAAA,UACJ,WAAA,EAAa,uCAAA;AAAA,UACb,IAAA,EAAA,OAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB,GAAA;AAAA,UACpB,aAAA,EAAe;AAAA,SACjB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,sBAAA;AAAA,UACJ,WAAA,EAAa,6CAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,sBAAA,GAAN,cAAqC,WAAA,CAAY;AAAA,EACtC,IAAA,GAAA,2BAAA;AAAA,EAEhB,WAAA,CACE,YAAA,EACA,SAAA,EACA,OAAA,EAIA;AACA,IAAA,MAAM,OAAA,GAAU,CAAA,OAAA,EAAU,YAAY,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAA;AAEpE,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,2BAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,OAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,YAAA;AAAA,UACA,SAAA;AAAA,UACA,GAAG,SAAS,OAAA,EAAS;AAAA,SACvB;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,WAAW,YAAY,CAAA,wBAAA,CAAA;AAAA,UACvB,iDAAA;AAAA,UACA,0CAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa,IAAA;AAAA,QACb,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,YAAA,EAAc,GAAA;AAAA,UACd,QAAA,EAAU,IAAA;AAAA,UACV,iBAAA,EAAmB,CAAA;AAAA,UACnB,SAAA,EAAW;AAAA;AACb,OACF;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,iBAAA;AAAA,UACJ,WAAA,EAAa,0BAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,sBAAA;AAAA,UACJ,WAAA,EAAa,iBAAiB,YAAY,CAAA,MAAA,CAAA;AAAA,UAC1C,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;;;AC1eA,YAAA,EAAA;AAeO,IAAesD,gBAAAA,GAAf,cAAuC,aAAA,CAAc;AAAA,EAE1C,QAAA,GAAA,YAAA;AAClB,CAAA;AAKO,IAAM,kBAAA,GAAN,cAAiCA,gBAAAA,CAAgB;AAAA,EACtC,IAAA,GAAA,2BAAA;AAAA,EAEhB,WAAA,CACE,WACA,OAAA,EAQA;AACA,IAAA,MAAM,OAAA,GAAU,OAAA,EAAS,SAAA,GACrB,CAAA,gBAAA,EAAmB,SAAS,yBAAyB,OAAA,CAAQ,SAAS,CAAA,CAAA,GACtE,CAAA,gBAAA,EAAmB,SAAS,CAAA,YAAA,CAAA;AAEhC,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,2BAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,YAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,SAAA;AAAA,UACA,WAAW,OAAA,EAAS,SAAA;AAAA,UACpB,cAAc,OAAA,EAAS,YAAA;AAAA,UACvB,cAAc,OAAA,EAAS,YAAA;AAAA,UACvB,mBAAmB,OAAA,EAAS,iBAAA;AAAA,UAC5B,GAAG,SAAS,YAAA,EAAc;AAAA,SAC5B;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,2CAA2C,SAAS,CAAA,CAAA,CAAA;AAAA,UACpD,OAAA,EAAS,YAAA,GAAe,CAAA,eAAA,EAAkB,OAAA,CAAQ,YAAY,CAAA,CAAA,GAAK,8BAAA;AAAA,UACnE,iCAAA;AAAA,UACA;AAAA,SACF,CAAE,OAAO,OAAO,CAAA;AAAA,QAChB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,uBAAA;AAAA,UACJ,WAAA,EAAa,8BAA8B,SAAS,CAAA,CAAA,CAAA;AAAA,UACpD,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,qBAAA;AAAA,UACJ,WAAA,EAAa,eAAe,SAAS,CAAA,UAAA,CAAA;AAAA,UACrC,IAAA,EAAA,UAAA;AAAA,UACA,WAAA,EAAa,KAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,kBAAA,GAAN,cAAiCA,gBAAAA,CAAgB;AAAA,EACtC,IAAA,GAAA,2BAAA;AAAA,EAEhB,WAAA,CACE,SAAA,EACA,WAAA,EACA,cAAA,EACA,OAAA,EAQA;AACA,IAAA,MAAM,UAAU,CAAA,0BAAA,EAA6B,SAAS,eAAe,cAAc,CAAA,MAAA,EAAS,OAAO,WAAW,CAAA,CAAA;AAE9G,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,2BAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,YAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,SAAA;AAAA,UACA,WAAA;AAAA,UACA,cAAA;AAAA,UACA,WAAW,OAAA,EAAS,SAAA;AAAA,UACpB,eAAe,OAAA,EAAS,aAAA;AAAA,UACxB,UAAU,OAAA,EAAS,QAAA;AAAA,UACnB,mBAAmB,OAAA,EAAS,iBAAA;AAAA,UAC5B,GAAG,SAAS,YAAA,EAAc;AAAA,SAC5B;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,CAAA,QAAA,EAAW,SAAS,CAAA,KAAA,EAAQ,cAAc,CAAA,CAAA;AAAA,UAC1C,OAAA,EAAS,aAAA,GAAgB,CAAA,aAAA,EAAgB,OAAA,CAAQ,aAAa,CAAA,CAAA,GAAK,4BAAA;AAAA,UACnE,GAAI,OAAA,EAAS,QAAA,GAAW,CAAC,CAAA,UAAA,EAAa,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA,GAAI,EAAC;AAAA,UACxE;AAAA,SACF,CAAE,OAAO,OAAO,CAAA;AAAA,QAChB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,aAAA;AAAA,UACJ,WAAA,EAAa,CAAA,sBAAA,EAAyB,SAAS,CAAA,KAAA,EAAQ,cAAc,CAAA,CAAA;AAAA,UACrE,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,gBAAA;AAAA,UACJ,WAAA,EAAa,sCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,eAAA,GAAN,cAA8BA,gBAAAA,CAAgB;AAAA,EACnC,IAAA,GAAA,yBAAA;AAAA,EAEhB,WAAA,CACE,SAAA,EACA,WAAA,EACA,QAAA,EACA,UACA,OAAA,EAOA;AACA,IAAA,IAAI,OAAA,GAAU,CAAA,iBAAA,EAAoB,SAAS,CAAA,mBAAA,EAAsB,WAAW,CAAA,CAAA;AAC5E,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,MAAA,EAAW;AACpD,MAAA,OAAA,IAAW,CAAA,SAAA,EAAY,QAAQ,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAA,CAAA;AAAA,IAC/C,CAAA,MAAA,IAAW,aAAa,MAAA,EAAW;AACjC,MAAA,OAAA,IAAW,cAAc,QAAQ,CAAA,CAAA,CAAA;AAAA,IACnC,CAAA,MAAA,IAAW,aAAa,MAAA,EAAW;AACjC,MAAA,OAAA,IAAW,cAAc,QAAQ,CAAA,CAAA,CAAA;AAAA,IACnC;AAEA,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,yBAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,YAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,SAAA;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,UACA,QAAA;AAAA,UACA,WAAW,OAAA,EAAS,SAAA;AAAA,UACpB,aAAa,OAAA,EAAS,WAAA;AAAA,UACtB,mBAAmB,OAAA,EAAS,iBAAA;AAAA,UAC5B,GAAG,SAAS,YAAA,EAAc;AAAA,SAC5B;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,MAAA,GACnC,CAAA,wBAAA,EAA2B,QAAQ,CAAA,KAAA,EAAQ,QAAQ,CAAA,CAAA,GACnD,QAAA,KAAa,MAAA,GACb,CAAA,6BAAA,EAAgC,OAAA,EAAS,WAAA,GAAc,cAAA,GAAiB,EAAE,CAAA,EAAG,QAAQ,CAAA,CAAA,GACrF,QAAA,KAAa,MAAA,GACb,CAAA,0BAAA,EAA6B,OAAA,EAAS,WAAA,GAAc,cAAA,GAAiB,EAAE,CAAA,EAAG,QAAQ,CAAA,CAAA,GAClF,wCAAA;AAAA,UACJ,6BAAA;AAAA,UACA;AAAA,SACF,CAAE,OAAO,OAAO,CAAA;AAAA,QAChB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,gBAAA;AAAA,UACJ,WAAA,EAAa,4BAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,qBAAA;AAAA,UACJ,WAAA,EAAa,iCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,kBAAA,GAAN,cAAiCA,gBAAAA,CAAgB;AAAA,EACtC,IAAA,GAAA,2BAAA;AAAA,EAEhB,WAAA,CACE,SAAA,EACA,WAAA,EACA,YAAA,EACA,OAAA,EAOA;AACA,IAAA,MAAM,OAAA,GAAU,6BAA6B,SAAS,CAAA,IAAA,EAAO,WAAW,CAAA,kBAAA,EAAqB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAEpH,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,2BAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,YAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,SAAA;AAAA,UACA,WAAA;AAAA,UACA,YAAA;AAAA,UACA,WAAW,OAAA,EAAS,SAAA;AAAA,UACpB,eAAe,OAAA,EAAS,aAAA;AAAA,UACxB,mBAAmB,OAAA,EAAS,iBAAA;AAAA,UAC5B,GAAG,SAAS,YAAA,EAAc;AAAA,SAC5B;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,CAAA,eAAA,EAAkB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UACzC,qCAAA;AAAA,UACA,iCAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,uBAAA;AAAA,UACJ,WAAA,EAAa,8BAAA;AAAA,UACb,IAAA,EAAA,UAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,oBAAA;AAAA,UACJ,WAAA,EAAa,2BAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,qBAAA,GAAN,cAAoCA,gBAAAA,CAAgB;AAAA,EACzC,IAAA,GAAA,yBAAA;AAAA,EAEhB,WAAA,CACE,UAAA,EACA,gBAAA,EACA,OAAA,EAQA;AACA,IAAA,MAAM,UAAU,CAAA,4BAAA,EAA+B,UAAU,KAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAEzF,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,yBAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,YAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,UAAA;AAAA,UACA,gBAAA;AAAA,UACA,YAAY,OAAA,EAAS,UAAA;AAAA,UACrB,eAAe,OAAA,EAAS,aAAA;AAAA,UACxB,WAAW,OAAA,EAAS,SAAA;AAAA,UACpB,mBAAmB,OAAA,EAAS,iBAAA;AAAA,UAC5B,GAAG,SAAS,YAAA,EAAc;AAAA,SAC5B;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,kDAAA;AAAA,UACA,0CAAA;AAAA,UACA,4CAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,iBAAA;AAAA,UACJ,WAAA,EAAa,wCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,wBAAA;AAAA,UACJ,WAAA,EAAa,gCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,mBAAA,GAAN,cAAkCA,gBAAAA,CAAgB;AAAA,EACvC,IAAA,GAAA,uBAAA;AAAA,EAEhB,WAAA,CACE,SAAA,EACA,UAAA,EACA,YAAA,EACA,OAAA,EAQA;AACA,IAAA,MAAM,UAAU,CAAA,kCAAA,EAAqC,SAAS,CAAA,YAAA,EAAe,YAAY,SAAS,UAAU,CAAA,CAAA;AAE5G,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,uBAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,YAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,SAAA;AAAA,UACA,UAAA;AAAA,UACA,YAAA;AAAA,UACA,WAAW,OAAA,EAAS,SAAA;AAAA,UACpB,aAAa,OAAA,EAAS,WAAA;AAAA,UACtB,cAAc,OAAA,EAAS,YAAA;AAAA,UACvB,mBAAmB,OAAA,EAAS,iBAAA;AAAA,UAC5B,GAAG,SAAS,YAAA,EAAc;AAAA,SAC5B;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,oBAAoB,YAAY,CAAA,CAAA;AAAA,UAChC,OAAA,EAAS,eAAe,CAAA,eAAA,EAAkB,OAAA,CAAQ,aAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,qBAAA;AAAA,UAC9E,6CAAA;AAAA,UACA;AAAA,SACF,CAAE,OAAO,OAAO,CAAA;AAAA,QAChB,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,mBAAA;AAAA,UACJ,WAAA,EAAa,oBAAoB,YAAY,CAAA,CAAA;AAAA,UAC7C,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,oBAAA;AAAA,UACJ,WAAA,EAAa,kCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,yBAAA,GAAN,cAAwCA,gBAAAA,CAAgB;AAAA,EAC7C,IAAA,GAAA,6BAAA;AAAA,EAEhB,WAAA,CACE,cAAA,EACA,SAAA,EACA,iBAAA,EACA,OAAA,EAQA;AACA,IAAA,MAAM,UAAU,CAAA,YAAA,EAAe,cAAc,CAAA,+BAAA,EAAkC,SAAS,MAAM,iBAAiB,CAAA,CAAA;AAE/G,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,6BAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,YAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,cAAA;AAAA,UACA,SAAA;AAAA,UACA,iBAAA;AAAA,UACA,WAAW,OAAA,EAAS,SAAA;AAAA,UACpB,aAAa,OAAA,EAAS,WAAA;AAAA,UACtB,kBAAkB,OAAA,EAAS,gBAAA;AAAA,UAC3B,mBAAmB,OAAA,EAAS,iBAAA;AAAA,UAC5B,GAAG,SAAS,YAAA,EAAc;AAAA,SAC5B;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,CAAA,cAAA,EAAiB,SAAS,CAAA,oBAAA,EAAuB,cAAc,CAAA,CAAA;AAAA,UAC/D,iDAAA;AAAA,UACA,+CAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,0BAAA;AAAA,UACJ,WAAA,EAAa,OAAO,cAAc,CAAA,qBAAA,CAAA;AAAA,UAClC,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,KAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,oBAAA;AAAA,UACJ,WAAA,EAAa,WAAW,cAAc,CAAA,wBAAA,CAAA;AAAA,UACtC,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,yBAAA,GAAN,cAAwCA,gBAAAA,CAAgB;AAAA,EAC7C,IAAA,GAAA,6BAAA;AAAA,EAEhB,WAAA,CACE,cAAA,EACA,aAAA,EACA,cAAA,EACA,OAAA,EAOA;AACA,IAAA,MAAM,UAAU,CAAA,qCAAA,EAAwC,cAAc,CAAA,YAAA,EAAe,aAAa,QAAQ,cAAc,CAAA,CAAA;AAExH,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,6BAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,YAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,cAAA;AAAA,UACA,aAAA;AAAA,UACA,cAAA;AAAA,UACA,gBAAgB,OAAA,EAAS,cAAA;AAAA,UACzB,eAAe,OAAA,EAAS,aAAA;AAAA,UACxB,mBAAmB,OAAA,EAAS,iBAAA;AAAA,UAC5B,GAAG,SAAS,YAAA,EAAc;AAAA,SAC5B;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,CAAA,QAAA,EAAW,aAAa,CAAA,EAAA,EAAK,cAAc,UAAU,cAAc,CAAA,QAAA,CAAA;AAAA,UACnE,uDAAA;AAAA,UACA,oDAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,gBAAA;AAAA,UACJ,WAAA,EAAa,CAAA,wBAAA,EAA2B,cAAc,CAAA,OAAA,EAAU,aAAa,CAAA,CAAA,CAAA;AAAA,UAC7E,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,sBAAA;AAAA,UACJ,WAAA,EAAa,uCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;;;ACthBA,YAAA,EAAA;AASO,IAAe,kBAAA,GAAf,cAA0C,aAAA,CAAc;AAAA,EAE7C,QAAA,GAAA,eAAA;AAClB;AAEO,IAAM,uBAAA,GAAN,cAAsC,kBAAA,CAAmB;AAAA,EAC9C,IAAA,GAAA,uBAAA;AAAA,EAEhB,WAAA,CAAY,UAAkB,OAAA,EAA8D;AAC1F,IAAA,KAAA,CAAM,CAAA,8BAAA,EAAiC,QAAQ,CAAA,CAAA,EAAI;AAAA,MACjD,IAAA,EAAA,uBAAA;AAAA,MACA,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,EAAE,QAAA,EAAU,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAS,EAAC;AAAA,MACrF,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf,EAAE,IAAI,uBAAA,EAAyB,WAAA,EAAa,gCAAgC,IAAA,EAAA,QAAA,eAAiC,WAAA,EAAa,IAAA,EAAM,kBAAA,EAAoB,GAAA;AAAI;AAC1J,KACD,CAAA;AAAA,EACH;AACF;AAEO,IAAM,wBAAA,GAAN,cAAuC,kBAAA,CAAmB;AAAA,EAC/C,IAAA,GAAA,uBAAA;AAAA,EAEhB,WAAA,CAAY,QAAA,EAAkB,WAAA,EAAqB,OAAA,EAA8D;AAC/G,IAAA,KAAA,CAAM,CAAA,sCAAA,EAAyC,QAAQ,CAAA,GAAA,EAAM,WAAW,CAAA,CAAA,EAAI;AAAA,MAC1E,IAAA,EAAA,uBAAA;AAAA,MACA,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,EAAE,QAAA,EAAU,WAAA,EAAa,GAAG,OAAA,EAAS,OAAA,EAAS,UAAS,EAAC;AAAA,MAClG,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf,EAAE,IAAI,YAAA,EAAc,WAAA,EAAa,4BAA4B,IAAA,EAAA,QAAA,eAAiC,WAAA,EAAa,KAAA,EAAO,kBAAA,EAAoB,GAAA;AAAI;AAC5I,KACD,CAAA;AAAA,EACH;AACF;;;AC1CA,YAAA,EAAA;AAeO,IAAeC,SAAAA,GAAf,cAAgC,aAAA,CAAc;AAAA,EACnC,QAAA,GAAA,KAAA;AAElB,CAAA;AAySO,IAAM,YAAA,GAAN,cAA2BA,SAAAA,CAAS;AAAA,EACzB,IAAA,GAAA,iBAAA;AAAA,EAEhB,WAAA,CACE,UAAA,EACA,QAAA,EACA,OAAA,EAKA;AACA,IAAA,MAAM,OAAA,GAAU,CAAA,sCAAA,EAAyC,UAAU,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAA;AAEtF,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,iBAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,OAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,UAAA;AAAA,UACA,QAAA;AAAA,UACA,aAAa,OAAA,EAAS,WAAA;AAAA,UACtB,GAAG,SAAS,OAAA,EAAS;AAAA,SACvB;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,kCAAA;AAAA,UACA,qCAAA;AAAA,UACA,mCAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,qBAAA;AAAA,UACJ,WAAA,EAAa,oCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,KAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,2BAAA;AAAA,UACJ,WAAA,EAAa,0CAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,sBAAA;AAAA,UACJ,WAAA,EAAa,uCAAA;AAAA,UACb,IAAA,EAAA,UAAA;AAAA,UACA,WAAA,EAAa,KAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,cAAA,GAAN,cAA6BA,SAAAA,CAAS;AAAA,EAC3B,IAAA,GAAA,oBAAA;AAAA,EAEhB,WAAA,CACE,UAAA,EACA,gBAAA,EACA,OAAA,EAKA;AACA,IAAA,MAAM,UAAU,CAAA,6BAAA,EAAgC,UAAU,KAAK,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAE1F,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,oBAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,OAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,UAAA;AAAA,UACA,gBAAA;AAAA,UACA,YAAY,OAAA,EAAS,UAAA;AAAA,UACrB,GAAG,SAAS,OAAA,EAAS;AAAA,SACvB;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,qCAAA;AAAA,UACA,sDAAA;AAAA,UACA,2CAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,mBAAA;AAAA,UACJ,WAAA,EAAa,qCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,iBAAA;AAAA,UACJ,WAAA,EAAa,wCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,oBAAA;AAAA,UACJ,WAAA,EAAa,+BAAA;AAAA,UACb,IAAA,EAAA,UAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,0BAAA,GAAN,cAAyCA,SAAAA,CAAS;AAAA,EACvC,IAAA,GAAA,yBAAA;AAAA,EAEhB,WAAA,CACE,UAAA,EACA,gBAAA,EACA,OAAA,EAKA;AACA,IAAA,IAAI,OAAA,GAAU,eAAe,UAAU,CAAA,iBAAA,CAAA;AACvC,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAA,IAAW,CAAA,iBAAA,EAAoB,gBAAA,CAAiB,WAAA,EAAa,CAAA,CAAA,CAAA;AAAA,IAC/D;AAEA,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,yBAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,OAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,UAAA;AAAA,UACA,gBAAA;AAAA,UACA,mBAAmB,OAAA,EAAS,iBAAA;AAAA,UAC5B,GAAG,SAAS,OAAA,EAAS;AAAA,SACvB;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,wCAAA;AAAA,UACA,oCAAA;AAAA,UACA,+BAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa,IAAA;AAAA,QACb,UAAA,EAAY,CAAA;AAAA,QACZ,UAAA,EAAY;AAAA,UACV,YAAA,EAAc,GAAA;AAAA,UACd,QAAA,EAAU,GAAA;AAAA,UACV,iBAAA,EAAmB,CAAA;AAAA,UACnB,SAAA,EAAW;AAAA;AACb,OACF;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,cAAA;AAAA,UACJ,WAAA,EAAa,iCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,gBAAA;AAAA,UACJ,WAAA,EAAa,oBAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,KAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,mBAAA;AAAA,UACJ,WAAA,EAAa,6BAAA;AAAA,UACb,IAAA,EAAA,UAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;AAKO,IAAM,oBAAA,GAAN,cAAmCA,SAAAA,CAAS;AAAA,EACjC,IAAA,GAAA,oBAAA;AAAA,EAEhB,WAAA,CACE,QAAA,EACA,UAAA,EACA,cAAA,EACA,OAAA,EAIA;AACA,IAAA,IAAI,OAAA,GAAU,CAAA,UAAA,EAAa,QAAQ,CAAA,uBAAA,EAA0B,UAAU,CAAA,CAAA,CAAA;AACvE,IAAA,IAAI,cAAA,IAAkB,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC/C,MAAA,OAAA,IAAW,CAAA,mBAAA,EAAsB,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IAC5D;AAEA,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,oBAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAG,OAAA,EAAS,OAAA;AAAA,QACZ,QAAA,EAAU;AAAA,UACR,QAAA;AAAA,UACA,UAAA;AAAA,UACA,cAAA;AAAA,UACA,GAAG,SAAS,OAAA,EAAS;AAAA,SACvB;AAAA,QACA,mBAAA,EAAqB;AAAA,UACnB,mCAAA;AAAA,UACA,4CAAA;AAAA,UACA,oDAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf;AAAA,UACE,EAAA,EAAI,uBAAA;AAAA,UACJ,WAAA,EAAa,iCAAA;AAAA,UACb,IAAA,EAAA,UAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,sBAAA;AAAA,UACJ,WAAA,EAAa,oCAAA;AAAA,UACb,IAAA,EAAA,QAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA,SACtB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,2BAAA;AAAA,UACJ,WAAA,EAAa,6CAAA;AAAA,UACb,IAAA,EAAA,UAAA;AAAA,UACA,WAAA,EAAa,IAAA;AAAA,UACb,kBAAA,EAAoB;AAAA;AACtB;AACF,KACD,CAAA;AAAA,EACH;AACF;;;AC/jBA,YAAA,EAAA;AASO,IAAe,aAAA,GAAf,cAAqC,aAAA,CAAc;AAAA,EAExC,QAAA,GAAA,UAAA;AAClB;AAEO,IAAM,qBAAA,GAAN,cAAoC,aAAA,CAAc;AAAA,EACvC,IAAA,GAAA,oBAAA;AAAA,EAEhB,WAAA,CAAY,YAAoB,OAAA,EAA8D;AAC5F,IAAA,KAAA,CAAM,CAAA,oBAAA,EAAuB,UAAU,CAAA,CAAA,EAAI;AAAA,MACzC,IAAA,EAAA,oBAAA;AAAA,MACA,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,EAAE,UAAA,EAAY,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAS,EAAC;AAAA,MACvF,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf,EAAE,IAAI,sBAAA,EAAwB,WAAA,EAAa,wBAAwB,IAAA,EAAA,UAAA,iBAAmC,WAAA,EAAa,IAAA,EAAM,kBAAA,EAAoB,GAAA;AAAI;AACnJ,KACD,CAAA;AAAA,EACH;AACF;AAEO,IAAM,mBAAA,GAAN,cAAkC,aAAA,CAAc;AAAA,EACrC,IAAA,GAAA,uBAAA;AAAA,EAEhB,WAAA,CAAY,UAAA,EAAoB,WAAA,EAAqB,OAAA,EAA8D;AACjH,IAAA,KAAA,CAAM,CAAA,yBAAA,EAA4B,UAAU,CAAA,EAAA,EAAK,WAAW,CAAA,CAAA,EAAI;AAAA,MAC9D,IAAA,EAAA,uBAAA;AAAA,MACA,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,EAAE,UAAA,EAAY,WAAA,EAAa,GAAG,OAAA,EAAS,OAAA,EAAS,UAAS,EAAC;AAAA,MACpG,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf,EAAE,IAAI,qBAAA,EAAuB,WAAA,EAAa,uBAAuB,IAAA,EAAA,QAAA,eAAiC,WAAA,EAAa,KAAA,EAAO,kBAAA,EAAoB,GAAA;AAAI;AAChJ,KACD,CAAA;AAAA,EACH;AACF;;;AC1CA,YAAA,EAAA;AASO,IAAe,YAAA,GAAf,cAAoC,aAAA,CAAc;AAAA,EAEvC,QAAA,GAAA,SAAA;AAClB;AAEO,IAAM,oBAAA,GAAN,cAAmC,YAAA,CAAa;AAAA,EACrC,IAAA,GAAA,mBAAA;AAAA,EAEhB,WAAA,CAAY,WAAmB,OAAA,EAA8D;AAC3F,IAAA,KAAA,CAAM,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAA,EAAI;AAAA,MACvC,IAAA,EAAA,mBAAA;AAAA,MACA,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,EAAE,SAAA,EAAW,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAS,EAAC;AAAA,MACtF,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf,EAAE,IAAI,oBAAA,EAAsB,WAAA,EAAa,sBAAsB,IAAA,EAAA,QAAA,eAAiC,WAAA,EAAa,IAAA,EAAM,kBAAA,EAAoB,GAAA;AAAI;AAC7I,KACD,CAAA;AAAA,EACH;AACF;AAEO,IAAM,mBAAA,GAAN,cAAkC,YAAA,CAAa;AAAA,EACpC,IAAA,GAAA,iBAAA;AAAA,EAEhB,WAAA,CAAY,SAAA,EAAmB,SAAA,EAAiB,OAAA,EAA8D;AAC5G,IAAA,KAAA,CAAM,oBAAoB,SAAS,CAAA,IAAA,EAAO,SAAA,CAAU,WAAA,EAAa,CAAA,CAAA,EAAI;AAAA,MACnE,IAAA,EAAA,iBAAA;AAAA,MACA,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,EAAE,SAAA,EAAW,SAAA,EAAW,GAAG,OAAA,EAAS,OAAA,EAAS,UAAS,EAAC;AAAA,MACjG,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf,EAAE,IAAI,iBAAA,EAAmB,WAAA,EAAa,mBAAmB,IAAA,EAAA,QAAA,eAAiC,WAAA,EAAa,IAAA,EAAM,kBAAA,EAAoB,GAAA;AAAI;AACvI,KACD,CAAA;AAAA,EACH;AACF;;;AC1CA,YAAA,EAAA;AASO,IAAe,QAAA,GAAf,cAAgC,aAAA,CAAc;AAAA,EAEnC,QAAA,GAAA,KAAA;AAClB;AAEO,IAAM,oBAAA,GAAN,cAAmC,QAAA,CAAS;AAAA,EACjC,IAAA,GAAA,uBAAA;AAAA,EAEhB,WAAA,CAAY,OAAA,EAAiB,iBAAA,EAAuC,OAAA,EAA8D;AAChI,IAAA,IAAI,OAAA,GAAU,sBAAsB,OAAO,CAAA,CAAA;AAC3C,IAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC7B,MAAA,OAAA,IAAW,CAAA,sBAAA,EAAyB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IAClE;AAEA,IAAA,KAAA,CAAM,OAAA,EAAS;AAAA,MACb,IAAA,EAAA,uBAAA;AAAA,MACA,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,EAAE,OAAA,EAAS,iBAAA,EAAmB,GAAG,OAAA,EAAS,OAAA,EAAS,UAAS,EAAC;AAAA,MACvG,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf,EAAE,IAAI,yBAAA,EAA2B,WAAA,EAAa,4BAA4B,IAAA,EAAA,UAAA,iBAAmC,WAAA,EAAa,IAAA,EAAM,kBAAA,EAAoB,GAAA;AAAI;AAC1J,KACD,CAAA;AAAA,EACH;AACF;AAEO,IAAM,qBAAA,GAAN,cAAoC,QAAA,CAAS;AAAA,EAClC,IAAA,GAAA,uBAAA;AAAA,EAEhB,WAAA,CAAY,OAAA,EAAiB,WAAA,EAAgC,OAAA,EAA8D;AACzH,IAAA,KAAA,CAAM,kCAAkC,OAAO,CAAA,GAAA,EAAM,YAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MAC7E,IAAA,EAAA,uBAAA;AAAA,MACA,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,EAAE,OAAA,EAAS,WAAA,EAAa,GAAG,OAAA,EAAS,OAAA,EAAS,UAAS,EAAC;AAAA,MACjG,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf,EAAE,IAAI,mBAAA,EAAqB,WAAA,EAAa,qBAAqB,IAAA,EAAA,QAAA,eAAiC,WAAA,EAAa,IAAA,EAAM,kBAAA,EAAoB,CAAA;AAAI;AAC3I,KACD,CAAA;AAAA,EACH;AACF;;;AC/CA,YAAA,EAAA;AASO,IAAe5G,SAAAA,GAAf,cAAgC,aAAA,CAAc;AAAA,EAEnC,QAAA,GAAA,KAAA;AAClB,CAAA;AAiBO,IAAM,oBAAA,GAAN,cAAmCA,SAAAA,CAAS;AAAA,EACjC,IAAA,GAAA,mBAAA;AAAA,EAEhB,WAAA,CAAY,QAAgB,OAAA,EAA8D;AACxF,IAAA,KAAA,CAAM,CAAA,mBAAA,EAAsB,MAAM,CAAA,CAAA,EAAI;AAAA,MACpC,IAAA,EAAA,mBAAA;AAAA,MACA,OAAA,EAAS,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAU,EAAE,MAAA,EAAQ,GAAG,OAAA,EAAS,OAAA,EAAS,QAAA,EAAS,EAAC;AAAA,MACnF,OAAO,OAAA,EAAS,KAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,QACf,EAAE,IAAI,cAAA,EAAgB,WAAA,EAAa,wBAAwB,IAAA,EAAA,UAAA,iBAAmC,WAAA,EAAa,IAAA,EAAM,kBAAA,EAAoB,CAAA;AAAI;AAC3I,KACD,CAAA;AAAA,EACH;AACF;;;AC1CA,YAAA,EAAA;AAQO,SAAS,gBAAgB,KAAA,EAAwC;AACtE,EAAA,OAAO,KAAA,YAAiB,KAAA,IAAS,UAAA,IAAc,KAAA,IAAS,MAAA,IAAU,KAAA;AACpE;AAEO,SAAS,YAAA,CAAa,OAAgB,IAAA,EAA0B;AACrE,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,IAAK,KAAA,CAAM,IAAA,KAAS,IAAA;AAClD;AAEO,SAAS,gBAAA,CAAiB,OAAgB,QAAA,EAAkC;AACjF,EAAA,OAAO,eAAA,CAAgB,KAAK,CAAA,IAAK,KAAA,CAAM,QAAA,KAAa,QAAA;AACtD;AAEO,SAAS,YAAY,KAAA,EAAwB;AAClD,EAAA,IAAI,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC1B,IAAA,OAAO,MAAM,cAAA,EAAe;AAAA,EAC9B;AACA,EAAA,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC9D;;;ACzBA,YAAA,EAAA;AAQO,IAAM,eAAN,MAAmB;AAAA,EAChB,eAAgC,EAAC;AAAA,EAElC,YAAY,KAAA,EAA4B;AAC7C,IAAA,IAAA,CAAK,YAAA,CAAa,KAAK,KAAK,CAAA;AAAA,EAE9B;AAAA,EAEO,eAAA,GAA4C;AACjD,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA,EAEO,oBAAoB,QAAA,EAAmD;AAC5E,IAAA,OAAO,KAAK,YAAA,CAAa,MAAA,CAAO,CAAA,KAAA,KAAS,KAAA,CAAM,aAAa,QAAQ,CAAA;AAAA,EACtE;AACF;AAEO,IAAM,YAAA,GAAe,IAAI,YAAA;;;ACzBhC,YAAA,EAAA;AAMO,IAAM,gBAAN,MAAoB;AAAA,EAClB,OAAO,KAAA,EAA4B;AAExC,IAAA,OAAA,CAAQ,KAAA,CAAM,SAAA,EAAW,KAAA,CAAM,MAAA,EAAQ,CAAA;AAAA,EACzC;AACF;AAEO,IAAM,aAAA,GAAgB,IAAI,aAAA;;;ACbjC,YAAA,EAAA;AAgBO,SAAS,aAAa,KAAA,EAAqC;AAGhE,EAAA,OAAO,KAAA;AACT","file":"index.js","sourcesContent":["/**\n * Version information for juno-task-ts\n */\n\n// This will be replaced by the build process\nexport const version = __VERSION__ || '1.0.0';\n\n// Development flag\nexport const isDevelopment = __DEV__ || false;","/**\n * Environment Utilities Module for juno-task-ts\n *\n * Provides comprehensive environment variable handling and detection utilities\n * for the juno-task-ts CLI tool. This module includes environment detection,\n * terminal capabilities, platform information, configuration directories,\n * and MCP server path detection.\n *\n * @module utils/environment\n */\n\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport * as process from 'node:process';\nimport { promises as fs } from 'node:fs';\n// Conditional import for execSync to improve tree shaking\n// import { execSync } from 'node:child_process';\n\n// ============================================================================\n// Types and Interfaces\n// ============================================================================\n\n/**\n * Color support levels for terminal output\n */\nexport type ColorSupport = 'none' | 'basic' | '256' | 'truecolor';\n\n/**\n * Node.js environment types\n */\nexport type NodeEnvironment = 'development' | 'production' | 'test';\n\n/**\n * Operating system platforms\n */\nexport type Platform = 'win32' | 'darwin' | 'linux' | 'freebsd' | 'openbsd' | 'sunos' | 'aix';\n\n/**\n * System architectures\n */\nexport type Architecture = 'arm' | 'arm64' | 'ia32' | 'mips' | 'mipsel' | 'ppc' | 'ppc64' | 's390' | 's390x' | 'x64';\n\n/**\n * Shell types\n */\nexport type ShellType = 'bash' | 'zsh' | 'fish' | 'cmd' | 'powershell' | 'unknown';\n\n/**\n * Process information interface\n */\nexport interface ProcessInfo {\n pid: number;\n ppid: number;\n platform: Platform;\n arch: Architecture;\n nodeVersion: string;\n uptime: number;\n cwd: string;\n execPath: string;\n argv: string[];\n env: Record<string, string | undefined>;\n}\n\n/**\n * Memory usage information\n */\nexport interface MemoryUsage {\n rss: number;\n heapTotal: number;\n heapUsed: number;\n external: number;\n arrayBuffers: number;\n}\n\n/**\n * CPU usage information\n */\nexport interface CpuUsage {\n user: number;\n system: number;\n}\n\n/**\n * MCP server environment configuration\n */\nexport interface MCPServerEnvironment {\n PATH: string;\n NODE_ENV: string;\n [key: string]: string;\n}\n\n// ============================================================================\n// Environment Detection\n// ============================================================================\n\n/**\n * Detect if running in a headless/CI environment where interactive prompts should be avoided.\n * Based on the Python implementation patterns from budi-cli.\n *\n * @returns True if running in headless/CI environment\n *\n * @example\n * ```typescript\n * if (isHeadlessEnvironment()) {\n * console.log('Using non-interactive mode');\n * }\n * ```\n */\nexport function isHeadlessEnvironment(): boolean {\n // Check for CI environment indicators (matches Python implementation)\n const ciIndicators = [\n 'CI',\n 'CONTINUOUS_INTEGRATION',\n 'GITHUB_ACTIONS',\n 'GITLAB_CI',\n 'JENKINS_URL',\n 'TRAVIS',\n 'CIRCLECI',\n 'PYTEST_CURRENT_TEST', // Pytest test runner\n 'JUNO_TASK_HEADLESS', // Our custom flag for headless testing\n 'NODE_ENV', // Additional Node.js specific\n ];\n\n for (const indicator of ciIndicators) {\n if (process.env[indicator]) {\n return true;\n }\n }\n\n // Check if stdin/stdout are connected to a terminal\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Detect if running in a continuous integration environment.\n *\n * @returns True if running in CI environment\n *\n * @example\n * ```typescript\n * if (isCIEnvironment()) {\n * console.log('Running in CI environment');\n * }\n * ```\n */\nexport function isCIEnvironment(): boolean {\n const ciIndicators = [\n 'CI',\n 'CONTINUOUS_INTEGRATION',\n 'GITHUB_ACTIONS',\n 'GITLAB_CI',\n 'JENKINS_URL',\n 'TRAVIS',\n 'CIRCLECI',\n 'BUILDKITE',\n 'AZURE_PIPELINES',\n 'TEAMCITY_VERSION',\n ];\n\n return ciIndicators.some(indicator => Boolean(process.env[indicator]));\n}\n\n/**\n * Check if terminal supports interactive input/output.\n *\n * @returns True if terminal supports interaction\n *\n * @example\n * ```typescript\n * if (isInteractiveTerminal()) {\n * // Show interactive prompts\n * }\n * ```\n */\nexport function isInteractiveTerminal(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY && !isHeadlessEnvironment());\n}\n\n/**\n * Detect if running in development mode.\n *\n * @returns True if in development mode\n *\n * @example\n * ```typescript\n * if (isDevelopmentMode()) {\n * console.log('Debug logging enabled');\n * }\n * ```\n */\nexport function isDevelopmentMode(): boolean {\n const nodeEnv = getNodeEnvironment();\n return nodeEnv === 'development' || Boolean(process.env.DEBUG);\n}\n\n/**\n * Get Node.js environment type.\n *\n * @returns The Node.js environment type\n *\n * @example\n * ```typescript\n * const env = getNodeEnvironment();\n * console.log(`Running in ${env} mode`);\n * ```\n */\nexport function getNodeEnvironment(): NodeEnvironment {\n const env = process.env.NODE_ENV?.toLowerCase();\n\n if (env === 'production') return 'production';\n if (env === 'test') return 'test';\n return 'development';\n}\n\n// ============================================================================\n// Environment Variable Utilities\n// ============================================================================\n\n/**\n * Get environment variable with optional type conversion.\n *\n * @param key - Environment variable name\n * @param defaultValue - Default value if variable is not set\n * @returns Environment variable value or default\n *\n * @example\n * ```typescript\n * const port = getEnvVar('PORT', '3000');\n * const timeout = getEnvVar('TIMEOUT', '30');\n * ```\n */\nexport function getEnvVar(key: string, defaultValue?: string): string | undefined {\n return process.env[key] ?? defaultValue;\n}\n\n/**\n * Get environment variable with fallback value.\n *\n * @param key - Environment variable name\n * @param defaultValue - Default value if variable is not set\n * @returns Environment variable value or default\n *\n * @example\n * ```typescript\n * const logLevel = getEnvVarWithDefault('LOG_LEVEL', 'info');\n * ```\n */\nexport function getEnvVarWithDefault(key: string, defaultValue: string): string {\n return process.env[key] ?? defaultValue;\n}\n\n/**\n * Set environment variable safely.\n *\n * @param key - Environment variable name\n * @param value - Value to set\n *\n * @example\n * ```typescript\n * setEnvVar('DEBUG', 'true');\n * ```\n */\nexport function setEnvVar(key: string, value: string): void {\n process.env[key] = value;\n}\n\n/**\n * Parse boolean value from environment variable string.\n *\n * @param value - Environment variable value\n * @param defaultValue - Default boolean value\n * @returns Parsed boolean value\n *\n * @example\n * ```typescript\n * const isVerbose = parseEnvBoolean(process.env.VERBOSE, false);\n * const isEnabled = parseEnvBoolean('true'); // returns true\n * ```\n */\nexport function parseEnvBoolean(value: string | undefined, defaultValue: boolean = false): boolean {\n if (!value) return defaultValue;\n\n const normalized = value.toLowerCase().trim();\n return ['true', '1', 'yes', 'on', 'enabled'].includes(normalized);\n}\n\n/**\n * Parse number value from environment variable string.\n *\n * @param value - Environment variable value\n * @param defaultValue - Default number value\n * @returns Parsed number value\n *\n * @example\n * ```typescript\n * const port = parseEnvNumber(process.env.PORT, 3000);\n * const timeout = parseEnvNumber('30'); // returns 30\n * ```\n */\nexport function parseEnvNumber(value: string | undefined, defaultValue: number = 0): number {\n if (!value) return defaultValue;\n\n const parsed = Number(value);\n return isNaN(parsed) ? defaultValue : parsed;\n}\n\n/**\n * Parse array from delimited environment variable string.\n *\n * @param value - Environment variable value\n * @param delimiter - Delimiter to split on\n * @param defaultValue - Default array value\n * @returns Parsed array\n *\n * @example\n * ```typescript\n * const paths = parseEnvArray(process.env.SEARCH_PATHS, ':', []);\n * const hosts = parseEnvArray('host1,host2,host3', ','); // returns ['host1', 'host2', 'host3']\n * ```\n */\nexport function parseEnvArray(\n value: string | undefined,\n delimiter: string = ',',\n defaultValue: string[] = []\n): string[] {\n if (!value) return defaultValue;\n\n return value.split(delimiter).map(item => item.trim()).filter(Boolean);\n}\n\n// ============================================================================\n// Terminal Detection\n// ============================================================================\n\n/**\n * Get terminal width for formatting output.\n *\n * @returns Terminal width in columns\n *\n * @example\n * ```typescript\n * const width = getTerminalWidth();\n * console.log(`Terminal width: ${width} columns`);\n * ```\n */\nexport function getTerminalWidth(): number {\n return process.stdout.columns || 80;\n}\n\n/**\n * Get terminal height for formatting output.\n *\n * @returns Terminal height in rows\n *\n * @example\n * ```typescript\n * const height = getTerminalHeight();\n * console.log(`Terminal height: ${height} rows`);\n * ```\n */\nexport function getTerminalHeight(): number {\n return process.stdout.rows || 24;\n}\n\n/**\n * Check if terminal supports color output.\n *\n * @returns True if terminal supports colors\n *\n * @example\n * ```typescript\n * if (supportsColor()) {\n * console.log('\\x1b[32mGreen text\\x1b[0m');\n * }\n * ```\n */\nexport function supportsColor(): boolean {\n // Check for explicit color support flags\n if (process.env.FORCE_COLOR) {\n return true;\n }\n\n if (process.env.NO_COLOR || process.env.NODE_DISABLE_COLORS) {\n return false;\n }\n\n // Check if we're in a TTY\n if (!process.stdout.isTTY) {\n return false;\n }\n\n // Check TERM environment variable\n const term = process.env.TERM;\n if (!term || term === 'dumb') {\n return false;\n }\n\n // Check for common color-supporting terminals\n const colorTerms = ['color', 'ansi', 'truecolor', '256color', 'xterm'];\n return colorTerms.some(colorTerm => term.includes(colorTerm));\n}\n\n/**\n * Get color capability level of the terminal.\n *\n * @returns Color support level\n *\n * @example\n * ```typescript\n * const colorSupport = getColorSupport();\n * if (colorSupport === 'truecolor') {\n * // Use RGB colors\n * }\n * ```\n */\nexport function getColorSupport(): ColorSupport {\n if (!supportsColor()) {\n return 'none';\n }\n\n const term = process.env.TERM || '';\n const colorTerm = process.env.COLORTERM || '';\n\n // Check for truecolor support\n if (colorTerm === 'truecolor' || term.includes('truecolor')) {\n return 'truecolor';\n }\n\n // Check for 256 color support\n if (term.includes('256') || term.includes('256color')) {\n return '256';\n }\n\n // Default to basic color support\n return 'basic';\n}\n\n/**\n * Detect if running inside a Docker container.\n *\n * @returns True if running in Docker\n *\n * @example\n * ```typescript\n * if (isInDocker()) {\n * console.log('Running in Docker container');\n * }\n * ```\n */\nexport function isInDocker(): boolean {\n try {\n // Check for .dockerenv file\n require('node:fs').accessSync('/.dockerenv');\n return true;\n } catch {\n // Check cgroup for docker\n try {\n const cgroup = require('node:fs').readFileSync('/proc/1/cgroup', 'utf8');\n return cgroup.includes('docker') || cgroup.includes('containerd');\n } catch {\n return false;\n }\n }\n}\n\n// ============================================================================\n// Platform Detection\n// ============================================================================\n\n/**\n * Get operating system platform information.\n *\n * @returns Platform information\n *\n * @example\n * ```typescript\n * const platform = getPlatform();\n * console.log(`Running on ${platform}`);\n * ```\n */\nexport function getPlatform(): Platform {\n return os.platform() as Platform;\n}\n\n/**\n * Get system architecture information.\n *\n * @returns System architecture\n *\n * @example\n * ```typescript\n * const arch = getArchitecture();\n * console.log(`System architecture: ${arch}`);\n * ```\n */\nexport function getArchitecture(): Architecture {\n return os.arch() as Architecture;\n}\n\n/**\n * Detect user's shell (bash, zsh, fish, etc.).\n *\n * @returns Detected shell type\n *\n * @example\n * ```typescript\n * const shell = getShell();\n * console.log(`User shell: ${shell}`);\n * ```\n */\nexport function getShell(): ShellType {\n const shell = process.env.SHELL || process.env.ComSpec || '';\n const shellName = path.basename(shell).toLowerCase();\n\n if (shellName.includes('bash')) return 'bash';\n if (shellName.includes('zsh')) return 'zsh';\n if (shellName.includes('fish')) return 'fish';\n if (shellName.includes('cmd')) return 'cmd';\n if (shellName.includes('powershell') || shellName.includes('pwsh')) return 'powershell';\n\n return 'unknown';\n}\n\n/**\n * Get user home directory path.\n *\n * @returns User home directory path\n *\n * @example\n * ```typescript\n * const home = getHomeDirectory();\n * console.log(`Home directory: ${home}`);\n * ```\n */\nexport function getHomeDirectory(): string {\n return os.homedir();\n}\n\n/**\n * Get system temporary directory path.\n *\n * @returns System temp directory path\n *\n * @example\n * ```typescript\n * const temp = getTempDirectory();\n * console.log(`Temp directory: ${temp}`);\n * ```\n */\nexport function getTempDirectory(): string {\n return os.tmpdir();\n}\n\n// ============================================================================\n// Configuration Directories\n// ============================================================================\n\n/**\n * Get user configuration directory path.\n * Follows XDG Base Directory specification on Unix systems.\n *\n * @param appName - Application name for subdirectory\n * @returns Configuration directory path\n *\n * @example\n * ```typescript\n * const configDir = getConfigDirectory('juno-task');\n * // Returns: ~/.config/juno-task (Linux), ~/Library/Application Support/juno-task (macOS), etc.\n * ```\n */\nexport function getConfigDirectory(appName: string = 'juno-task'): string {\n const platform = getPlatform();\n const home = getHomeDirectory();\n\n switch (platform) {\n case 'win32':\n return path.join(process.env.APPDATA || path.join(home, 'AppData', 'Roaming'), appName);\n case 'darwin':\n return path.join(home, 'Library', 'Application Support', appName);\n default:\n return path.join(process.env.XDG_CONFIG_HOME || path.join(home, '.config'), appName);\n }\n}\n\n/**\n * Get user data directory path.\n *\n * @param appName - Application name for subdirectory\n * @returns Data directory path\n *\n * @example\n * ```typescript\n * const dataDir = getDataDirectory('juno-task');\n * ```\n */\nexport function getDataDirectory(appName: string = 'juno-task'): string {\n const platform = getPlatform();\n const home = getHomeDirectory();\n\n switch (platform) {\n case 'win32':\n return path.join(process.env.LOCALAPPDATA || path.join(home, 'AppData', 'Local'), appName);\n case 'darwin':\n return path.join(home, 'Library', 'Application Support', appName);\n default:\n return path.join(process.env.XDG_DATA_HOME || path.join(home, '.local', 'share'), appName);\n }\n}\n\n/**\n * Get user cache directory path.\n *\n * @param appName - Application name for subdirectory\n * @returns Cache directory path\n *\n * @example\n * ```typescript\n * const cacheDir = getCacheDirectory('juno-task');\n * ```\n */\nexport function getCacheDirectory(appName: string = 'juno-task'): string {\n const platform = getPlatform();\n const home = getHomeDirectory();\n\n switch (platform) {\n case 'win32':\n return path.join(process.env.TEMP || path.join(home, 'AppData', 'Local', 'Temp'), appName);\n case 'darwin':\n return path.join(home, 'Library', 'Caches', appName);\n default:\n return path.join(process.env.XDG_CACHE_HOME || path.join(home, '.cache'), appName);\n }\n}\n\n/**\n * Create directory if it doesn't exist.\n *\n * @param dirPath - Directory path to create\n * @returns Promise that resolves when directory is created\n *\n * @example\n * ```typescript\n * await createDirectoryIfNotExists('/path/to/config');\n * ```\n */\nexport async function createDirectoryIfNotExists(dirPath: string): Promise<void> {\n try {\n await fs.mkdir(dirPath, { recursive: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'EEXIST') {\n throw error;\n }\n }\n}\n\n// ============================================================================\n// Process Information\n// ============================================================================\n\n/**\n * Get current process information.\n *\n * @returns Process information object\n *\n * @example\n * ```typescript\n * const info = getProcessInfo();\n * console.log(`Process ID: ${info.pid}`);\n * ```\n */\nexport function getProcessInfo(): ProcessInfo {\n return {\n pid: process.pid,\n ppid: process.ppid || 0,\n platform: getPlatform(),\n arch: getArchitecture(),\n nodeVersion: process.version,\n uptime: process.uptime(),\n cwd: process.cwd(),\n execPath: process.execPath,\n argv: process.argv,\n env: process.env as Record<string, string | undefined>,\n };\n}\n\n/**\n * Check if running with root/administrator privileges.\n *\n * @returns True if running as root\n *\n * @example\n * ```typescript\n * if (isRunningAsRoot()) {\n * console.warn('Running with elevated privileges');\n * }\n * ```\n */\nexport function isRunningAsRoot(): boolean {\n const platform = getPlatform();\n\n if (platform === 'win32') {\n // On Windows, check if user is in Administrators group\n try {\n // Dynamic import to improve tree shaking\n const { execSync } = require('node:child_process');\n execSync('net session', { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n } else {\n // On Unix-like systems, check UID\n return process.getuid?.() === 0;\n }\n}\n\n/**\n * Get process memory usage information.\n *\n * @returns Memory usage information\n *\n * @example\n * ```typescript\n * const memory = getMemoryUsage();\n * console.log(`Heap used: ${(memory.heapUsed / 1024 / 1024).toFixed(2)} MB`);\n * ```\n */\nexport function getMemoryUsage(): MemoryUsage {\n return process.memoryUsage();\n}\n\n/**\n * Get CPU usage information.\n *\n * @returns CPU usage information\n *\n * @example\n * ```typescript\n * const cpu = getCpuUsage();\n * console.log(`User CPU time: ${cpu.user}μs`);\n * ```\n */\nexport function getCpuUsage(): CpuUsage {\n return process.cpuUsage();\n}\n\n// ============================================================================\n// MCP Server Path Detection\n// ============================================================================\n\n/**\n * Auto-discover MCP server location.\n * Searches common installation paths and PATH environment variable.\n *\n * @param serverName - MCP server executable name\n * @returns Promise that resolves to server path or null if not found\n *\n * @example\n * ```typescript\n * const serverPath = await findMCPServerPath('mcp-server');\n * if (serverPath) {\n * console.log(`Found MCP server at: ${serverPath}`);\n * }\n * ```\n */\nexport async function findMCPServerPath(serverName: string = 'mcp-server'): Promise<string | null> {\n const platform = getPlatform();\n const searchPaths: string[] = [];\n\n // Add PATH directories\n const pathEnv = process.env.PATH || '';\n searchPaths.push(...pathEnv.split(path.delimiter));\n\n // Add platform-specific common paths\n if (platform === 'win32') {\n searchPaths.push(\n 'C:\\\\Program Files\\\\MCP\\\\bin',\n 'C:\\\\Program Files (x86)\\\\MCP\\\\bin',\n path.join(process.env.LOCALAPPDATA || '', 'Programs', 'MCP', 'bin')\n );\n } else {\n searchPaths.push(\n '/usr/local/bin',\n '/usr/bin',\n '/opt/mcp/bin',\n path.join(getHomeDirectory(), '.local', 'bin'),\n path.join(getHomeDirectory(), 'bin')\n );\n }\n\n // Add executable extension on Windows\n const executable = platform === 'win32' ? `${serverName}.exe` : serverName;\n\n // Search for the executable\n for (const searchPath of searchPaths) {\n if (!searchPath) continue;\n\n const fullPath = path.join(searchPath, executable);\n try {\n await fs.access(fullPath, fs.constants.F_OK | fs.constants.X_OK);\n return fullPath;\n } catch {\n // Continue searching\n }\n }\n\n return null;\n}\n\n/**\n * Verify MCP server path is executable.\n *\n * @param serverPath - Path to MCP server executable\n * @returns Promise that resolves to true if valid and executable\n *\n * @example\n * ```typescript\n * const isValid = await validateMCPServerPath('/usr/local/bin/mcp-server');\n * if (isValid) {\n * console.log('MCP server is valid and executable');\n * }\n * ```\n */\nexport async function validateMCPServerPath(serverPath: string): Promise<boolean> {\n try {\n const stats = await fs.stat(serverPath);\n if (!stats.isFile()) {\n return false;\n }\n\n // Check if file is executable\n await fs.access(serverPath, fs.constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get environment configuration for MCP server.\n *\n * @param additionalEnv - Additional environment variables\n * @returns MCP server environment configuration\n *\n * @example\n * ```typescript\n * const env = getMCPServerEnvironment({ DEBUG: 'true' });\n * console.log('MCP server environment:', env);\n * ```\n */\nexport function getMCPServerEnvironment(additionalEnv: Record<string, string> = {}): MCPServerEnvironment {\n const baseEnv = {\n PATH: process.env.PATH || '',\n NODE_ENV: getNodeEnvironment(),\n HOME: getHomeDirectory(),\n TMPDIR: getTempDirectory(),\n };\n\n return {\n ...baseEnv,\n ...additionalEnv,\n };\n}","/**\n * TUI Types Module for juno-task-ts\n *\n * TypeScript interfaces and types for Terminal User Interface components,\n * built on Ink + React with support for headless fallback modes.\n */\n\nimport React from 'react';\n\n// ============================================================================\n// Base TUI Types\n// ============================================================================\n\n/**\n * TUI component base props\n */\nexport interface TUIComponentProps {\n /** Component test ID for testing */\n testId?: string;\n /** Whether component is disabled */\n disabled?: boolean;\n /** Whether component should auto-focus */\n autoFocus?: boolean;\n}\n\n/**\n * TUI theme configuration\n */\nexport interface TUITheme {\n /** Primary color for highlights */\n primary: string;\n /** Secondary color for accents */\n secondary: string;\n /** Success color for positive states */\n success: string;\n /** Warning color for caution states */\n warning: string;\n /** Error color for error states */\n error: string;\n /** Muted color for disabled/secondary text */\n muted: string;\n /** Background color (for bordered components) */\n background: string;\n /** Text color */\n text: string;\n}\n\n/**\n * Default TUI theme\n */\nexport const DEFAULT_TUI_THEME: TUITheme = {\n primary: '#0066cc',\n secondary: '#6366f1',\n success: '#16a34a',\n warning: '#ca8a04',\n error: '#dc2626',\n muted: '#6b7280',\n background: '#ffffff',\n text: '#111827'\n};\n\n// ============================================================================\n// Input Component Types\n// ============================================================================\n\n/**\n * Input component props\n */\nexport interface InputProps extends TUIComponentProps {\n /** Input label text */\n label?: string;\n /** Placeholder text when empty */\n placeholder?: string;\n /** Current input value */\n value: string;\n /** Callback when value changes */\n onChange: (value: string) => void;\n /** Callback when enter is pressed */\n onSubmit?: (value: string) => void;\n /** Whether input is password type */\n isPassword?: boolean;\n /** Whether input allows multiline */\n multiline?: boolean;\n /** Maximum input length */\n maxLength?: number;\n /** Input validation function */\n validate?: (value: string) => string | null;\n /** Whether to show character count */\n showCount?: boolean;\n}\n\n/**\n * Input validation result\n */\nexport interface InputValidation {\n /** Whether input is valid */\n isValid: boolean;\n /** Error message if invalid */\n error?: string;\n}\n\n// ============================================================================\n// Spinner Component Types\n// ============================================================================\n\n/**\n * Spinner component props\n */\nexport interface SpinnerProps extends TUIComponentProps {\n /** Loading message to display */\n label?: string;\n /** Spinner type/style */\n type?: SpinnerType;\n /** Custom spinner frames */\n frames?: string[];\n /** Animation interval in milliseconds */\n interval?: number;\n}\n\n/**\n * Available spinner types\n */\nexport type SpinnerType = 'dots' | 'line' | 'arc' | 'arrow' | 'bounce' | 'pulse';\n\n// ============================================================================\n// Progress Bar Component Types\n// ============================================================================\n\n/**\n * Progress bar component props\n */\nexport interface ProgressBarProps extends TUIComponentProps {\n /** Current progress value (0-100) */\n value: number;\n /** Maximum progress value */\n max?: number;\n /** Progress label text */\n label?: string;\n /** Whether to show percentage */\n showPercentage?: boolean;\n /** Progress bar width in characters */\n width?: number;\n /** Custom progress characters */\n chars?: {\n complete: string;\n incomplete: string;\n cursor: string;\n };\n}\n\n// ============================================================================\n// Dialog Component Types\n// ============================================================================\n\n/**\n * Dialog component props\n */\nexport interface DialogProps extends TUIComponentProps {\n /** Dialog title */\n title?: string;\n /** Dialog message/content */\n message: string;\n /** Whether dialog is visible */\n isVisible: boolean;\n /** Callback when dialog is closed */\n onClose: () => void;\n /** Dialog buttons configuration */\n buttons?: DialogButton[];\n /** Dialog type affects styling */\n type?: DialogType;\n /** Whether dialog can be closed with escape */\n dismissible?: boolean;\n}\n\n/**\n * Dialog button configuration\n */\nexport interface DialogButton {\n /** Button label */\n label: string;\n /** Button action handler */\n action: () => void;\n /** Button style variant */\n variant?: ButtonVariant;\n /** Whether button is disabled */\n disabled?: boolean;\n /** Whether this is the default button */\n isDefault?: boolean;\n}\n\n/**\n * Dialog types\n */\nexport type DialogType = 'info' | 'success' | 'warning' | 'error' | 'confirm';\n\n/**\n * Button style variants\n */\nexport type ButtonVariant = 'primary' | 'secondary' | 'success' | 'warning' | 'error';\n\n// ============================================================================\n// Select Component Types\n// ============================================================================\n\n/**\n * Select component props\n */\nexport interface SelectProps<T = string> extends TUIComponentProps {\n /** Select label text */\n label?: string;\n /** Available options */\n options: SelectOption<T>[];\n /** Currently selected value */\n value?: T;\n /** Callback when selection changes */\n onChange: (value: T) => void;\n /** Whether multiple selection is allowed */\n multiple?: boolean;\n /** Placeholder when no selection */\n placeholder?: string;\n /** Whether options are searchable */\n searchable?: boolean;\n /** Maximum visible options */\n maxVisible?: number;\n}\n\n/**\n * Select option configuration\n */\nexport interface SelectOption<T = string> {\n /** Option value */\n value: T;\n /** Option display label */\n label: string;\n /** Option description */\n description?: string;\n /** Whether option is disabled */\n disabled?: boolean;\n /** Option group (for categorization) */\n group?: string;\n}\n\n// ============================================================================\n// TUI App Framework Types\n// ============================================================================\n\n/**\n * TUI application props\n */\nexport interface TUIAppProps {\n /** App title for display */\n title?: string;\n /** Whether app can be exited with ESC */\n exitOnEscape?: boolean;\n /** Custom theme configuration */\n theme?: Partial<TUITheme>;\n /** App children components */\n children: React.ReactNode;\n /** Callback when app exits */\n onExit?: (exitCode?: number) => void;\n /** Whether to clear screen on mount */\n clearOnMount?: boolean;\n}\n\n/**\n * TUI application state\n */\nexport interface TUIAppState {\n /** Whether app is active */\n isActive: boolean;\n /** Current screen/view */\n currentView?: string;\n /** App-level error state */\n error?: Error;\n /** Whether app is in fullscreen mode */\n isFullscreen: boolean;\n}\n\n// ============================================================================\n// Rendering and Context Types\n// ============================================================================\n\n/**\n * TUI render options\n */\nexport interface TUIRenderOptions {\n /** Whether to exit on unmount */\n exitOnCtrlC?: boolean;\n /** Whether to capture stdout */\n debug?: boolean;\n /** Custom output stream */\n stdout?: NodeJS.WriteStream;\n /** Custom input stream */\n stdin?: NodeJS.ReadStream;\n /** Whether to wait for render completion */\n waitUntilExit?: boolean;\n}\n\n/**\n * TUI context for sharing state\n */\nexport interface TUIContext {\n /** Current theme */\n theme: TUITheme;\n /** Whether in headless mode */\n isHeadless: boolean;\n /** Terminal dimensions */\n dimensions: {\n width: number;\n height: number;\n };\n /** Global TUI state */\n appState: TUIAppState;\n /** Theme update function */\n updateTheme: (theme: Partial<TUITheme>) => void;\n /** Exit application function */\n exit: (code?: number) => void;\n}\n\n// ============================================================================\n// Keyboard and Input Types\n// ============================================================================\n\n/**\n * Keyboard event data\n */\nexport interface KeyboardEvent {\n /** Key that was pressed */\n key: string;\n /** Whether ctrl was held */\n ctrl: boolean;\n /** Whether meta was held */\n meta: boolean;\n /** Whether shift was held */\n shift: boolean;\n /** Whether alt was held */\n alt: boolean;\n /** Raw key sequence */\n sequence: string;\n}\n\n/**\n * Key binding configuration\n */\nexport interface KeyBinding {\n /** Key combination */\n key: string;\n /** Action handler */\n handler: (event: KeyboardEvent) => boolean | void;\n /** Description for help */\n description?: string;\n /** Whether binding is global */\n global?: boolean;\n}\n\n// ============================================================================\n// Prompt Editor Types (for --interactive-prompt)\n// ============================================================================\n\n/**\n * Prompt editor configuration\n */\nexport interface PromptEditorProps extends TUIComponentProps {\n /** Initial prompt text */\n initialValue?: string;\n /** Callback when prompt is submitted */\n onSubmit: (prompt: string) => void;\n /** Callback when editor is cancelled */\n onCancel: () => void;\n /** Whether to show help */\n showHelp?: boolean;\n /** Whether to enable syntax highlighting */\n enableSyntaxHighlighting?: boolean;\n /** Maximum prompt length */\n maxLength?: number;\n /** Template variables for highlighting and completion */\n templateVariables?: Record<string, any>;\n /** Whether to show real-time preview */\n showPreview?: boolean;\n /** Whether to show token count estimation */\n showTokenCount?: boolean;\n /** Target AI model for token estimation */\n targetModel?: 'gpt-4' | 'claude-3' | 'gemini';\n /** Whether to show prompt analysis */\n showAnalysis?: boolean;\n}\n\n/**\n * Prompt editor state\n */\nexport interface PromptEditorState {\n /** Current prompt text */\n text: string;\n /** Cursor position */\n cursorPosition: number;\n /** Whether editor is in help mode */\n showingHelp: boolean;\n /** Whether text has been modified */\n isDirty: boolean;\n /** Current line number */\n currentLine: number;\n /** Total lines */\n totalLines: number;\n /** Current token count estimate */\n tokenCount?: TokenEstimate;\n /** Current prompt analysis */\n analysis?: PromptAnalysis;\n /** Template preview text */\n previewText?: string;\n}\n\n/**\n * Template variable information\n */\nexport interface TemplateVariable {\n /** Variable name */\n name: string;\n /** Variable type */\n type: 'string' | 'number' | 'boolean' | 'array';\n /** Whether variable is required */\n required: boolean;\n /** Default value */\n default?: any;\n /** Variable description */\n description?: string;\n /** Current value */\n value?: any;\n}\n\n/**\n * Token count estimation\n */\nexport interface TokenEstimate {\n /** Estimated token count */\n count: number;\n /** Whether estimate is approximate */\n approximate: boolean;\n /** Estimated cost if available */\n costEstimate?: number;\n /** Model used for estimation */\n model: string;\n}\n\n/**\n * Prompt structure analysis\n */\nexport interface PromptAnalysis {\n /** Overall quality score (0-100) */\n qualityScore: number;\n /** Structure analysis */\n structure: StructureAnalysis;\n /** Clarity analysis */\n clarity: ClarityAnalysis;\n /** Completeness analysis */\n completeness: CompletenessAnalysis;\n /** Optimization suggestions */\n suggestions: PromptSuggestion[];\n}\n\n/**\n * Prompt structure analysis\n */\nexport interface StructureAnalysis {\n /** Whether prompt has clear structure */\n hasClearStructure: boolean;\n /** Whether prompt has context section */\n hasContext: boolean;\n /** Whether prompt has task definition */\n hasTask: boolean;\n /** Whether prompt has constraints */\n hasConstraints: boolean;\n /** Whether prompt has examples */\n hasExamples: boolean;\n /** Structure score (0-100) */\n score: number;\n}\n\n/**\n * Prompt clarity analysis\n */\nexport interface ClarityAnalysis {\n /** Average sentence length */\n avgSentenceLength: number;\n /** Number of ambiguous words */\n ambiguousWordCount: number;\n /** Passive voice ratio */\n passiveVoiceRatio: number;\n /** Clarity score (0-100) */\n clarityScore: number;\n}\n\n/**\n * Prompt completeness analysis\n */\nexport interface CompletenessAnalysis {\n /** Whether prompt defines the task clearly */\n hasTaskDefinition: boolean;\n /** Whether prompt provides sufficient context */\n hasContext: boolean;\n /** Whether prompt specifies output format */\n hasOutputFormat: boolean;\n /** Whether prompt includes examples */\n hasExamples: boolean;\n /** Completeness score (0-100) */\n score: number;\n}\n\n/**\n * Prompt optimization suggestion\n */\nexport interface PromptSuggestion {\n /** Suggestion type */\n type: 'structure' | 'clarity' | 'completeness' | 'efficiency' | 'specificity';\n /** Suggestion message */\n message: string;\n /** Detailed suggestion */\n suggestion: string;\n /** Priority level */\n priority: 'low' | 'medium' | 'high';\n /** Line number if applicable */\n lineNumber?: number;\n}\n\n/**\n * Syntax highlighting token\n */\nexport interface SyntaxToken {\n /** Token text */\n text: string;\n /** Token type for styling */\n type: 'variable' | 'keyword' | 'string' | 'comment' | 'url' | 'path' | 'code' | 'plain';\n /** Start position in text */\n start: number;\n /** End position in text */\n end: number;\n /** Whether token is valid (for variables) */\n isValid?: boolean;\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * TUI event handler\n */\nexport type TUIEventHandler<T = any> = (event: T) => void;\n\n/**\n * TUI async handler\n */\nexport type TUIAsyncHandler<T = any> = (event: T) => Promise<void>;\n\n/**\n * TUI component lifecycle\n */\nexport interface TUILifecycle {\n /** Called when component mounts */\n onMount?: () => void;\n /** Called when component unmounts */\n onUnmount?: () => void;\n /** Called when component updates */\n onUpdate?: () => void;\n /** Called when component has error */\n onError?: (error: Error) => void;\n}\n\n/**\n * TUI animation frame\n */\nexport interface AnimationFrame {\n /** Frame content */\n content: string;\n /** Frame duration in ms */\n duration?: number;\n}\n\n/**\n * TUI layout dimensions\n */\nexport interface LayoutDimensions {\n /** Width in characters */\n width: number;\n /** Height in lines */\n height: number;\n /** X offset */\n x?: number;\n /** Y offset */\n y?: number;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * TUI-specific error\n */\nexport class TUIError extends Error {\n /** Error code */\n code: string;\n /** Component that caused error */\n component?: string;\n\n constructor(message: string, code: string = 'TUI_ERROR', component?: string) {\n super(message);\n this.name = 'TUIError';\n this.code = code;\n this.component = component;\n }\n}\n\n/**\n * TUI render error\n */\nexport class TUIRenderError extends TUIError {\n constructor(message: string, component?: string) {\n super(message, 'TUI_RENDER_ERROR', component);\n this.name = 'TUIRenderError';\n }\n}\n\n/**\n * TUI input error\n */\nexport class TUIInputError extends TUIError {\n constructor(message: string, component?: string) {\n super(message, 'TUI_INPUT_ERROR', component);\n this.name = 'TUIInputError';\n }\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard for TUI errors\n */\nexport function isTUIError(error: unknown): error is TUIError {\n return error instanceof TUIError;\n}\n\n/**\n * Type guard for keyboard events\n */\nexport function isKeyboardEvent(event: unknown): event is KeyboardEvent {\n return (\n typeof event === 'object' &&\n event !== null &&\n 'key' in event &&\n 'ctrl' in event\n );\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Common key mappings\n */\nexport const KEYS = {\n ENTER: 'return',\n ESCAPE: 'escape',\n TAB: 'tab',\n BACKSPACE: 'backspace',\n DELETE: 'delete',\n UP: 'upArrow',\n DOWN: 'downArrow',\n LEFT: 'leftArrow',\n RIGHT: 'rightArrow',\n HOME: 'home',\n END: 'end',\n PAGE_UP: 'pageUp',\n PAGE_DOWN: 'pageDown',\n CTRL_C: 'ctrl+c',\n CTRL_D: 'ctrl+d',\n CTRL_Z: 'ctrl+z'\n} as const;\n\n/**\n * Default spinner frames\n */\nexport const SPINNER_FRAMES = {\n dots: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'],\n line: ['|', '/', '-', '\\\\'],\n arc: ['◜', '◠', '◝', '◞', '◡', '◟'],\n arrow: ['←', '↖', '↑', '↗', '→', '↘', '↓', '↙'],\n bounce: ['⠁', '⠂', '⠄', '⠂'],\n pulse: ['●', '○', '●', '○']\n} as const;\n\n/**\n * Default progress bar characters\n */\nexport const PROGRESS_CHARS = {\n complete: '█',\n incomplete: '░',\n cursor: '█'\n} as const;","/**\n * TUI App Framework for juno-task-ts\n *\n * Base TUI application wrapper providing theme context, error boundaries,\n * keyboard handling, and common app functionality.\n */\n\nimport React, { useState, useEffect, useCallback, useRef } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport { isHeadlessEnvironment } from '../../utils/environment.js';\nimport type {\n TUIAppProps,\n TUIAppState,\n TUITheme,\n TUIContext,\n KeyBinding,\n LayoutDimensions\n} from '../types.js';\nimport { DEFAULT_TUI_THEME, TUIError } from '../types.js';\n\n/**\n * TUI Context for sharing app state and theme\n */\nconst TUIContextProvider = React.createContext<TUIContext | null>(null);\n\n/**\n * Custom hook to access TUI context\n */\nexport const useTUIContext = (): TUIContext => {\n const context = React.useContext(TUIContextProvider);\n if (!context) {\n throw new TUIError('useTUIContext must be used within a TUIApp', 'TUI_CONTEXT_ERROR');\n }\n return context;\n};\n\n/**\n * Error boundary for TUI components\n */\nclass TUIErrorBoundary extends React.Component<\n { children: React.ReactNode; onError?: (error: Error) => void },\n { hasError: boolean; error?: Error }\n> {\n constructor(props: any) {\n super(props);\n this.state = { hasError: false };\n }\n\n static getDerivedStateFromError(error: Error) {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {\n console.error('TUI Error Boundary caught an error:', error, errorInfo);\n this.props.onError?.(error);\n }\n\n render() {\n if (this.state.hasError) {\n return (\n <Box flexDirection=\"column\" padding={1}>\n <Text color=\"red\" bold>\n TUI Error: {this.state.error?.message || 'Unknown error'}\n </Text>\n <Text color=\"gray\">\n The application encountered an error and cannot continue.\n </Text>\n <Text color=\"gray\">\n Press ESC to exit or check the logs for more details.\n </Text>\n </Box>\n );\n }\n\n return this.props.children;\n }\n}\n\n/**\n * Main TUI Application wrapper component\n */\nexport const TUIApp: React.FC<TUIAppProps> = ({\n title,\n exitOnEscape = true,\n theme: customTheme = {},\n children,\n onExit,\n clearOnMount = false\n}) => {\n const [appState, setAppState] = useState<TUIAppState>({\n isActive: true,\n isFullscreen: false\n });\n\n const [currentTheme, setCurrentTheme] = useState<TUITheme>({\n ...DEFAULT_TUI_THEME,\n ...customTheme\n });\n\n const [dimensions, setDimensions] = useState<LayoutDimensions>({\n width: process.stdout.columns || 80,\n height: process.stdout.rows || 24\n });\n\n const isHeadless = isHeadlessEnvironment();\n const mountedRef = useRef(false);\n\n // Handle terminal resize\n useEffect(() => {\n const handleResize = () => {\n setDimensions({\n width: process.stdout.columns || 80,\n height: process.stdout.rows || 24\n });\n };\n\n if (!isHeadless) {\n process.stdout.on('resize', handleResize);\n return () => {\n process.stdout.off('resize', handleResize);\n };\n }\n }, [isHeadless]);\n\n // Clear screen on mount if requested\n useEffect(() => {\n if (clearOnMount && !isHeadless && !mountedRef.current) {\n process.stdout.write('\\x1b[2J\\x1b[3J\\x1b[H');\n mountedRef.current = true;\n }\n }, [clearOnMount, isHeadless]);\n\n // Update theme\n const updateTheme = useCallback((newTheme: Partial<TUITheme>) => {\n setCurrentTheme(prev => ({ ...prev, ...newTheme }));\n }, []);\n\n // Exit application\n const exit = useCallback((code: number = 0) => {\n setAppState(prev => ({ ...prev, isActive: false }));\n onExit?.(code);\n }, [onExit]);\n\n // Handle global keyboard shortcuts\n useInput(\n (input, key) => {\n if (!appState.isActive) return;\n\n // ESC to exit (if enabled)\n if (key.escape && exitOnEscape) {\n exit(0);\n return;\n }\n\n // Ctrl+C to force exit\n if (key.ctrl && input === 'c') {\n exit(130); // Standard SIGINT exit code\n return;\n }\n\n // F11 for fullscreen toggle (if supported)\n if (key.f11) {\n setAppState(prev => ({\n ...prev,\n isFullscreen: !prev.isFullscreen\n }));\n return;\n }\n },\n { isActive: appState.isActive }\n );\n\n // Handle errors\n const handleError = useCallback((error: Error) => {\n setAppState(prev => ({ ...prev, error }));\n console.error('TUI Application Error:', error);\n }, []);\n\n // Create context value\n const contextValue: TUIContext = {\n theme: currentTheme,\n isHeadless,\n dimensions,\n appState,\n updateTheme,\n exit\n };\n\n // Headless mode fallback\n if (isHeadless) {\n return (\n <TUIContextProvider.Provider value={contextValue}>\n <Box flexDirection=\"column\">\n {title && (\n <Text bold>{title}</Text>\n )}\n {children}\n </Box>\n </TUIContextProvider.Provider>\n );\n }\n\n // Full TUI mode\n return (\n <TUIContextProvider.Provider value={contextValue}>\n <TUIErrorBoundary onError={handleError}>\n <Box\n flexDirection=\"column\"\n width={dimensions.width}\n height={appState.isFullscreen ? dimensions.height : undefined}\n >\n {/* Title bar */}\n {title && (\n <Box\n width=\"100%\"\n borderStyle=\"round\"\n borderColor={currentTheme.primary}\n paddingX={1}\n marginBottom={1}\n >\n <Text color={currentTheme.primary} bold>\n {title}\n </Text>\n <Box flexGrow={1} />\n <Text color={currentTheme.muted}>\n {exitOnEscape ? 'ESC to exit' : 'Ctrl+C to exit'}\n </Text>\n </Box>\n )}\n\n {/* Main content */}\n <Box flexDirection=\"column\" flexGrow={1}>\n {children}\n </Box>\n\n {/* Error display */}\n {appState.error && (\n <Box\n marginTop={1}\n borderStyle=\"round\"\n borderColor={currentTheme.error}\n paddingX={1}\n >\n <Text color={currentTheme.error}>\n Error: {appState.error.message}\n </Text>\n </Box>\n )}\n </Box>\n </TUIErrorBoundary>\n </TUIContextProvider.Provider>\n );\n};\n\n/**\n * TUI Screen component for managing different views\n */\nexport const TUIScreen: React.FC<{\n name: string;\n isActive: boolean;\n children: React.ReactNode;\n onActivate?: () => void;\n onDeactivate?: () => void;\n}> = ({\n name,\n isActive,\n children,\n onActivate,\n onDeactivate\n}) => {\n useEffect(() => {\n if (isActive) {\n onActivate?.();\n } else {\n onDeactivate?.();\n }\n }, [isActive, onActivate, onDeactivate]);\n\n if (!isActive) {\n return null;\n }\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" height=\"100%\">\n {children}\n </Box>\n );\n};\n\n/**\n * TUI Screen manager for handling multiple screens\n */\nexport const TUIScreenManager: React.FC<{\n screens: Array<{\n name: string;\n component: React.ReactElement;\n onActivate?: () => void;\n onDeactivate?: () => void;\n }>;\n activeScreen: string;\n onScreenChange?: (screenName: string) => void;\n}> = ({\n screens,\n activeScreen,\n onScreenChange\n}) => {\n const { theme } = useTUIContext();\n\n return (\n <Box flexDirection=\"column\" width=\"100%\" height=\"100%\">\n {/* Screen tabs */}\n {screens.length > 1 && (\n <Box marginBottom={1}>\n {screens.map((screen, index) => (\n <Box key={screen.name} marginRight={1}>\n <Text\n color={screen.name === activeScreen ? theme.primary : theme.muted}\n bold={screen.name === activeScreen}\n >\n {index + 1}. {screen.name}\n </Text>\n </Box>\n ))}\n </Box>\n )}\n\n {/* Active screen content */}\n {screens.map(screen => (\n <TUIScreen\n key={screen.name}\n name={screen.name}\n isActive={screen.name === activeScreen}\n onActivate={screen.onActivate}\n onDeactivate={screen.onDeactivate}\n >\n {screen.component}\n </TUIScreen>\n ))}\n\n {/* Screen navigation help */}\n {screens.length > 1 && (\n <Box marginTop={1} justifyContent=\"center\">\n <Text color={theme.muted}>\n Use Ctrl+1-{screens.length} to switch screens\n </Text>\n </Box>\n )}\n </Box>\n );\n};\n\n/**\n * TUI Layout components for common layouts\n */\nexport const TUILayout = {\n /**\n * Two-column layout\n */\n TwoColumn: ({ left, right, ratio = 0.5 }: {\n left: React.ReactNode;\n right: React.ReactNode;\n ratio?: number;\n }) => {\n const { dimensions } = useTUIContext();\n const leftWidth = Math.floor(dimensions.width * ratio);\n const rightWidth = dimensions.width - leftWidth;\n\n return (\n <Box width=\"100%\">\n <Box width={leftWidth} flexDirection=\"column\">\n {left}\n </Box>\n <Box width={rightWidth} flexDirection=\"column\">\n {right}\n </Box>\n </Box>\n );\n },\n\n /**\n * Three-column layout\n */\n ThreeColumn: ({ left, center, right }: {\n left: React.ReactNode;\n center: React.ReactNode;\n right: React.ReactNode;\n }) => {\n const { dimensions } = useTUIContext();\n const columnWidth = Math.floor(dimensions.width / 3);\n\n return (\n <Box width=\"100%\">\n <Box width={columnWidth} flexDirection=\"column\">\n {left}\n </Box>\n <Box width={columnWidth} flexDirection=\"column\">\n {center}\n </Box>\n <Box width={columnWidth} flexDirection=\"column\">\n {right}\n </Box>\n </Box>\n );\n },\n\n /**\n * Header/Body/Footer layout\n */\n HeaderBodyFooter: ({ header, body, footer }: {\n header?: React.ReactNode;\n body: React.ReactNode;\n footer?: React.ReactNode;\n }) => (\n <Box flexDirection=\"column\" width=\"100%\" height=\"100%\">\n {header && (\n <Box width=\"100%\">\n {header}\n </Box>\n )}\n <Box flexGrow={1} width=\"100%\">\n {body}\n </Box>\n {footer && (\n <Box width=\"100%\">\n {footer}\n </Box>\n )}\n </Box>\n ),\n\n /**\n * Sidebar layout\n */\n Sidebar: ({ sidebar, main, sidebarWidth = 20 }: {\n sidebar: React.ReactNode;\n main: React.ReactNode;\n sidebarWidth?: number;\n }) => {\n const { dimensions } = useTUIContext();\n const mainWidth = dimensions.width - sidebarWidth;\n\n return (\n <Box width=\"100%\">\n <Box width={sidebarWidth} flexDirection=\"column\">\n {sidebar}\n </Box>\n <Box width={mainWidth} flexDirection=\"column\">\n {main}\n </Box>\n </Box>\n );\n }\n};\n\nexport default TUIApp;","/**\n * Input Component for juno-task-ts TUI\n *\n * Enhanced input component built on Ink with support for validation,\n * multiline input, password masking, and real-time feedback.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport chalk from 'chalk';\nimport type { InputProps, InputValidation, TUITheme } from '../types.js';\nimport { useTUIContext } from '../apps/TUIApp.js';\n\n/**\n * Enhanced input component with validation and rich features\n */\nexport const Input: React.FC<InputProps> = ({\n label,\n placeholder = '',\n value,\n onChange,\n onSubmit,\n isPassword = false,\n multiline = false,\n maxLength,\n validate,\n showCount = false,\n disabled = false,\n autoFocus = false,\n testId\n}) => {\n const { theme, isHeadless } = useTUIContext();\n const [isFocused, setIsFocused] = useState(autoFocus);\n const [validation, setValidation] = useState<InputValidation>({ isValid: true });\n const [cursorPosition, setCursorPosition] = useState(value.length);\n\n // Validate input when value changes\n useEffect(() => {\n if (validate) {\n const error = validate(value);\n setValidation({\n isValid: !error,\n error\n });\n }\n }, [value, validate]);\n\n // Handle keyboard input\n useInput(\n (input, key) => {\n if (disabled) return;\n\n // Handle special keys\n if (key.return) {\n if (multiline && !key.ctrl) {\n // Add newline in multiline mode\n const newValue = value.slice(0, cursorPosition) + '\\n' + value.slice(cursorPosition);\n onChange(newValue);\n setCursorPosition(cursorPosition + 1);\n } else {\n // Submit on Enter (or Ctrl+Enter in multiline)\n if (onSubmit && validation.isValid) {\n onSubmit(value);\n }\n }\n return;\n }\n\n if (key.backspace || key.delete) {\n if (key.backspace && cursorPosition > 0) {\n // Backspace - remove character before cursor\n const newValue = value.slice(0, cursorPosition - 1) + value.slice(cursorPosition);\n onChange(newValue);\n setCursorPosition(cursorPosition - 1);\n } else if (key.delete && cursorPosition < value.length) {\n // Delete - remove character after cursor\n const newValue = value.slice(0, cursorPosition) + value.slice(cursorPosition + 1);\n onChange(newValue);\n }\n return;\n }\n\n // Arrow key navigation\n if (key.leftArrow && cursorPosition > 0) {\n setCursorPosition(cursorPosition - 1);\n return;\n }\n\n if (key.rightArrow && cursorPosition < value.length) {\n setCursorPosition(cursorPosition + 1);\n return;\n }\n\n if (key.upArrow && multiline) {\n const lines = value.split('\\n');\n const currentLineIndex = getCurrentLineIndex(value, cursorPosition);\n if (currentLineIndex > 0) {\n const newPosition = getCursorPositionForLine(value, currentLineIndex - 1, getCursorColumnPosition(value, cursorPosition));\n setCursorPosition(newPosition);\n }\n return;\n }\n\n if (key.downArrow && multiline) {\n const lines = value.split('\\n');\n const currentLineIndex = getCurrentLineIndex(value, cursorPosition);\n if (currentLineIndex < lines.length - 1) {\n const newPosition = getCursorPositionForLine(value, currentLineIndex + 1, getCursorColumnPosition(value, cursorPosition));\n setCursorPosition(newPosition);\n }\n return;\n }\n\n if (key.home) {\n if (multiline) {\n const lineStart = getLineStartPosition(value, cursorPosition);\n setCursorPosition(lineStart);\n } else {\n setCursorPosition(0);\n }\n return;\n }\n\n if (key.end) {\n if (multiline) {\n const lineEnd = getLineEndPosition(value, cursorPosition);\n setCursorPosition(lineEnd);\n } else {\n setCursorPosition(value.length);\n }\n return;\n }\n\n // Handle regular character input\n if (input && (!maxLength || value.length < maxLength)) {\n const newValue = value.slice(0, cursorPosition) + input + value.slice(cursorPosition);\n onChange(newValue);\n setCursorPosition(cursorPosition + input.length);\n }\n },\n { isActive: isFocused && !disabled }\n );\n\n // Render display value (masked for passwords)\n const displayValue = isPassword ? '*'.repeat(value.length) : value;\n\n // Render placeholder if empty\n const showPlaceholder = !value && placeholder;\n\n // Format the display with cursor\n const formatDisplayValue = useCallback(() => {\n if (showPlaceholder) {\n return chalk.hex(theme.muted)(placeholder);\n }\n\n if (!isFocused) {\n return displayValue;\n }\n\n // Add cursor indicator when focused\n const beforeCursor = displayValue.slice(0, cursorPosition);\n const atCursor = displayValue[cursorPosition] || ' ';\n const afterCursor = displayValue.slice(cursorPosition + 1);\n\n return beforeCursor + chalk.inverse(atCursor) + afterCursor;\n }, [displayValue, cursorPosition, isFocused, showPlaceholder, placeholder, theme.muted]);\n\n // Headless mode fallback\n if (isHeadless) {\n return (\n <Box flexDirection=\"column\">\n {label && (\n <Text>{label}:</Text>\n )}\n <Text>{displayValue || placeholder}</Text>\n {validation.error && (\n <Text color=\"red\">Error: {validation.error}</Text>\n )}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" data-testid={testId}>\n {/* Label */}\n {label && (\n <Box marginBottom={1}>\n <Text color={theme.text}>{label}:</Text>\n </Box>\n )}\n\n {/* Input field */}\n <Box\n borderStyle=\"round\"\n borderColor={\n disabled\n ? theme.muted\n : validation.isValid\n ? isFocused\n ? theme.primary\n : theme.muted\n : theme.error\n }\n paddingX={1}\n minHeight={multiline ? 3 : 1}\n >\n <Text>{formatDisplayValue()}</Text>\n </Box>\n\n {/* Error message */}\n {validation.error && (\n <Box marginTop={1}>\n <Text color={theme.error}>⚠ {validation.error}</Text>\n </Box>\n )}\n\n {/* Character count */}\n {showCount && (\n <Box marginTop={1} justifyContent=\"flex-end\">\n <Text color={theme.muted}>\n {value.length}\n {maxLength && `/${maxLength}`}\n </Text>\n </Box>\n )}\n\n {/* Help text */}\n {isFocused && !disabled && (\n <Box marginTop={1}>\n <Text color={theme.muted}>\n {multiline ? 'Enter to add line • Ctrl+Enter to submit • ESC to cancel' : 'Enter to submit • ESC to cancel'}\n </Text>\n </Box>\n )}\n </Box>\n );\n};\n\n// ============================================================================\n// Helper Functions for Cursor Navigation\n// ============================================================================\n\n/**\n * Get the current line index for a cursor position\n */\nfunction getCurrentLineIndex(text: string, cursorPosition: number): number {\n const beforeCursor = text.slice(0, cursorPosition);\n return beforeCursor.split('\\n').length - 1;\n}\n\n/**\n * Get the column position within the current line\n */\nfunction getCursorColumnPosition(text: string, cursorPosition: number): number {\n const beforeCursor = text.slice(0, cursorPosition);\n const lines = beforeCursor.split('\\n');\n return lines[lines.length - 1].length;\n}\n\n/**\n * Get cursor position for a specific line and column\n */\nfunction getCursorPositionForLine(text: string, lineIndex: number, columnPosition: number): number {\n const lines = text.split('\\n');\n if (lineIndex >= lines.length) return text.length;\n\n let position = 0;\n for (let i = 0; i < lineIndex; i++) {\n position += lines[i].length + 1; // +1 for newline\n }\n\n const targetLine = lines[lineIndex];\n position += Math.min(columnPosition, targetLine.length);\n\n return position;\n}\n\n/**\n * Get the start position of the line containing the cursor\n */\nfunction getLineStartPosition(text: string, cursorPosition: number): number {\n const beforeCursor = text.slice(0, cursorPosition);\n const lastNewlineIndex = beforeCursor.lastIndexOf('\\n');\n return lastNewlineIndex === -1 ? 0 : lastNewlineIndex + 1;\n}\n\n/**\n * Get the end position of the line containing the cursor\n */\nfunction getLineEndPosition(text: string, cursorPosition: number): number {\n const afterCursor = text.slice(cursorPosition);\n const nextNewlineIndex = afterCursor.indexOf('\\n');\n return nextNewlineIndex === -1 ? text.length : cursorPosition + nextNewlineIndex;\n}\n\n// ============================================================================\n// Predefined Validation Functions\n// ============================================================================\n\n/**\n * Common validation functions for input components\n */\nexport const Validators = {\n required: (value: string) => (!value.trim() ? 'This field is required' : null),\n\n minLength: (min: number) => (value: string) =>\n value.length < min ? `Minimum length is ${min} characters` : null,\n\n maxLength: (max: number) => (value: string) =>\n value.length > max ? `Maximum length is ${max} characters` : null,\n\n email: (value: string) => {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return !emailRegex.test(value) ? 'Please enter a valid email address' : null;\n },\n\n url: (value: string) => {\n try {\n new URL(value);\n return null;\n } catch {\n return 'Please enter a valid URL';\n }\n },\n\n noEmpty: (value: string) => (!value || !value.trim() ? 'Value cannot be empty' : null),\n\n combine: (...validators: Array<(value: string) => string | null>) =>\n (value: string) => {\n for (const validator of validators) {\n const error = validator(value);\n if (error) return error;\n }\n return null;\n }\n};\n\nexport default Input;","/**\n * Dialog Component for juno-task-ts TUI\n *\n * Modal dialog component for confirmations, alerts, and user interactions.\n * Supports various dialog types with customizable buttons and keyboard navigation.\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport chalk from 'chalk';\nimport type { DialogProps, DialogButton, DialogType, ButtonVariant } from '../types.js';\nimport { useTUIContext } from '../apps/TUIApp.js';\n\n/**\n * Modal dialog component with customizable content and buttons\n */\nexport const Dialog: React.FC<DialogProps> = ({\n title,\n message,\n isVisible,\n onClose,\n buttons = [],\n type = 'info',\n dismissible = true,\n disabled = false,\n testId\n}) => {\n const { theme, isHeadless } = useTUIContext();\n const [selectedButtonIndex, setSelectedButtonIndex] = useState(0);\n\n // Default buttons if none provided\n const defaultButtons: DialogButton[] = buttons.length > 0 ? buttons : [\n {\n label: 'OK',\n action: onClose,\n variant: 'primary',\n isDefault: true\n }\n ];\n\n // Find default button or use first button\n const defaultButtonIndex = defaultButtons.findIndex(btn => btn.isDefault) || 0;\n\n // Reset selection when dialog becomes visible\n useEffect(() => {\n if (isVisible) {\n setSelectedButtonIndex(defaultButtonIndex);\n }\n }, [isVisible, defaultButtonIndex]);\n\n // Handle keyboard input\n useInput(\n (input, key) => {\n if (!isVisible || disabled) return;\n\n // ESC to close (if dismissible)\n if (key.escape && dismissible) {\n onClose();\n return;\n }\n\n // Enter to activate selected button\n if (key.return) {\n const selectedButton = defaultButtons[selectedButtonIndex];\n if (selectedButton && !selectedButton.disabled) {\n selectedButton.action();\n }\n return;\n }\n\n // Arrow keys to navigate buttons\n if (key.leftArrow || key.upArrow) {\n setSelectedButtonIndex((prev) =>\n prev === 0 ? defaultButtons.length - 1 : prev - 1\n );\n return;\n }\n\n if (key.rightArrow || key.downArrow) {\n setSelectedButtonIndex((prev) =>\n prev === defaultButtons.length - 1 ? 0 : prev + 1\n );\n return;\n }\n\n // Tab to navigate buttons\n if (key.tab) {\n setSelectedButtonIndex((prev) =>\n (prev + 1) % defaultButtons.length\n );\n return;\n }\n\n // Number keys to select buttons (1-9)\n if (input && /^[1-9]$/.test(input)) {\n const buttonIndex = parseInt(input) - 1;\n if (buttonIndex < defaultButtons.length) {\n const button = defaultButtons[buttonIndex];\n if (!button.disabled) {\n button.action();\n }\n }\n return;\n }\n\n // First letter shortcuts\n if (input && /^[a-zA-Z]$/.test(input)) {\n const letter = input.toLowerCase();\n const matchingButtonIndex = defaultButtons.findIndex(\n btn => btn.label.toLowerCase().startsWith(letter) && !btn.disabled\n );\n if (matchingButtonIndex !== -1) {\n defaultButtons[matchingButtonIndex].action();\n }\n return;\n }\n },\n { isActive: isVisible && !disabled }\n );\n\n // Don't render if not visible\n if (!isVisible) {\n return null;\n }\n\n // Get dialog styling based on type\n const getDialogStyling = (dialogType: DialogType) => {\n switch (dialogType) {\n case 'success':\n return { borderColor: theme.success, icon: '✓' };\n case 'warning':\n return { borderColor: theme.warning, icon: '⚠' };\n case 'error':\n return { borderColor: theme.error, icon: '✗' };\n case 'confirm':\n return { borderColor: theme.primary, icon: '?' };\n default:\n return { borderColor: theme.primary, icon: 'ℹ' };\n }\n };\n\n const styling = getDialogStyling(type);\n\n // Get button styling\n const getButtonStyling = (variant: ButtonVariant = 'secondary', isSelected: boolean, isDisabled: boolean) => {\n if (isDisabled) {\n return { color: theme.muted, background: '' };\n }\n\n const styles = {\n primary: { color: theme.primary, background: isSelected ? theme.primary : '' },\n secondary: { color: theme.text, background: isSelected ? theme.muted : '' },\n success: { color: theme.success, background: isSelected ? theme.success : '' },\n warning: { color: theme.warning, background: isSelected ? theme.warning : '' },\n error: { color: theme.error, background: isSelected ? theme.error : '' }\n };\n\n return styles[variant];\n };\n\n // Headless mode fallback\n if (isHeadless) {\n return (\n <Box flexDirection=\"column\">\n {title && <Text>{title}</Text>}\n <Text>{message}</Text>\n <Text>\n Options: {defaultButtons.map((btn, index) => `${index + 1}. ${btn.label}`).join(', ')}\n </Text>\n </Box>\n );\n }\n\n return (\n <Box\n position=\"absolute\"\n top={0}\n left={0}\n width=\"100%\"\n height=\"100%\"\n justifyContent=\"center\"\n alignItems=\"center\"\n data-testid={testId}\n >\n {/* Backdrop */}\n <Box\n position=\"absolute\"\n top={0}\n left={0}\n width=\"100%\"\n height=\"100%\"\n backgroundColor=\"black\"\n opacity={0.5}\n />\n\n {/* Dialog content */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={styling.borderColor}\n backgroundColor={theme.background}\n paddingX={2}\n paddingY={1}\n minWidth={40}\n maxWidth={80}\n >\n {/* Header */}\n {title && (\n <Box marginBottom={1} alignItems=\"center\">\n <Text color={styling.borderColor}>{styling.icon}</Text>\n <Text color={theme.text} bold> {title}</Text>\n </Box>\n )}\n\n {/* Message */}\n <Box marginBottom={2}>\n <Text color={theme.text}>{message}</Text>\n </Box>\n\n {/* Buttons */}\n <Box justifyContent=\"flex-end\" gap={1}>\n {defaultButtons.map((button, index) => {\n const isSelected = index === selectedButtonIndex;\n const styling = getButtonStyling(button.variant, isSelected, button.disabled);\n\n return (\n <Box\n key={index}\n borderStyle={isSelected ? 'round' : undefined}\n borderColor={isSelected ? styling.color : undefined}\n paddingX={1}\n >\n <Text\n color={styling.color}\n backgroundColor={isSelected ? styling.background : undefined}\n inverse={isSelected && !button.disabled}\n >\n {index + 1}. {button.label}\n </Text>\n </Box>\n );\n })}\n </Box>\n\n {/* Help text */}\n {!disabled && (\n <Box marginTop={1}>\n <Text color={theme.muted}>\n Use arrow keys to navigate • Enter to confirm • {dismissible ? 'ESC to cancel' : ''}\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n );\n};\n\n/**\n * Confirmation dialog with Yes/No buttons\n */\nexport const ConfirmDialog: React.FC<{\n title?: string;\n message: string;\n isVisible: boolean;\n onConfirm: () => void;\n onCancel: () => void;\n confirmLabel?: string;\n cancelLabel?: string;\n testId?: string;\n}> = ({\n title = 'Confirm',\n message,\n isVisible,\n onConfirm,\n onCancel,\n confirmLabel = 'Yes',\n cancelLabel = 'No',\n testId\n}) => {\n const buttons: DialogButton[] = [\n {\n label: cancelLabel,\n action: onCancel,\n variant: 'secondary'\n },\n {\n label: confirmLabel,\n action: onConfirm,\n variant: 'primary',\n isDefault: true\n }\n ];\n\n return (\n <Dialog\n title={title}\n message={message}\n isVisible={isVisible}\n onClose={onCancel}\n buttons={buttons}\n type=\"confirm\"\n dismissible={true}\n testId={testId}\n />\n );\n};\n\n/**\n * Alert dialog for displaying messages\n */\nexport const AlertDialog: React.FC<{\n title?: string;\n message: string;\n isVisible: boolean;\n onClose: () => void;\n type?: DialogType;\n testId?: string;\n}> = ({\n title,\n message,\n isVisible,\n onClose,\n type = 'info',\n testId\n}) => {\n const buttons: DialogButton[] = [\n {\n label: 'OK',\n action: onClose,\n variant: 'primary',\n isDefault: true\n }\n ];\n\n return (\n <Dialog\n title={title}\n message={message}\n isVisible={isVisible}\n onClose={onClose}\n buttons={buttons}\n type={type}\n dismissible={true}\n testId={testId}\n />\n );\n};\n\n/**\n * Choice dialog for selecting from multiple options\n */\nexport const ChoiceDialog: React.FC<{\n title?: string;\n message: string;\n choices: { label: string; value: any; variant?: ButtonVariant }[];\n isVisible: boolean;\n onChoice: (value: any) => void;\n onCancel?: () => void;\n testId?: string;\n}> = ({\n title,\n message,\n choices,\n isVisible,\n onChoice,\n onCancel,\n testId\n}) => {\n const buttons: DialogButton[] = [\n ...choices.map((choice, index) => ({\n label: choice.label,\n action: () => onChoice(choice.value),\n variant: choice.variant || 'secondary' as ButtonVariant,\n isDefault: index === 0\n })),\n ...(onCancel ? [{\n label: 'Cancel',\n action: onCancel,\n variant: 'secondary' as ButtonVariant\n }] : [])\n ];\n\n return (\n <Dialog\n title={title}\n message={message}\n isVisible={isVisible}\n onClose={onCancel || (() => {})}\n buttons={buttons}\n type=\"info\"\n dismissible={!!onCancel}\n testId={testId}\n />\n );\n};\n\n/**\n * Error dialog with retry option\n */\nexport const ErrorDialog: React.FC<{\n title?: string;\n message: string;\n error?: Error;\n isVisible: boolean;\n onRetry?: () => void;\n onClose: () => void;\n showDetails?: boolean;\n testId?: string;\n}> = ({\n title = 'Error',\n message,\n error,\n isVisible,\n onRetry,\n onClose,\n showDetails = false,\n testId\n}) => {\n const [showError, setShowError] = useState(false);\n\n const buttons: DialogButton[] = [\n ...(onRetry ? [{\n label: 'Retry',\n action: onRetry,\n variant: 'primary' as ButtonVariant,\n isDefault: true\n }] : []),\n {\n label: 'Close',\n action: onClose,\n variant: 'secondary' as ButtonVariant,\n isDefault: !onRetry\n },\n ...(error && showDetails ? [{\n label: showError ? 'Hide Details' : 'Show Details',\n action: () => setShowError(!showError),\n variant: 'secondary' as ButtonVariant\n }] : [])\n ];\n\n const fullMessage = showError && error\n ? `${message}\\n\\nError Details:\\n${error.message}\\n\\nStack Trace:\\n${error.stack}`\n : message;\n\n return (\n <Dialog\n title={title}\n message={fullMessage}\n isVisible={isVisible}\n onClose={onClose}\n buttons={buttons}\n type=\"error\"\n dismissible={true}\n testId={testId}\n />\n );\n};\n\n/**\n * Progress dialog for long-running operations\n */\nexport const ProgressDialog: React.FC<{\n title?: string;\n message: string;\n progress?: number;\n isVisible: boolean;\n onCancel?: () => void;\n showProgress?: boolean;\n testId?: string;\n}> = ({\n title = 'Processing',\n message,\n progress,\n isVisible,\n onCancel,\n showProgress = true,\n testId\n}) => {\n const { theme } = useTUIContext();\n\n const buttons: DialogButton[] = onCancel ? [{\n label: 'Cancel',\n action: onCancel,\n variant: 'secondary'\n }] : [];\n\n const progressBar = showProgress && typeof progress === 'number'\n ? `\\n\\n${'█'.repeat(Math.floor(progress / 5))}${'░'.repeat(20 - Math.floor(progress / 5))} ${Math.round(progress)}%`\n : '';\n\n return (\n <Dialog\n title={title}\n message={message + progressBar}\n isVisible={isVisible}\n onClose={() => {}} // Cannot close without explicit action\n buttons={buttons}\n type=\"info\"\n dismissible={false}\n testId={testId}\n />\n );\n};\n\nexport default Dialog;","/**\n * Select Component for juno-task-ts TUI\n *\n * Interactive selection component with support for single/multiple selection,\n * search filtering, grouping, and keyboard navigation.\n */\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport { Box, Text, useInput } from 'ink';\nimport chalk from 'chalk';\nimport type { SelectProps, SelectOption } from '../types.js';\nimport { useTUIContext } from '../apps/TUIApp.js';\n\n/**\n * Interactive select component with rich features\n */\nexport const Select = <T = string>({\n label,\n options,\n value,\n onChange,\n multiple = false,\n placeholder = 'Select an option...',\n searchable = false,\n maxVisible = 10,\n disabled = false,\n autoFocus = false,\n testId\n}: SelectProps<T>): React.ReactElement => {\n const { theme, isHeadless } = useTUIContext();\n const [isOpen, setIsOpen] = useState(autoFocus);\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedValues, setSelectedValues] = useState<T[]>(\n multiple ? (Array.isArray(value) ? value : value ? [value] : []) : []\n );\n\n // Filter options based on search query\n const filteredOptions = useMemo(() => {\n if (!searchQuery) return options;\n\n return options.filter(option =>\n option.label.toLowerCase().includes(searchQuery.toLowerCase()) ||\n (option.description && option.description.toLowerCase().includes(searchQuery.toLowerCase()))\n );\n }, [options, searchQuery]);\n\n // Group options if they have groups\n const groupedOptions = useMemo(() => {\n const groups: Record<string, SelectOption<T>[]> = {};\n const ungrouped: SelectOption<T>[] = [];\n\n filteredOptions.forEach(option => {\n if (option.group) {\n if (!groups[option.group]) {\n groups[option.group] = [];\n }\n groups[option.group].push(option);\n } else {\n ungrouped.push(option);\n }\n });\n\n return { groups, ungrouped };\n }, [filteredOptions]);\n\n // Flatten grouped options for navigation\n const flatOptions = useMemo(() => {\n const result: SelectOption<T>[] = [];\n\n // Add ungrouped options first\n result.push(...groupedOptions.ungrouped);\n\n // Add grouped options\n Object.entries(groupedOptions.groups).forEach(([group, groupOptions]) => {\n result.push(...groupOptions);\n });\n\n return result;\n }, [groupedOptions]);\n\n // Update selected values when value prop changes\n useEffect(() => {\n if (multiple) {\n setSelectedValues(Array.isArray(value) ? value : value ? [value] : []);\n } else {\n setSelectedValues(value ? [value] : []);\n }\n }, [value, multiple]);\n\n // Reset selected index when options change\n useEffect(() => {\n setSelectedIndex(0);\n }, [filteredOptions]);\n\n // Handle keyboard input\n useInput(\n (input, key) => {\n if (disabled) return;\n\n // Toggle dropdown\n if (key.return && !isOpen) {\n setIsOpen(true);\n return;\n }\n\n if (!isOpen) {\n // Open on any key when closed\n if (input || key.downArrow || key.upArrow) {\n setIsOpen(true);\n if (input && searchable) {\n setSearchQuery(input);\n }\n }\n return;\n }\n\n // Handle search input\n if (searchable && input && /^[a-zA-Z0-9\\s]$/.test(input)) {\n setSearchQuery(prev => prev + input);\n setSelectedIndex(0);\n return;\n }\n\n // Handle backspace in search\n if (searchable && key.backspace) {\n setSearchQuery(prev => prev.slice(0, -1));\n setSelectedIndex(0);\n return;\n }\n\n // Close dropdown\n if (key.escape) {\n setIsOpen(false);\n setSearchQuery('');\n return;\n }\n\n // Navigate options\n if (key.upArrow) {\n setSelectedIndex(prev =>\n prev === 0 ? flatOptions.length - 1 : prev - 1\n );\n return;\n }\n\n if (key.downArrow) {\n setSelectedIndex(prev =>\n prev === flatOptions.length - 1 ? 0 : prev + 1\n );\n return;\n }\n\n // Page navigation\n if (key.pageUp) {\n setSelectedIndex(prev => Math.max(0, prev - maxVisible));\n return;\n }\n\n if (key.pageDown) {\n setSelectedIndex(prev =>\n Math.min(flatOptions.length - 1, prev + maxVisible)\n );\n return;\n }\n\n // Home/End navigation\n if (key.home) {\n setSelectedIndex(0);\n return;\n }\n\n if (key.end) {\n setSelectedIndex(flatOptions.length - 1);\n return;\n }\n\n // Select option\n if (key.return) {\n const selectedOption = flatOptions[selectedIndex];\n if (selectedOption && !selectedOption.disabled) {\n if (multiple) {\n const newValues = selectedValues.includes(selectedOption.value)\n ? selectedValues.filter(v => v !== selectedOption.value)\n : [...selectedValues, selectedOption.value];\n setSelectedValues(newValues);\n onChange(newValues as any);\n } else {\n onChange(selectedOption.value);\n setIsOpen(false);\n setSearchQuery('');\n }\n }\n return;\n }\n\n // Toggle selection with space (for multiple select)\n if (multiple && key.space) {\n const selectedOption = flatOptions[selectedIndex];\n if (selectedOption && !selectedOption.disabled) {\n const newValues = selectedValues.includes(selectedOption.value)\n ? selectedValues.filter(v => v !== selectedOption.value)\n : [...selectedValues, selectedOption.value];\n setSelectedValues(newValues);\n onChange(newValues as any);\n }\n return;\n }\n },\n { isActive: !disabled }\n );\n\n // Get display text for selected values\n const getDisplayText = () => {\n if (selectedValues.length === 0) {\n return placeholder;\n }\n\n if (multiple) {\n const selectedLabels = selectedValues\n .map(val => options.find(opt => opt.value === val)?.label)\n .filter(Boolean);\n\n if (selectedLabels.length === 0) return placeholder;\n if (selectedLabels.length === 1) return selectedLabels[0];\n return `${selectedLabels.length} items selected`;\n }\n\n const selectedOption = options.find(opt => opt.value === selectedValues[0]);\n return selectedOption?.label || placeholder;\n };\n\n // Headless mode fallback\n if (isHeadless) {\n return (\n <Box flexDirection=\"column\">\n {label && <Text>{label}:</Text>}\n <Text>{getDisplayText()}</Text>\n {isOpen && (\n <Box flexDirection=\"column\" marginLeft={2}>\n {flatOptions.map((option, index) => (\n <Text key={String(option.value)} color={index === selectedIndex ? 'cyan' : 'white'}>\n {index === selectedIndex ? '> ' : ' '}\n {multiple && selectedValues.includes(option.value) ? '[✓] ' : multiple ? '[ ] ' : ''}\n {option.label}\n </Text>\n ))}\n </Box>\n )}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" data-testid={testId}>\n {/* Label */}\n {label && (\n <Box marginBottom={1}>\n <Text color={theme.text}>{label}:</Text>\n </Box>\n )}\n\n {/* Selected value display */}\n <Box\n borderStyle=\"round\"\n borderColor={\n disabled\n ? theme.muted\n : isOpen\n ? theme.primary\n : theme.muted\n }\n paddingX={1}\n >\n <Text color={selectedValues.length === 0 ? theme.muted : theme.text}>\n {getDisplayText()}\n </Text>\n <Text color={theme.muted}> {isOpen ? '▲' : '▼'}</Text>\n </Box>\n\n {/* Search input */}\n {isOpen && searchable && (\n <Box\n marginTop={1}\n borderStyle=\"round\"\n borderColor={theme.primary}\n paddingX={1}\n >\n <Text color={theme.muted}>Search: </Text>\n <Text color={theme.text}>{searchQuery}</Text>\n <Text color={theme.primary}>|</Text>\n </Box>\n )}\n\n {/* Options dropdown */}\n {isOpen && (\n <Box\n marginTop={1}\n borderStyle=\"round\"\n borderColor={theme.primary}\n paddingX={1}\n paddingY={1}\n flexDirection=\"column\"\n maxHeight={maxVisible + 2}\n >\n {flatOptions.length === 0 ? (\n <Text color={theme.muted}>No options found</Text>\n ) : (\n <>\n {/* Render ungrouped options */}\n {groupedOptions.ungrouped.map((option, globalIndex) => {\n const isSelected = selectedIndex === globalIndex;\n const isChecked = selectedValues.includes(option.value);\n\n return (\n <Box key={String(option.value)}>\n <Text\n color={\n option.disabled\n ? theme.muted\n : isSelected\n ? theme.primary\n : theme.text\n }\n backgroundColor={isSelected ? theme.primary : undefined}\n inverse={isSelected && !option.disabled}\n >\n {isSelected ? '> ' : ' '}\n {multiple && (\n <Text color={isChecked ? theme.success : theme.muted}>\n {isChecked ? '[✓] ' : '[ ] '}\n </Text>\n )}\n {option.label}\n {option.description && (\n <Text color={theme.muted}> - {option.description}</Text>\n )}\n </Text>\n </Box>\n );\n })}\n\n {/* Render grouped options */}\n {Object.entries(groupedOptions.groups).map(([groupName, groupOptions]) => {\n const groupStartIndex = groupedOptions.ungrouped.length +\n Object.entries(groupedOptions.groups)\n .slice(0, Object.keys(groupedOptions.groups).indexOf(groupName))\n .reduce((acc, [, opts]) => acc + opts.length, 0);\n\n return (\n <Box key={groupName} flexDirection=\"column\">\n {/* Group header */}\n <Box marginTop={1} marginBottom={1}>\n <Text color={theme.secondary} bold>\n {groupName}\n </Text>\n </Box>\n\n {/* Group options */}\n {groupOptions.map((option, localIndex) => {\n const globalIndex = groupStartIndex + localIndex;\n const isSelected = selectedIndex === globalIndex;\n const isChecked = selectedValues.includes(option.value);\n\n return (\n <Box key={String(option.value)} marginLeft={2}>\n <Text\n color={\n option.disabled\n ? theme.muted\n : isSelected\n ? theme.primary\n : theme.text\n }\n backgroundColor={isSelected ? theme.primary : undefined}\n inverse={isSelected && !option.disabled}\n >\n {isSelected ? '> ' : ' '}\n {multiple && (\n <Text color={isChecked ? theme.success : theme.muted}>\n {isChecked ? '[✓] ' : '[ ] '}\n </Text>\n )}\n {option.label}\n {option.description && (\n <Text color={theme.muted}> - {option.description}</Text>\n )}\n </Text>\n </Box>\n );\n })}\n </Box>\n );\n })}\n </>\n )}\n\n {/* Help text */}\n {!disabled && flatOptions.length > 0 && (\n <Box marginTop={1} borderTop borderColor={theme.muted} paddingTop={1}>\n <Text color={theme.muted}>\n {multiple ? '↑↓ navigate • Space to toggle • Enter to confirm • ESC to close' : '↑↓ navigate • Enter to select • ESC to close'}\n {searchable && ' • Type to search'}\n </Text>\n </Box>\n )}\n </Box>\n )}\n </Box>\n );\n};\n\n/**\n * Simple single-select dropdown\n */\nexport const SingleSelect = <T = string>(props: Omit<SelectProps<T>, 'multiple'>) => {\n return <Select {...props} multiple={false} />;\n};\n\n/**\n * Multi-select dropdown with checkboxes\n */\nexport const MultiSelect = <T = string>(props: Omit<SelectProps<T>, 'multiple'>) => {\n return <Select {...props} multiple={true} />;\n};\n\n/**\n * Searchable select with built-in filtering\n */\nexport const SearchableSelect = <T = string>(props: Omit<SelectProps<T>, 'searchable'>) => {\n return <Select {...props} searchable={true} />;\n};\n\n/**\n * Quick selection for common yes/no choices\n */\nexport const BooleanSelect: React.FC<{\n label?: string;\n value?: boolean;\n onChange: (value: boolean) => void;\n trueLabel?: string;\n falseLabel?: string;\n testId?: string;\n}> = ({\n label,\n value,\n onChange,\n trueLabel = 'Yes',\n falseLabel = 'No',\n testId\n}) => {\n const options: SelectOption<boolean>[] = [\n { value: true, label: trueLabel },\n { value: false, label: falseLabel }\n ];\n\n return (\n <Select\n label={label}\n options={options}\n value={value}\n onChange={onChange}\n testId={testId}\n />\n );\n};\n\n/**\n * Select with predefined common choices\n */\nexport const QuickSelect: React.FC<{\n label?: string;\n choices: string[];\n value?: string;\n onChange: (value: string) => void;\n placeholder?: string;\n testId?: string;\n}> = ({\n label,\n choices,\n value,\n onChange,\n placeholder,\n testId\n}) => {\n const options: SelectOption<string>[] = choices.map(choice => ({\n value: choice,\n label: choice\n }));\n\n return (\n <Select\n label={label}\n options={options}\n value={value}\n onChange={onChange}\n placeholder={placeholder}\n testId={testId}\n />\n );\n};\n\nexport default Select;","/**\n * Keyboard Hook for juno-task-ts TUI\n *\n * Custom hook for managing keyboard input, key bindings, and shortcuts\n * across TUI components with proper cleanup and context handling.\n */\n\nimport { useEffect, useCallback, useRef } from 'react';\nimport { useInput } from 'ink';\nimport type { KeyBinding, KeyboardEvent } from '../types.js';\n\n/**\n * Enhanced keyboard management hook\n */\nexport function useKeyboard(options: {\n /** Whether keyboard input is active */\n isActive?: boolean;\n /** Key bindings to register */\n bindings?: KeyBinding[];\n /** Global key handler */\n onKey?: (event: KeyboardEvent) => boolean | void;\n /** Whether to prevent default behavior */\n preventDefault?: boolean;\n}) {\n const {\n isActive = true,\n bindings = [],\n onKey,\n preventDefault = false\n } = options;\n\n const bindingsRef = useRef(bindings);\n const onKeyRef = useRef(onKey);\n\n // Update refs when props change\n useEffect(() => {\n bindingsRef.current = bindings;\n onKeyRef.current = onKey;\n }, [bindings, onKey]);\n\n // Main keyboard handler\n useInput(\n (input, key) => {\n // Handle special keys that might not have proper input values\n let keyName;\n if (key.return) {\n keyName = 'return';\n } else if (key.escape) {\n keyName = 'escape';\n } else if (key.tab) {\n keyName = 'tab';\n } else if (key.backspace) {\n keyName = 'backspace';\n } else if (key.delete) {\n keyName = 'delete';\n } else if (key.upArrow) {\n keyName = 'upArrow';\n } else if (key.downArrow) {\n keyName = 'downArrow';\n } else if (key.leftArrow) {\n keyName = 'leftArrow';\n } else if (key.rightArrow) {\n keyName = 'rightArrow';\n } else if (key.pageUp) {\n keyName = 'pageUp';\n } else if (key.pageDown) {\n keyName = 'pageDown';\n } else if (key.home) {\n keyName = 'home';\n } else if (key.end) {\n keyName = 'end';\n } else {\n // For regular characters and special characters like backslash\n keyName = input || 'unknown';\n }\n\n const keyEvent: KeyboardEvent = {\n key: keyName,\n ctrl: key.ctrl || false,\n meta: key.meta || false,\n shift: key.shift || false,\n alt: key.alt || false,\n sequence: `${key.ctrl ? 'ctrl+' : ''}${key.meta ? 'meta+' : ''}${key.shift ? 'shift+' : ''}${key.alt ? 'alt+' : ''}${input || keyName}`\n };\n\n // Try key bindings first\n for (const binding of bindingsRef.current) {\n if (matchesKeyBinding(keyEvent, binding)) {\n const result = binding.handler(keyEvent);\n if (result !== false && preventDefault) {\n return; // Prevent further processing\n }\n }\n }\n\n // Call global key handler\n if (onKeyRef.current) {\n const result = onKeyRef.current(keyEvent);\n if (result === false) {\n return; // Handler explicitly prevented default\n }\n }\n },\n { isActive }\n );\n\n // Register a new key binding\n const registerBinding = useCallback((binding: KeyBinding) => {\n bindingsRef.current = [...bindingsRef.current, binding];\n }, []);\n\n // Unregister a key binding\n const unregisterBinding = useCallback((key: string) => {\n bindingsRef.current = bindingsRef.current.filter(b => b.key !== key);\n }, []);\n\n // Clear all bindings\n const clearBindings = useCallback(() => {\n bindingsRef.current = [];\n }, []);\n\n return {\n registerBinding,\n unregisterBinding,\n clearBindings\n };\n}\n\n/**\n * Hook for managing global keyboard shortcuts\n */\nexport function useGlobalShortcuts(shortcuts: Record<string, () => void>) {\n const bindings: KeyBinding[] = Object.entries(shortcuts).map(([key, handler]) => ({\n key,\n handler: () => {\n handler();\n return false; // Prevent further processing\n },\n global: true\n }));\n\n useKeyboard({ bindings });\n}\n\n/**\n * Hook for navigation keyboard shortcuts\n */\nexport function useNavigationKeys(options: {\n onUp?: () => void;\n onDown?: () => void;\n onLeft?: () => void;\n onRight?: () => void;\n onHome?: () => void;\n onEnd?: () => void;\n onPageUp?: () => void;\n onPageDown?: () => void;\n onEnter?: () => void;\n onEscape?: () => void;\n isActive?: boolean;\n}) {\n const {\n onUp,\n onDown,\n onLeft,\n onRight,\n onHome,\n onEnd,\n onPageUp,\n onPageDown,\n onEnter,\n onEscape,\n isActive = true\n } = options;\n\n const bindings: KeyBinding[] = [\n onUp && { key: 'upArrow', handler: onUp },\n onDown && { key: 'downArrow', handler: onDown },\n onLeft && { key: 'leftArrow', handler: onLeft },\n onRight && { key: 'rightArrow', handler: onRight },\n onHome && { key: 'home', handler: onHome },\n onEnd && { key: 'end', handler: onEnd },\n onPageUp && { key: 'pageUp', handler: onPageUp },\n onPageDown && { key: 'pageDown', handler: onPageDown },\n onEnter && { key: 'return', handler: onEnter },\n onEscape && { key: 'escape', handler: onEscape }\n ].filter(Boolean) as KeyBinding[];\n\n useKeyboard({ bindings, isActive });\n}\n\n/**\n * Hook for text editing keyboard shortcuts\n */\nexport function useTextEditingKeys(options: {\n onCopy?: () => void;\n onPaste?: () => void;\n onCut?: () => void;\n onUndo?: () => void;\n onRedo?: () => void;\n onSelectAll?: () => void;\n isActive?: boolean;\n}) {\n const {\n onCopy,\n onPaste,\n onCut,\n onUndo,\n onRedo,\n onSelectAll,\n isActive = true\n } = options;\n\n const bindings: KeyBinding[] = [\n onCopy && { key: 'ctrl+c', handler: onCopy },\n onPaste && { key: 'ctrl+v', handler: onPaste },\n onCut && { key: 'ctrl+x', handler: onCut },\n onUndo && { key: 'ctrl+z', handler: onUndo },\n onRedo && { key: 'ctrl+y', handler: onRedo },\n onSelectAll && { key: 'ctrl+a', handler: onSelectAll }\n ].filter(Boolean) as KeyBinding[];\n\n useKeyboard({ bindings, isActive });\n}\n\n/**\n * Hook for form keyboard shortcuts\n */\nexport function useFormKeys(options: {\n onSubmit?: () => void;\n onCancel?: () => void;\n onNext?: () => void;\n onPrevious?: () => void;\n isActive?: boolean;\n}) {\n const {\n onSubmit,\n onCancel,\n onNext,\n onPrevious,\n isActive = true\n } = options;\n\n const bindings: KeyBinding[] = [\n onSubmit && { key: 'return', handler: onSubmit },\n onSubmit && { key: 'ctrl+return', handler: onSubmit },\n onCancel && { key: 'escape', handler: onCancel },\n onNext && { key: 'tab', handler: onNext },\n onPrevious && { key: 'shift+tab', handler: onPrevious }\n ].filter(Boolean) as KeyBinding[];\n\n useKeyboard({ bindings, isActive });\n}\n\n/**\n * Hook for application-level keyboard shortcuts\n */\nexport function useAppShortcuts(options: {\n onQuit?: () => void;\n onHelp?: () => void;\n onRefresh?: () => void;\n onSettings?: () => void;\n onFullscreen?: () => void;\n isActive?: boolean;\n}) {\n const {\n onQuit,\n onHelp,\n onRefresh,\n onSettings,\n onFullscreen,\n isActive = true\n } = options;\n\n const bindings: KeyBinding[] = [\n onQuit && { key: 'ctrl+q', handler: onQuit },\n onQuit && { key: 'ctrl+c', handler: onQuit },\n onHelp && { key: 'f1', handler: onHelp },\n onHelp && { key: 'ctrl+h', handler: onHelp },\n onRefresh && { key: 'f5', handler: onRefresh },\n onRefresh && { key: 'ctrl+r', handler: onRefresh },\n onSettings && { key: 'ctrl+comma', handler: onSettings },\n onFullscreen && { key: 'f11', handler: onFullscreen }\n ].filter(Boolean) as KeyBinding[];\n\n useKeyboard({ bindings, isActive });\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Check if a keyboard event matches a key binding\n */\nfunction matchesKeyBinding(event: KeyboardEvent, binding: KeyBinding): boolean {\n const bindingParts = binding.key.toLowerCase().split('+');\n const keyPart = bindingParts[bindingParts.length - 1];\n const modifiers = bindingParts.slice(0, -1);\n\n // Check main key\n if (event.key.toLowerCase() !== keyPart) {\n return false;\n }\n\n // Check modifiers\n const hasCtrl = modifiers.includes('ctrl');\n const hasMeta = modifiers.includes('meta') || modifiers.includes('cmd');\n const hasShift = modifiers.includes('shift');\n const hasAlt = modifiers.includes('alt');\n\n return (\n event.ctrl === hasCtrl &&\n event.meta === hasMeta &&\n event.shift === hasShift &&\n event.alt === hasAlt\n );\n}\n\n/**\n * Create a key sequence string from a keyboard event\n */\nexport function createKeySequence(event: KeyboardEvent): string {\n const parts: string[] = [];\n\n if (event.ctrl) parts.push('ctrl');\n if (event.meta) parts.push('meta');\n if (event.shift) parts.push('shift');\n if (event.alt) parts.push('alt');\n parts.push(event.key);\n\n return parts.join('+');\n}\n\n/**\n * Parse a key binding string into components\n */\nexport function parseKeyBinding(binding: string): {\n key: string;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n alt: boolean;\n} {\n const parts = binding.toLowerCase().split('+');\n const key = parts[parts.length - 1];\n const modifiers = parts.slice(0, -1);\n\n return {\n key,\n ctrl: modifiers.includes('ctrl'),\n meta: modifiers.includes('meta') || modifiers.includes('cmd'),\n shift: modifiers.includes('shift'),\n alt: modifiers.includes('alt')\n };\n}","/**\n * TUI State Management Hook for juno-task-ts\n *\n * Custom hooks for managing TUI component state, form state, and\n * application-level state with persistence and validation.\n */\n\nimport { useState, useEffect, useCallback, useRef } from 'react';\nimport type { InputValidation } from '../types.js';\n\n/**\n * Enhanced state hook with persistence and validation\n */\nexport function useTUIState<T>(\n initialValue: T,\n options: {\n /** Validation function */\n validate?: (value: T) => string | null;\n /** Persistence key for localStorage */\n persistKey?: string;\n /** Debounce delay for validation */\n debounceMs?: number;\n /** Callback when value changes */\n onChange?: (value: T) => void;\n /** Callback when validation state changes */\n onValidationChange?: (validation: InputValidation) => void;\n } = {}\n) {\n const {\n validate,\n persistKey,\n debounceMs = 300,\n onChange,\n onValidationChange\n } = options;\n\n // Load initial value from persistence if available\n const getInitialValue = (): T => {\n if (persistKey && typeof localStorage !== 'undefined') {\n try {\n const stored = localStorage.getItem(persistKey);\n if (stored) {\n return JSON.parse(stored);\n }\n } catch {\n // Ignore persistence errors\n }\n }\n return initialValue;\n };\n\n const [value, setValue] = useState<T>(getInitialValue);\n const [validation, setValidation] = useState<InputValidation>({ isValid: true });\n const [isDirty, setIsDirty] = useState(false);\n const debounceRef = useRef<NodeJS.Timeout>();\n\n // Validate value\n const validateValue = useCallback((val: T) => {\n if (!validate) {\n setValidation({ isValid: true });\n return;\n }\n\n const error = validate(val);\n const newValidation = {\n isValid: !error,\n error\n };\n\n setValidation(newValidation);\n onValidationChange?.(newValidation);\n }, [validate, onValidationChange]);\n\n // Debounced validation\n useEffect(() => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n\n debounceRef.current = setTimeout(() => {\n validateValue(value);\n }, debounceMs);\n\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, [value, validateValue, debounceMs]);\n\n // Persist value changes\n useEffect(() => {\n if (persistKey && typeof localStorage !== 'undefined' && isDirty) {\n try {\n localStorage.setItem(persistKey, JSON.stringify(value));\n } catch {\n // Ignore persistence errors\n }\n }\n }, [value, persistKey, isDirty]);\n\n // Call onChange callback\n useEffect(() => {\n if (isDirty) {\n onChange?.(value);\n }\n }, [value, onChange, isDirty]);\n\n const updateValue = useCallback((newValue: T | ((prev: T) => T)) => {\n setValue(prev => {\n const updated = typeof newValue === 'function' ? (newValue as (prev: T) => T)(prev) : newValue;\n setIsDirty(true);\n return updated;\n });\n }, []);\n\n const reset = useCallback(() => {\n setValue(initialValue);\n setIsDirty(false);\n setValidation({ isValid: true });\n }, [initialValue]);\n\n const clearPersistence = useCallback(() => {\n if (persistKey && typeof localStorage !== 'undefined') {\n try {\n localStorage.removeItem(persistKey);\n } catch {\n // Ignore persistence errors\n }\n }\n }, [persistKey]);\n\n return {\n value,\n setValue: updateValue,\n validation,\n isDirty,\n reset,\n clearPersistence,\n isValid: validation.isValid\n };\n}\n\n/**\n * Form state management hook\n */\nexport function useFormState<T extends Record<string, any>>(\n initialValues: T,\n options: {\n /** Field validation rules */\n validationRules?: Partial<Record<keyof T, (value: any) => string | null>>;\n /** Form-level validation */\n validateForm?: (values: T) => Record<string, string> | null;\n /** Persistence key */\n persistKey?: string;\n /** Callback when form values change */\n onChange?: (values: T) => void;\n /** Callback when form is submitted */\n onSubmit?: (values: T) => void | Promise<void>;\n } = {}\n) {\n const {\n validationRules = {},\n validateForm,\n persistKey,\n onChange,\n onSubmit\n } = options;\n\n const [values, setValues] = useState<T>(initialValues);\n const [errors, setErrors] = useState<Partial<Record<keyof T, string>>>({});\n const [touched, setTouched] = useState<Partial<Record<keyof T, boolean>>>({});\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isDirty, setIsDirty] = useState(false);\n\n // Validate individual field\n const validateField = useCallback((name: keyof T, value: any) => {\n const validator = validationRules[name];\n if (!validator) return null;\n\n return validator(value);\n }, [validationRules]);\n\n // Validate entire form\n const validateAllFields = useCallback(() => {\n const newErrors: Partial<Record<keyof T, string>> = {};\n\n // Validate individual fields\n Object.keys(values).forEach(key => {\n const fieldKey = key as keyof T;\n const error = validateField(fieldKey, values[fieldKey]);\n if (error) {\n newErrors[fieldKey] = error;\n }\n });\n\n // Validate form as a whole\n if (validateForm) {\n const formErrors = validateForm(values);\n if (formErrors) {\n Object.assign(newErrors, formErrors);\n }\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n }, [values, validateField, validateForm]);\n\n // Update field value\n const setFieldValue = useCallback((name: keyof T, value: any) => {\n setValues(prev => {\n const updated = { ...prev, [name]: value };\n setIsDirty(true);\n onChange?.(updated);\n return updated;\n });\n\n // Validate field if it has been touched\n if (touched[name]) {\n const error = validateField(name, value);\n setErrors(prev => ({\n ...prev,\n [name]: error || undefined\n }));\n }\n }, [touched, validateField, onChange]);\n\n // Mark field as touched\n const setFieldTouched = useCallback((name: keyof T, isTouched: boolean = true) => {\n setTouched(prev => ({ ...prev, [name]: isTouched }));\n\n // Validate field when touched\n if (isTouched) {\n const error = validateField(name, values[name]);\n setErrors(prev => ({\n ...prev,\n [name]: error || undefined\n }));\n }\n }, [values, validateField]);\n\n // Get field props (value, error, touched status)\n const getFieldProps = useCallback((name: keyof T) => ({\n value: values[name],\n error: errors[name],\n touched: touched[name] || false,\n onChange: (value: any) => setFieldValue(name, value),\n onBlur: () => setFieldTouched(name, true)\n }), [values, errors, touched, setFieldValue, setFieldTouched]);\n\n // Handle form submission\n const handleSubmit = useCallback(async () => {\n // Mark all fields as touched\n const allFields = Object.keys(values) as Array<keyof T>;\n const touchedState: Partial<Record<keyof T, boolean>> = {};\n allFields.forEach(field => {\n touchedState[field] = true;\n });\n setTouched(touchedState);\n\n // Validate form\n const isValid = validateAllFields();\n if (!isValid) {\n return false;\n }\n\n // Submit form\n if (onSubmit) {\n setIsSubmitting(true);\n try {\n await onSubmit(values);\n return true;\n } catch (error) {\n console.error('Form submission error:', error);\n return false;\n } finally {\n setIsSubmitting(false);\n }\n }\n\n return true;\n }, [values, validateAllFields, onSubmit]);\n\n // Reset form\n const reset = useCallback(() => {\n setValues(initialValues);\n setErrors({});\n setTouched({});\n setIsDirty(false);\n setIsSubmitting(false);\n }, [initialValues]);\n\n // Check if form is valid\n const isValid = Object.keys(errors).length === 0;\n\n return {\n values,\n errors,\n touched,\n isSubmitting,\n isDirty,\n isValid,\n setFieldValue,\n setFieldTouched,\n getFieldProps,\n handleSubmit,\n reset,\n validateAllFields\n };\n}\n\n/**\n * List state management hook (for managing arrays/lists)\n */\nexport function useListState<T>(\n initialItems: T[] = [],\n options: {\n /** Unique key extractor */\n keyExtractor?: (item: T, index: number) => string | number;\n /** Maximum number of items */\n maxItems?: number;\n /** Callback when items change */\n onChange?: (items: T[]) => void;\n } = {}\n) {\n const { keyExtractor, maxItems, onChange } = options;\n\n const [items, setItems] = useState<T[]>(initialItems);\n const [selectedIndexes, setSelectedIndexes] = useState<Set<number>>(new Set());\n\n // Add item\n const addItem = useCallback((item: T, index?: number) => {\n setItems(prev => {\n const newItems = [...prev];\n const targetIndex = index ?? newItems.length;\n\n // Check max items limit\n if (maxItems && newItems.length >= maxItems) {\n return prev; // Don't add if at limit\n }\n\n newItems.splice(targetIndex, 0, item);\n onChange?.(newItems);\n return newItems;\n });\n }, [maxItems, onChange]);\n\n // Remove item\n const removeItem = useCallback((index: number) => {\n setItems(prev => {\n const newItems = prev.filter((_, i) => i !== index);\n onChange?.(newItems);\n return newItems;\n });\n\n // Update selected indexes\n setSelectedIndexes(prev => {\n const newSelected = new Set<number>();\n prev.forEach(selectedIndex => {\n if (selectedIndex < index) {\n newSelected.add(selectedIndex);\n } else if (selectedIndex > index) {\n newSelected.add(selectedIndex - 1);\n }\n });\n return newSelected;\n });\n }, [onChange]);\n\n // Update item\n const updateItem = useCallback((index: number, updater: T | ((prev: T) => T)) => {\n setItems(prev => {\n const newItems = [...prev];\n newItems[index] = typeof updater === 'function'\n ? (updater as (prev: T) => T)(newItems[index])\n : updater;\n onChange?.(newItems);\n return newItems;\n });\n }, [onChange]);\n\n // Move item\n const moveItem = useCallback((fromIndex: number, toIndex: number) => {\n setItems(prev => {\n const newItems = [...prev];\n const [movedItem] = newItems.splice(fromIndex, 1);\n newItems.splice(toIndex, 0, movedItem);\n onChange?.(newItems);\n return newItems;\n });\n }, [onChange]);\n\n // Clear all items\n const clearItems = useCallback(() => {\n setItems([]);\n setSelectedIndexes(new Set());\n onChange?.([]);\n }, [onChange]);\n\n // Selection management\n const selectItem = useCallback((index: number) => {\n setSelectedIndexes(prev => new Set([...prev, index]));\n }, []);\n\n const deselectItem = useCallback((index: number) => {\n setSelectedIndexes(prev => {\n const newSelected = new Set(prev);\n newSelected.delete(index);\n return newSelected;\n });\n }, []);\n\n const toggleSelection = useCallback((index: number) => {\n setSelectedIndexes(prev => {\n const newSelected = new Set(prev);\n if (newSelected.has(index)) {\n newSelected.delete(index);\n } else {\n newSelected.add(index);\n }\n return newSelected;\n });\n }, []);\n\n const clearSelection = useCallback(() => {\n setSelectedIndexes(new Set());\n }, []);\n\n const selectAll = useCallback(() => {\n setSelectedIndexes(new Set(items.map((_, index) => index)));\n }, [items]);\n\n // Get selected items\n const selectedItems = items.filter((_, index) => selectedIndexes.has(index));\n\n return {\n items,\n selectedIndexes: Array.from(selectedIndexes),\n selectedItems,\n addItem,\n removeItem,\n updateItem,\n moveItem,\n clearItems,\n selectItem,\n deselectItem,\n toggleSelection,\n clearSelection,\n selectAll,\n isEmpty: items.length === 0,\n count: items.length,\n isAtMaxCapacity: maxItems ? items.length >= maxItems : false\n };\n}\n\nexport default useTUIState;","/**\n * Template Variable Utilities for Prompt Editor\n *\n * Provides template variable parsing, highlighting, and completion functionality\n * as specified in the Prompt Editor Module specification.\n */\n\nimport type { TemplateVariable, SyntaxToken } from '../types.js';\n\n/**\n * Template variable patterns for different syntax styles\n */\nexport const VARIABLE_PATTERNS = {\n /** Standard {VARIABLE_NAME} syntax */\n standard: /\\{([A-Z_][A-Z0-9_]*)\\}/g,\n /** Conditional {% if condition %} syntax */\n conditional: /\\{%\\s*(if|unless|for)\\s+([^%]+)\\s*%\\}/g,\n /** Expression {{ expression }} syntax */\n expression: /\\{\\{([^}]+)\\}\\}/g,\n /** Environment variable $VAR or ${VAR} syntax */\n environment: /\\$\\{?([A-Z_][A-Z0-9_]*)\\}?/g\n} as const;\n\n/**\n * Extract template variables from text\n */\nexport function extractTemplateVariables(text: string): string[] {\n const variables = new Set<string>();\n\n // Extract standard variables\n const standardMatches = text.matchAll(VARIABLE_PATTERNS.standard);\n for (const match of standardMatches) {\n variables.add(match[1]);\n }\n\n // Extract environment variables\n const envMatches = text.matchAll(VARIABLE_PATTERNS.environment);\n for (const match of envMatches) {\n variables.add(match[1]);\n }\n\n return Array.from(variables);\n}\n\n/**\n * Parse text and return syntax tokens for highlighting\n */\nexport function parseTemplateTokens(\n text: string,\n knownVariables: Record<string, any> = {}\n): SyntaxToken[] {\n const tokens: SyntaxToken[] = [];\n let lastIndex = 0;\n\n // Find all variable matches\n const allMatches: Array<{ match: RegExpMatchArray; type: string }> = [];\n\n // Standard variables\n for (const match of text.matchAll(VARIABLE_PATTERNS.standard)) {\n allMatches.push({ match, type: 'variable' });\n }\n\n // Environment variables\n for (const match of text.matchAll(VARIABLE_PATTERNS.environment)) {\n allMatches.push({ match, type: 'variable' });\n }\n\n // Sort matches by position\n allMatches.sort((a, b) => (a.match.index || 0) - (b.match.index || 0));\n\n // Process matches and create tokens\n for (const { match, type } of allMatches) {\n const start = match.index || 0;\n const end = start + match[0].length;\n\n // Add plain text before match\n if (start > lastIndex) {\n tokens.push({\n text: text.slice(lastIndex, start),\n type: 'plain',\n start: lastIndex,\n end: start\n });\n }\n\n // Add variable token\n const variableName = match[1];\n const isValid = variableName in knownVariables;\n\n tokens.push({\n text: match[0],\n type: 'variable',\n start,\n end,\n isValid\n });\n\n lastIndex = end;\n }\n\n // Add remaining plain text\n if (lastIndex < text.length) {\n tokens.push({\n text: text.slice(lastIndex),\n type: 'plain',\n start: lastIndex,\n end: text.length\n });\n }\n\n return tokens;\n}\n\n/**\n * Substitute template variables in text\n */\nexport function substituteTemplateVariables(\n text: string,\n variables: Record<string, any>\n): string {\n let result = text;\n\n // Substitute standard variables\n result = result.replace(VARIABLE_PATTERNS.standard, (match, varName) => {\n const value = variables[varName];\n if (value !== undefined) {\n return String(value);\n }\n return match; // Keep original if no value\n });\n\n // Substitute environment variables\n result = result.replace(VARIABLE_PATTERNS.environment, (match, varName) => {\n const value = variables[varName] || process.env[varName];\n if (value !== undefined) {\n return String(value);\n }\n return match; // Keep original if no value\n });\n\n return result;\n}\n\n/**\n * Get template variable completions for a given position\n */\nexport function getVariableCompletions(\n text: string,\n cursorPosition: number,\n knownVariables: Record<string, any>\n): Array<{ name: string; description?: string; value?: any }> {\n // Find if cursor is inside a variable pattern\n const beforeCursor = text.slice(0, cursorPosition);\n const afterCursor = text.slice(cursorPosition);\n\n // Check if we're inside a variable\n const openBrace = beforeCursor.lastIndexOf('{');\n const closeBrace = afterCursor.indexOf('}');\n\n if (openBrace === -1 || closeBrace === -1) {\n return []; // Not inside a variable\n }\n\n // Extract partial variable name\n const partialVariable = beforeCursor.slice(openBrace + 1);\n\n // Filter known variables that match the partial name\n return Object.entries(knownVariables)\n .filter(([name]) => name.toUpperCase().startsWith(partialVariable.toUpperCase()))\n .map(([name, value]) => ({\n name,\n value,\n description: `Value: ${String(value)}`\n }));\n}\n\n/**\n * Validate template variables in text\n */\nexport function validateTemplateVariables(\n text: string,\n knownVariables: Record<string, any>\n): Array<{ variable: string; line: number; column: number; message: string }> {\n const errors: Array<{ variable: string; line: number; column: number; message: string }> = [];\n const lines = text.split('\\n');\n\n lines.forEach((line, lineIndex) => {\n const matches = line.matchAll(VARIABLE_PATTERNS.standard);\n for (const match of matches) {\n const variableName = match[1];\n if (!(variableName in knownVariables)) {\n errors.push({\n variable: variableName,\n line: lineIndex + 1,\n column: (match.index || 0) + 1,\n message: `Undefined variable: ${variableName}`\n });\n }\n }\n });\n\n return errors;\n}\n\n/**\n * Create template variable definitions from text\n */\nexport function createVariableDefinitions(\n text: string,\n existingVariables: Record<string, any> = {}\n): TemplateVariable[] {\n const extractedVars = extractTemplateVariables(text);\n const definitions: TemplateVariable[] = [];\n\n extractedVars.forEach(varName => {\n if (!(varName in existingVariables)) {\n definitions.push({\n name: varName,\n type: 'string',\n required: true,\n description: `Auto-detected variable: ${varName}`,\n value: undefined\n });\n } else {\n const value = existingVariables[varName];\n definitions.push({\n name: varName,\n type: typeof value as 'string' | 'number' | 'boolean',\n required: true,\n description: `Existing variable: ${varName}`,\n value\n });\n }\n });\n\n return definitions;\n}\n\n/**\n * Format variable tooltip text\n */\nexport function formatVariableTooltip(\n variableName: string,\n variable?: TemplateVariable\n): string {\n if (!variable) {\n return `Undefined variable: ${variableName}`;\n }\n\n const parts = [\n `Variable: ${variableName}`,\n `Type: ${variable.type}`,\n variable.required ? 'Required' : 'Optional'\n ];\n\n if (variable.value !== undefined) {\n parts.push(`Value: ${String(variable.value)}`);\n }\n\n if (variable.description) {\n parts.push(`Description: ${variable.description}`);\n }\n\n return parts.join('\\n');\n}","/**\n * Token Count Estimation Utilities for Prompt Editor\n *\n * Provides token counting functionality for different AI models\n * as specified in the Prompt Editor Module specification.\n */\n\nimport type { TokenEstimate } from '../types.js';\n\n/**\n * Model-specific token estimation rules\n */\ninterface ModelTokenizer {\n /** Average characters per token */\n avgCharsPerToken: number;\n /** Whitespace handling factor */\n whitespaceMultiplier: number;\n /** Special token overhead */\n overhead: number;\n /** Cost per 1K tokens (in cents) */\n costPer1kTokens?: number;\n}\n\n/**\n * Token estimation rules for different models\n */\nconst MODEL_TOKENIZERS: Record<string, ModelTokenizer> = {\n 'gpt-4': {\n avgCharsPerToken: 4.0,\n whitespaceMultiplier: 0.8,\n overhead: 10,\n costPer1kTokens: 3.0 // $0.03 per 1K tokens (input)\n },\n 'gpt-3.5-turbo': {\n avgCharsPerToken: 4.0,\n whitespaceMultiplier: 0.8,\n overhead: 8,\n costPer1kTokens: 0.15 // $0.0015 per 1K tokens (input)\n },\n 'claude-3': {\n avgCharsPerToken: 3.8,\n whitespaceMultiplier: 0.85,\n overhead: 12,\n costPer1kTokens: 1.5 // $0.015 per 1K tokens (input)\n },\n 'claude-3-haiku': {\n avgCharsPerToken: 3.8,\n whitespaceMultiplier: 0.85,\n overhead: 8,\n costPer1kTokens: 0.25 // $0.0025 per 1K tokens (input)\n },\n 'gemini': {\n avgCharsPerToken: 4.2,\n whitespaceMultiplier: 0.9,\n overhead: 15,\n costPer1kTokens: 0.5 // $0.005 per 1K tokens (input)\n }\n};\n\n/**\n * Estimate token count for text using model-specific rules\n */\nexport function estimateTokenCount(\n text: string,\n model: string = 'gpt-4'\n): TokenEstimate {\n const tokenizer = MODEL_TOKENIZERS[model] || MODEL_TOKENIZERS['gpt-4'];\n\n // Basic character-based estimation\n const charCount = text.length;\n const wordCount = text.split(/\\s+/).filter(word => word.length > 0).length;\n\n // Adjust for whitespace and special characters\n const adjustedCharCount = charCount * tokenizer.whitespaceMultiplier;\n\n // Calculate base token estimate\n const baseTokens = Math.ceil(adjustedCharCount / tokenizer.avgCharsPerToken);\n\n // Add overhead for special tokens\n const totalTokens = baseTokens + tokenizer.overhead;\n\n // Calculate cost estimate\n const costEstimate = tokenizer.costPer1kTokens\n ? (totalTokens / 1000) * tokenizer.costPer1kTokens\n : undefined;\n\n return {\n count: totalTokens,\n approximate: true,\n costEstimate,\n model\n };\n}\n\n/**\n * Get detailed token breakdown for analysis\n */\nexport function getTokenBreakdown(\n text: string,\n model: string = 'gpt-4'\n): {\n total: number;\n sections: Array<{ name: string; tokens: number; percentage: number }>;\n efficiency: number;\n} {\n const lines = text.split('\\n');\n const sections: Array<{ name: string; tokens: number; percentage: number }> = [];\n let totalTokens = 0;\n\n // Analyze different sections\n let currentSection = 'content';\n let sectionText = '';\n\n for (const line of lines) {\n const trimmedLine = line.trim().toLowerCase();\n\n // Detect section headers\n if (trimmedLine.includes('context:') || trimmedLine.includes('background:')) {\n if (sectionText) {\n const tokens = estimateTokenCount(sectionText, model).count;\n sections.push({\n name: currentSection,\n tokens,\n percentage: 0 // Will calculate after total\n });\n totalTokens += tokens;\n }\n currentSection = 'context';\n sectionText = '';\n } else if (trimmedLine.includes('task:') || trimmedLine.includes('objective:')) {\n if (sectionText) {\n const tokens = estimateTokenCount(sectionText, model).count;\n sections.push({\n name: currentSection,\n tokens,\n percentage: 0\n });\n totalTokens += tokens;\n }\n currentSection = 'task';\n sectionText = '';\n } else if (trimmedLine.includes('example') || trimmedLine.includes('sample')) {\n if (sectionText) {\n const tokens = estimateTokenCount(sectionText, model).count;\n sections.push({\n name: currentSection,\n tokens,\n percentage: 0\n });\n totalTokens += tokens;\n }\n currentSection = 'examples';\n sectionText = '';\n } else if (trimmedLine.includes('constraint') || trimmedLine.includes('requirement')) {\n if (sectionText) {\n const tokens = estimateTokenCount(sectionText, model).count;\n sections.push({\n name: currentSection,\n tokens,\n percentage: 0\n });\n totalTokens += tokens;\n }\n currentSection = 'constraints';\n sectionText = '';\n } else {\n sectionText += line + '\\n';\n }\n }\n\n // Add final section\n if (sectionText) {\n const tokens = estimateTokenCount(sectionText, model).count;\n sections.push({\n name: currentSection,\n tokens,\n percentage: 0\n });\n totalTokens += tokens;\n }\n\n // Calculate percentages\n sections.forEach(section => {\n section.percentage = totalTokens > 0 ? (section.tokens / totalTokens) * 100 : 0;\n });\n\n // Calculate efficiency score (based on task-to-fluff ratio)\n const taskTokens = sections.find(s => s.name === 'task')?.tokens || 0;\n const totalNonTaskTokens = totalTokens - taskTokens;\n const efficiency = totalTokens > 0 ? Math.min(100, (taskTokens / totalTokens) * 100 + 50) : 0;\n\n return {\n total: totalTokens,\n sections,\n efficiency: Math.round(efficiency)\n };\n}\n\n/**\n * Compare token estimates across different models\n */\nexport function compareModels(text: string): Array<{\n model: string;\n estimate: TokenEstimate;\n costEfficiency: number;\n}> {\n const comparisons = Object.keys(MODEL_TOKENIZERS).map(model => {\n const estimate = estimateTokenCount(text, model);\n const costEfficiency = estimate.costEstimate\n ? Math.round((1 / estimate.costEstimate) * 1000) // Higher is better\n : 0;\n\n return {\n model,\n estimate,\n costEfficiency\n };\n });\n\n // Sort by cost efficiency (best value first)\n return comparisons.sort((a, b) => b.costEfficiency - a.costEfficiency);\n}\n\n/**\n * Get token usage recommendations\n */\nexport function getTokenRecommendations(\n text: string,\n model: string = 'gpt-4'\n): Array<{ type: 'info' | 'warning' | 'error'; message: string }> {\n const estimate = estimateTokenCount(text, model);\n const breakdown = getTokenBreakdown(text, model);\n const recommendations: Array<{ type: 'info' | 'warning' | 'error'; message: string }> = [];\n\n // Token count warnings\n if (estimate.count > 8000) {\n recommendations.push({\n type: 'error',\n message: 'Prompt is very long and may exceed model limits. Consider splitting into smaller parts.'\n });\n } else if (estimate.count > 4000) {\n recommendations.push({\n type: 'warning',\n message: 'Prompt is quite long. Consider optimizing for better performance and cost.'\n });\n } else if (estimate.count < 50) {\n recommendations.push({\n type: 'warning',\n message: 'Prompt may be too short for complex tasks. Consider adding more context.'\n });\n }\n\n // Cost warnings\n if (estimate.costEstimate && estimate.costEstimate > 0.1) {\n recommendations.push({\n type: 'warning',\n message: `Estimated cost: $${estimate.costEstimate.toFixed(3)}. Consider optimizing to reduce costs.`\n });\n }\n\n // Efficiency recommendations\n if (breakdown.efficiency < 30) {\n recommendations.push({\n type: 'warning',\n message: 'Prompt has low task-to-context ratio. Consider focusing more on the specific task.'\n });\n }\n\n // Section balance recommendations\n const taskSection = breakdown.sections.find(s => s.name === 'task');\n const examplesSection = breakdown.sections.find(s => s.name === 'examples');\n\n if (!taskSection || taskSection.percentage < 20) {\n recommendations.push({\n type: 'warning',\n message: 'Task definition appears weak. Consider strengthening the task description.'\n });\n }\n\n if (!examplesSection && estimate.count > 100) {\n recommendations.push({\n type: 'info',\n message: 'Consider adding examples to improve AI understanding of the task.'\n });\n }\n\n return recommendations;\n}\n\n/**\n * Format token count display\n */\nexport function formatTokenDisplay(estimate: TokenEstimate): string {\n const parts = [`${estimate.count} tokens`];\n\n if (estimate.approximate) {\n parts.push('(estimated)');\n }\n\n if (estimate.costEstimate) {\n parts.push(`~$${estimate.costEstimate.toFixed(3)}`);\n }\n\n parts.push(`(${estimate.model})`);\n\n return parts.join(' ');\n}","/**\n * Prompt Analysis Utilities for Prompt Editor\n *\n * Provides prompt quality analysis, structure evaluation, and optimization suggestions\n * as specified in the Prompt Editor Module specification.\n */\n\nimport type {\n PromptAnalysis,\n StructureAnalysis,\n ClarityAnalysis,\n CompletenessAnalysis,\n PromptSuggestion\n} from '../types.js';\n\n/**\n * Ambiguous words that may reduce clarity\n */\nconst AMBIGUOUS_WORDS = [\n 'some', 'several', 'many', 'few', 'often', 'sometimes', 'usually',\n 'probably', 'maybe', 'might', 'could', 'should', 'would',\n 'good', 'bad', 'nice', 'appropriate', 'suitable', 'reasonable',\n 'quickly', 'slowly', 'carefully', 'properly', 'correctly'\n];\n\n/**\n * Passive voice indicators\n */\nconst PASSIVE_VOICE_PATTERNS = [\n /\\b(is|are|was|were|being|been)\\s+\\w*ed\\b/gi,\n /\\b(is|are|was|were|being|been)\\s+\\w*en\\b/gi,\n /\\bby\\s+\\w+\\b/gi\n];\n\n/**\n * Task definition keywords\n */\nconst TASK_KEYWORDS = [\n 'task', 'objective', 'goal', 'purpose', 'mission', 'job',\n 'create', 'generate', 'write', 'analyze', 'summarize', 'explain',\n 'develop', 'design', 'implement', 'build', 'make', 'produce'\n];\n\n/**\n * Context keywords\n */\nconst CONTEXT_KEYWORDS = [\n 'context', 'background', 'situation', 'scenario', 'setting',\n 'given', 'assuming', 'suppose', 'considering', 'based on'\n];\n\n/**\n * Constraint keywords\n */\nconst CONSTRAINT_KEYWORDS = [\n 'constraint', 'requirement', 'limitation', 'restriction', 'rule',\n 'must', 'should', 'cannot', 'avoid', 'ensure', 'never', 'always'\n];\n\n/**\n * Example keywords\n */\nconst EXAMPLE_KEYWORDS = [\n 'example', 'sample', 'instance', 'illustration', 'demonstration',\n 'for example', 'such as', 'like', 'including', 'e.g.'\n];\n\n/**\n * Analyze prompt structure and quality\n */\nexport function analyzePrompt(text: string): PromptAnalysis {\n const structure = analyzeStructure(text);\n const clarity = analyzeClarity(text);\n const completeness = analyzeCompleteness(text);\n const suggestions = generateSuggestions(text, structure, clarity, completeness);\n\n // Calculate overall quality score\n const qualityScore = Math.round(\n (structure.score * 0.3 + clarity.clarityScore * 0.3 + completeness.score * 0.4)\n );\n\n return {\n qualityScore,\n structure,\n clarity,\n completeness,\n suggestions\n };\n}\n\n/**\n * Analyze prompt structure\n */\nexport function analyzeStructure(text: string): StructureAnalysis {\n const lowerText = text.toLowerCase();\n\n const hasContext = CONTEXT_KEYWORDS.some(keyword => lowerText.includes(keyword));\n const hasTask = TASK_KEYWORDS.some(keyword => lowerText.includes(keyword));\n const hasConstraints = CONSTRAINT_KEYWORDS.some(keyword => lowerText.includes(keyword));\n const hasExamples = EXAMPLE_KEYWORDS.some(keyword => lowerText.includes(keyword));\n\n // Check for clear structure indicators (headers, sections, numbering)\n const hasHeaders = /^#+\\s|\\*\\*\\w+\\*\\*|^\\d+\\.|^-\\s/m.test(text);\n const hasSections = text.split('\\n\\n').length > 2;\n\n const hasClearStructure = hasHeaders || hasSections;\n\n // Calculate structure score\n let score = 0;\n if (hasClearStructure) score += 25;\n if (hasContext) score += 20;\n if (hasTask) score += 30;\n if (hasConstraints) score += 15;\n if (hasExamples) score += 10;\n\n return {\n hasClearStructure,\n hasContext,\n hasTask,\n hasConstraints,\n hasExamples,\n score\n };\n}\n\n/**\n * Analyze prompt clarity\n */\nexport function analyzeClarity(text: string): ClarityAnalysis {\n const sentences = splitIntoSentences(text);\n const words = text.split(/\\s+/).filter(word => word.length > 0);\n\n // Average sentence length\n const totalSentenceLength = sentences.reduce((sum, sentence) => sum + sentence.length, 0);\n const avgSentenceLength = sentences.length > 0 ? totalSentenceLength / sentences.length : 0;\n\n // Count ambiguous words\n const ambiguousWordCount = words.filter(word =>\n AMBIGUOUS_WORDS.some(ambiguous =>\n word.toLowerCase().includes(ambiguous.toLowerCase())\n )\n ).length;\n\n // Count passive voice instances\n let passiveVoiceCount = 0;\n for (const pattern of PASSIVE_VOICE_PATTERNS) {\n const matches = text.match(pattern);\n if (matches) {\n passiveVoiceCount += matches.length;\n }\n }\n\n const passiveVoiceRatio = sentences.length > 0 ? passiveVoiceCount / sentences.length : 0;\n\n // Calculate clarity score\n let clarityScore = 100;\n\n // Penalize very long sentences\n if (avgSentenceLength > 150) clarityScore -= 20;\n else if (avgSentenceLength > 100) clarityScore -= 10;\n\n // Penalize ambiguous words\n const ambiguousRatio = words.length > 0 ? ambiguousWordCount / words.length : 0;\n if (ambiguousRatio > 0.1) clarityScore -= 20;\n else if (ambiguousRatio > 0.05) clarityScore -= 10;\n\n // Penalize excessive passive voice\n if (passiveVoiceRatio > 0.3) clarityScore -= 15;\n else if (passiveVoiceRatio > 0.15) clarityScore -= 5;\n\n clarityScore = Math.max(0, clarityScore);\n\n return {\n avgSentenceLength,\n ambiguousWordCount,\n passiveVoiceRatio,\n clarityScore\n };\n}\n\n/**\n * Analyze prompt completeness\n */\nexport function analyzeCompleteness(text: string): CompletenessAnalysis {\n const lowerText = text.toLowerCase();\n\n const hasTaskDefinition = TASK_KEYWORDS.some(keyword => lowerText.includes(keyword));\n const hasContext = CONTEXT_KEYWORDS.some(keyword => lowerText.includes(keyword));\n\n // Check for output format specifications\n const hasOutputFormat = /format|structure|layout|template|json|xml|csv|table|list/.test(lowerText);\n\n // Check for examples\n const hasExamples = EXAMPLE_KEYWORDS.some(keyword => lowerText.includes(keyword));\n\n // Calculate completeness score\n let score = 0;\n if (hasTaskDefinition) score += 40;\n if (hasContext) score += 25;\n if (hasOutputFormat) score += 20;\n if (hasExamples) score += 15;\n\n return {\n hasTaskDefinition,\n hasContext,\n hasOutputFormat,\n hasExamples,\n score\n };\n}\n\n/**\n * Generate optimization suggestions\n */\nexport function generateSuggestions(\n text: string,\n structure: StructureAnalysis,\n clarity: ClarityAnalysis,\n completeness: CompletenessAnalysis\n): PromptSuggestion[] {\n const suggestions: PromptSuggestion[] = [];\n const wordCount = text.split(/\\s+/).filter(word => word.length > 0).length;\n\n // Structure suggestions\n if (!structure.hasClearStructure) {\n suggestions.push({\n type: 'structure',\n message: 'Prompt lacks clear structure',\n suggestion: 'Consider using headers, bullet points, or numbered sections to organize your prompt',\n priority: 'high'\n });\n }\n\n if (!structure.hasTask) {\n suggestions.push({\n type: 'structure',\n message: 'No clear task definition found',\n suggestion: 'Start with a clear statement of what you want the AI to do (e.g., \"Create...\", \"Analyze...\", \"Generate...\")',\n priority: 'high'\n });\n }\n\n if (!structure.hasContext && wordCount > 50) {\n suggestions.push({\n type: 'structure',\n message: 'Consider adding context',\n suggestion: 'Provide background information to help the AI understand the situation better',\n priority: 'medium'\n });\n }\n\n // Clarity suggestions\n if (clarity.avgSentenceLength > 100) {\n suggestions.push({\n type: 'clarity',\n message: 'Sentences are too long',\n suggestion: 'Break down long sentences into shorter, clearer statements',\n priority: 'medium'\n });\n }\n\n if (clarity.ambiguousWordCount > 3) {\n suggestions.push({\n type: 'clarity',\n message: 'Too many ambiguous words detected',\n suggestion: 'Replace vague terms like \"some\", \"good\", \"appropriate\" with specific, measurable criteria',\n priority: 'medium'\n });\n }\n\n if (clarity.passiveVoiceRatio > 0.2) {\n suggestions.push({\n type: 'clarity',\n message: 'Excessive passive voice usage',\n suggestion: 'Use active voice for clearer, more direct instructions',\n priority: 'low'\n });\n }\n\n // Completeness suggestions\n if (!completeness.hasOutputFormat && wordCount > 100) {\n suggestions.push({\n type: 'completeness',\n message: 'No output format specified',\n suggestion: 'Specify the desired format for the AI\\'s response (e.g., bullet points, JSON, paragraph)',\n priority: 'medium'\n });\n }\n\n if (!completeness.hasExamples && wordCount > 150) {\n suggestions.push({\n type: 'completeness',\n message: 'Consider adding examples',\n suggestion: 'Include examples to clarify your expectations and improve AI understanding',\n priority: 'low'\n });\n }\n\n // Length suggestions\n if (wordCount < 10) {\n suggestions.push({\n type: 'completeness',\n message: 'Prompt is very short',\n suggestion: 'Add more detail and context to help the AI understand your needs',\n priority: 'high'\n });\n } else if (wordCount > 500) {\n suggestions.push({\n type: 'efficiency',\n message: 'Prompt is very long',\n suggestion: 'Consider breaking this into multiple focused prompts or removing unnecessary details',\n priority: 'medium'\n });\n }\n\n // Specificity suggestions\n const hasSpecificDetails = /\\d+|specific|exactly|precisely|must|requirement/.test(text.toLowerCase());\n if (!hasSpecificDetails && wordCount > 50) {\n suggestions.push({\n type: 'specificity',\n message: 'Prompt lacks specific details',\n suggestion: 'Add specific requirements, constraints, or criteria to get more targeted results',\n priority: 'medium'\n });\n }\n\n return suggestions.sort((a, b) => {\n const priorityOrder = { high: 3, medium: 2, low: 1 };\n return priorityOrder[b.priority] - priorityOrder[a.priority];\n });\n}\n\n/**\n * Split text into sentences\n */\nfunction splitIntoSentences(text: string): string[] {\n // Simple sentence splitting - can be enhanced with more sophisticated NLP\n return text\n .split(/[.!?]+/)\n .map(sentence => sentence.trim())\n .filter(sentence => sentence.length > 0);\n}\n\n/**\n * Get prompt quality rating\n */\nexport function getQualityRating(score: number): {\n rating: string;\n color: string;\n description: string;\n} {\n if (score >= 80) {\n return {\n rating: 'Excellent',\n color: 'green',\n description: 'Well-structured prompt with clear objectives and good clarity'\n };\n } else if (score >= 60) {\n return {\n rating: 'Good',\n color: 'blue',\n description: 'Solid prompt with room for minor improvements'\n };\n } else if (score >= 40) {\n return {\n rating: 'Fair',\n color: 'yellow',\n description: 'Adequate prompt but could benefit from better structure or clarity'\n };\n } else {\n return {\n rating: 'Needs Improvement',\n color: 'red',\n description: 'Prompt needs significant improvement in structure, clarity, or completeness'\n };\n }\n}\n\n/**\n * Format analysis summary for display\n */\nexport function formatAnalysisSummary(analysis: PromptAnalysis): string {\n const rating = getQualityRating(analysis.qualityScore);\n\n const parts = [\n `Quality Score: ${analysis.qualityScore}/100 (${rating.rating})`,\n `Structure: ${analysis.structure.score}/100`,\n `Clarity: ${analysis.clarity.clarityScore}/100`,\n `Completeness: ${analysis.completeness.score}/100`\n ];\n\n if (analysis.suggestions.length > 0) {\n const highPriority = analysis.suggestions.filter(s => s.priority === 'high').length;\n parts.push(`Suggestions: ${analysis.suggestions.length} (${highPriority} high priority)`);\n }\n\n return parts.join(' | ');\n}","/**\n * Advanced Syntax Highlighter for Prompt Editor\n *\n * Provides comprehensive syntax highlighting including template variables,\n * code blocks, URLs, and other prompt elements as specified in the\n * Prompt Editor Module specification.\n */\n\nimport type { SyntaxToken } from '../types.js';\nimport { parseTemplateTokens } from './templateVariables.js';\n\n/**\n * Syntax highlighting patterns\n */\nconst SYNTAX_PATTERNS = {\n // Code blocks (triple backticks or single backticks)\n codeBlock: /```[\\s\\S]*?```|`[^`]+`/g,\n // URLs (http/https)\n url: /(https?:\\/\\/[^\\s]+)/g,\n // File paths (Unix and Windows)\n filePath: /(?:\\/[^\\s/]+)+\\/[^\\s]*|[A-Za-z]:[^\\s]*/g,\n // Email addresses\n email: /\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}\\b/g,\n // Numbers\n number: /\\b\\d+(?:\\.\\d+)?\\b/g,\n // Keywords for prompt structure\n keywords: /\\b(task|objective|goal|context|background|example|constraint|requirement|format|output|input|note|important|warning)\\b/gi,\n // Emphasis (markdown-style)\n bold: /\\*\\*([^*]+)\\*\\*/g,\n italic: /\\*([^*]+)\\*/g,\n // Lists\n list: /^\\s*[-*+]\\s/gm,\n // Headers\n header: /^#+\\s.*/gm,\n // Comments (# or //)\n comment: /(?:^|\\s)(#[^#].*$|\\/\\/.*$)/gm\n} as const;\n\n/**\n * Color scheme for different token types\n */\nexport const SYNTAX_COLORS = {\n variable: '#10b981', // green for valid variables\n variableInvalid: '#ef4444', // red for invalid variables\n keyword: '#3b82f6', // blue for keywords\n string: '#f59e0b', // amber for strings\n comment: '#6b7280', // gray for comments\n url: '#8b5cf6', // purple for URLs\n path: '#f97316', // orange for paths\n code: '#059669', // emerald for code\n email: '#06b6d4', // cyan for emails\n number: '#dc2626', // red for numbers\n bold: '#111827', // dark for bold text (weight handled separately)\n italic: '#374151', // gray for italic\n header: '#1f2937', // dark gray for headers\n list: '#4b5563', // medium gray for lists\n plain: '#111827' // default text color\n} as const;\n\n/**\n * Parse text and return all syntax tokens for highlighting\n */\nexport function parseAllTokens(\n text: string,\n knownVariables: Record<string, any> = {}\n): SyntaxToken[] {\n const tokens: SyntaxToken[] = [];\n const processedRanges: Array<{ start: number; end: number }> = [];\n\n // Helper function to check if a range overlaps with already processed ranges\n const hasOverlap = (start: number, end: number): boolean => {\n return processedRanges.some(range =>\n (start >= range.start && start < range.end) ||\n (end > range.start && end <= range.end) ||\n (start <= range.start && end >= range.end)\n );\n };\n\n // Helper function to add a token if it doesn't overlap\n const addToken = (match: RegExpMatchArray, type: SyntaxToken['type'], isValid?: boolean) => {\n const start = match.index || 0;\n const end = start + match[0].length;\n\n if (!hasOverlap(start, end)) {\n tokens.push({\n text: match[0],\n type,\n start,\n end,\n isValid\n });\n processedRanges.push({ start, end });\n }\n };\n\n // Process template variables first (highest priority)\n const variableTokens = parseTemplateTokens(text, knownVariables);\n variableTokens.forEach(token => {\n if (token.type === 'variable') {\n tokens.push(token);\n processedRanges.push({ start: token.start, end: token.end });\n }\n });\n\n // Process code blocks (high priority to avoid conflicts)\n for (const match of text.matchAll(SYNTAX_PATTERNS.codeBlock)) {\n addToken(match, 'code');\n }\n\n // Process URLs\n for (const match of text.matchAll(SYNTAX_PATTERNS.url)) {\n addToken(match, 'url');\n }\n\n // Process file paths\n for (const match of text.matchAll(SYNTAX_PATTERNS.filePath)) {\n addToken(match, 'path');\n }\n\n // Process email addresses\n for (const match of text.matchAll(SYNTAX_PATTERNS.email)) {\n addToken(match, 'string'); // Use string type for emails\n }\n\n // Process keywords\n for (const match of text.matchAll(SYNTAX_PATTERNS.keywords)) {\n addToken(match, 'keyword');\n }\n\n // Process numbers\n for (const match of text.matchAll(SYNTAX_PATTERNS.number)) {\n addToken(match, 'string'); // Use string type for numbers in prompts\n }\n\n // Process comments\n for (const match of text.matchAll(SYNTAX_PATTERNS.comment)) {\n addToken(match, 'comment');\n }\n\n // Sort tokens by start position\n tokens.sort((a, b) => a.start - b.start);\n\n return tokens;\n}\n\n/**\n * Apply syntax highlighting to a line of text\n */\nexport function highlightLine(\n line: string,\n lineOffset: number = 0,\n knownVariables: Record<string, any> = {}\n): string {\n const tokens = parseAllTokens(line, knownVariables);\n\n if (tokens.length === 0) {\n return line; // No highlighting needed\n }\n\n let result = '';\n let lastEnd = 0;\n\n for (const token of tokens) {\n // Add unhighlighted text before this token\n if (token.start > lastEnd) {\n result += line.slice(lastEnd, token.start);\n }\n\n // Add highlighted token\n result += applyTokenStyle(token);\n\n lastEnd = token.end;\n }\n\n // Add remaining unhighlighted text\n if (lastEnd < line.length) {\n result += line.slice(lastEnd);\n }\n\n return result;\n}\n\n/**\n * Apply ANSI color codes to a token\n */\nfunction applyTokenStyle(token: SyntaxToken): string {\n let color: string;\n\n switch (token.type) {\n case 'variable':\n color = token.isValid ? SYNTAX_COLORS.variable : SYNTAX_COLORS.variableInvalid;\n break;\n case 'keyword':\n color = SYNTAX_COLORS.keyword;\n break;\n case 'string':\n color = SYNTAX_COLORS.string;\n break;\n case 'comment':\n color = SYNTAX_COLORS.comment;\n break;\n case 'url':\n color = SYNTAX_COLORS.url;\n break;\n case 'path':\n color = SYNTAX_COLORS.path;\n break;\n case 'code':\n color = SYNTAX_COLORS.code;\n break;\n default:\n color = SYNTAX_COLORS.plain;\n }\n\n // Convert hex color to ANSI escape code (approximation)\n const ansiColor = hexToAnsi(color);\n return `\\x1b[${ansiColor}m${token.text}\\x1b[39m`;\n}\n\n/**\n * Convert hex color to approximate ANSI color code\n */\nfunction hexToAnsi(hex: string): string {\n // Simple mapping of common colors to ANSI codes\n const colorMap: Record<string, string> = {\n '#10b981': '32', // green\n '#ef4444': '31', // red\n '#3b82f6': '34', // blue\n '#f59e0b': '33', // yellow\n '#6b7280': '90', // bright black (gray)\n '#8b5cf6': '35', // magenta\n '#f97316': '33', // yellow (orange approximation)\n '#059669': '32', // green\n '#06b6d4': '36', // cyan\n '#dc2626': '31', // red\n '#111827': '37', // white\n '#374151': '90', // bright black\n '#1f2937': '37', // white\n '#4b5563': '90' // bright black\n };\n\n return colorMap[hex] || '37'; // default to white\n}\n\n/**\n * Get syntax highlighting statistics\n */\nexport function getHighlightingStats(\n text: string,\n knownVariables: Record<string, any> = {}\n): {\n totalTokens: number;\n tokensByType: Record<string, number>;\n variableCount: number;\n invalidVariableCount: number;\n} {\n const tokens = parseAllTokens(text, knownVariables);\n\n const tokensByType: Record<string, number> = {};\n let variableCount = 0;\n let invalidVariableCount = 0;\n\n for (const token of tokens) {\n tokensByType[token.type] = (tokensByType[token.type] || 0) + 1;\n\n if (token.type === 'variable') {\n variableCount++;\n if (!token.isValid) {\n invalidVariableCount++;\n }\n }\n }\n\n return {\n totalTokens: tokens.length,\n tokensByType,\n variableCount,\n invalidVariableCount\n };\n}\n\n/**\n * Validate syntax highlighting for potential issues\n */\nexport function validateSyntax(\n text: string,\n knownVariables: Record<string, any> = {}\n): Array<{\n type: 'warning' | 'error';\n message: string;\n line?: number;\n column?: number;\n}> {\n const issues: Array<{\n type: 'warning' | 'error';\n message: string;\n line?: number;\n column?: number;\n }> = [];\n\n const lines = text.split('\\n');\n\n lines.forEach((line, lineIndex) => {\n const tokens = parseAllTokens(line, knownVariables);\n\n // Check for invalid template variables\n tokens.forEach(token => {\n if (token.type === 'variable' && !token.isValid) {\n issues.push({\n type: 'error',\n message: `Undefined template variable: ${token.text}`,\n line: lineIndex + 1,\n column: token.start + 1\n });\n }\n });\n\n // Check for potential issues\n if (line.includes('http://')) {\n issues.push({\n type: 'warning',\n message: 'HTTP URL detected - consider using HTTPS for security',\n line: lineIndex + 1\n });\n }\n\n // Check for very long lines\n if (line.length > 200) {\n issues.push({\n type: 'warning',\n message: 'Very long line detected - consider breaking into multiple lines',\n line: lineIndex + 1\n });\n }\n });\n\n return issues;\n}\n\n/**\n * Generate highlighting legend for help display\n */\nexport function getHighlightingLegend(): Array<{\n type: string;\n description: string;\n color: string;\n example: string;\n}> {\n return [\n {\n type: 'Variable (Valid)',\n description: 'Template variables with known values',\n color: SYNTAX_COLORS.variable,\n example: '{USER_NAME}'\n },\n {\n type: 'Variable (Invalid)',\n description: 'Template variables without defined values',\n color: SYNTAX_COLORS.variableInvalid,\n example: '{UNDEFINED_VAR}'\n },\n {\n type: 'Keyword',\n description: 'Prompt structure keywords',\n color: SYNTAX_COLORS.keyword,\n example: 'task, objective, context'\n },\n {\n type: 'Code',\n description: 'Code blocks and inline code',\n color: SYNTAX_COLORS.code,\n example: '`code` or ```block```'\n },\n {\n type: 'URL',\n description: 'Web addresses',\n color: SYNTAX_COLORS.url,\n example: 'https://example.com'\n },\n {\n type: 'Path',\n description: 'File and directory paths',\n color: SYNTAX_COLORS.path,\n example: '/path/to/file'\n },\n {\n type: 'Comment',\n description: 'Comments and notes',\n color: SYNTAX_COLORS.comment,\n example: '# This is a comment'\n }\n ];\n}","/**\n * TUI Prompt Editor for juno-task-ts\n *\n * Rich text editor for creating and editing prompts with syntax highlighting,\n * line numbers, and advanced editing features. Integrates with --interactive-prompt.\n */\n\nimport React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport { Box, Text } from 'ink';\nimport { TUIApp } from './TUIApp.js';\nimport { Input } from '../components/Input.js';\nimport { Dialog } from '../components/Dialog.js';\nimport { useTUIContext } from '../apps/TUIApp.js';\nimport { useKeyboard, useNavigationKeys } from '../hooks/useKeyboard.js';\nimport { useTUIState } from '../hooks/useTUIState.js';\nimport type {\n PromptEditorProps,\n PromptEditorState,\n TokenEstimate,\n PromptAnalysis\n} from '../types.js';\n\n// Import new utility modules\nimport {\n extractTemplateVariables,\n substituteTemplateVariables,\n validateTemplateVariables\n} from '../utils/templateVariables.js';\nimport { estimateTokenCount, formatTokenDisplay } from '../utils/tokenEstimator.js';\nimport { analyzePrompt, formatAnalysisSummary } from '../utils/promptAnalyzer.js';\nimport { highlightLine, parseAllTokens } from '../utils/syntaxHighlighter.js';\n\n/**\n * Internal prompt editor component that uses TUI context\n */\nconst PromptEditorInternal: React.FC<PromptEditorProps> = ({\n initialValue = '',\n onSubmit,\n onCancel,\n showHelp = true,\n enableSyntaxHighlighting = false,\n maxLength = 10000,\n templateVariables = {},\n showPreview = false,\n showTokenCount = true,\n targetModel = 'gpt-4',\n showAnalysis = false,\n testId\n}) => {\n const { theme, dimensions } = useTUIContext();\n\n // Editor state\n const {\n value: text,\n setValue: setText,\n isDirty\n } = useTUIState(initialValue, {\n validate: (value: string) => {\n if (value.length > maxLength) {\n return `Prompt too long (${value.length}/${maxLength} characters)`;\n }\n return null;\n }\n });\n\n const [cursorPosition, setCursorPosition] = useState(initialValue.length);\n const [showingHelp, setShowingHelp] = useState(false);\n const [showConfirmExit, setShowConfirmExit] = useState(false);\n const [viewportStart, setViewportStart] = useState(0);\n const [showingPreview, setShowingPreview] = useState(false);\n const [showingAnalysis, setShowingAnalysis] = useState(false);\n const [showingVariables, setShowingVariables] = useState(false);\n\n // Advanced features state\n const tokenEstimate = useMemo(() => {\n if (!showTokenCount) return undefined;\n return estimateTokenCount(text, targetModel);\n }, [text, targetModel, showTokenCount]);\n\n const promptAnalysis = useMemo(() => {\n if (!showAnalysis) return undefined;\n return analyzePrompt(text);\n }, [text, showAnalysis]);\n\n const previewText = useMemo(() => {\n if (!showPreview) return undefined;\n return substituteTemplateVariables(text, templateVariables);\n }, [text, templateVariables, showPreview]);\n\n const templateVariableErrors = useMemo(() => {\n return validateTemplateVariables(text, templateVariables);\n }, [text, templateVariables]);\n\n // Split text into lines\n const lines = text.split('\\n');\n\n // Calculate editor dimensions - start with 5 lines, grow with content\n const minHeight = 5;\n const maxHeight = dimensions.height - 8; // Leave space for header, footer, etc.\n const contentHeight = Math.max(lines.length, minHeight);\n const editorHeight = Math.min(contentHeight, maxHeight);\n const editorWidth = dimensions.width - 4; // Leave space for borders\n const currentLineIndex = getCurrentLineIndex(text, cursorPosition);\n const currentColumnIndex = getCurrentColumnIndex(text, cursorPosition);\n\n // Viewport management\n useEffect(() => {\n // Auto-scroll to keep cursor visible\n if (currentLineIndex < viewportStart) {\n setViewportStart(currentLineIndex);\n } else if (currentLineIndex >= viewportStart + editorHeight) {\n setViewportStart(currentLineIndex - editorHeight + 1);\n }\n }, [currentLineIndex, viewportStart, editorHeight]);\n\n // Handle text insertion\n const insertText = useCallback((insertedText: string) => {\n const newText = text.slice(0, cursorPosition) + insertedText + text.slice(cursorPosition);\n setText(newText);\n setCursorPosition(cursorPosition + insertedText.length);\n }, [text, cursorPosition, setText]);\n\n // Handle text deletion\n const deleteText = useCallback((deleteCount: number, direction: 'backward' | 'forward' = 'backward') => {\n let startPos: number;\n let endPos: number;\n\n if (direction === 'backward') {\n startPos = Math.max(0, cursorPosition - deleteCount);\n endPos = cursorPosition;\n setCursorPosition(startPos);\n } else {\n startPos = cursorPosition;\n endPos = Math.min(text.length, cursorPosition + deleteCount);\n }\n\n const newText = text.slice(0, startPos) + text.slice(endPos);\n setText(newText);\n }, [text, cursorPosition, setText]);\n\n // Navigation handlers\n const moveCursor = useCallback((newPosition: number) => {\n setCursorPosition(Math.max(0, Math.min(text.length, newPosition)));\n }, [text.length]);\n\n const moveCursorByLines = useCallback((lineOffset: number) => {\n const targetLine = Math.max(0, Math.min(lines.length - 1, currentLineIndex + lineOffset));\n const targetLineLength = lines[targetLine]?.length || 0;\n const targetColumn = Math.min(currentColumnIndex, targetLineLength);\n\n const newPosition = getPositionFromLineColumn(text, targetLine, targetColumn);\n moveCursor(newPosition);\n }, [text, lines, currentLineIndex, currentColumnIndex, moveCursor]);\n\n // Keyboard handling\n useKeyboard({\n onKey: (event) => {\n // Don't handle keys if showing help or confirm dialog\n if (showingHelp || showConfirmExit) return;\n\n const { key, ctrl, meta, shift, alt } = event;\n\n // Handle special keys\n if (key === 'return') {\n // Enter submits the prompt (user-friendly behavior)\n if (text.trim()) {\n onSubmit(text);\n }\n return;\n }\n\n if (key === 'tab') {\n insertText(' '); // Insert 2 spaces for tab\n return;\n }\n\n if (key === 'backspace') {\n if (cursorPosition > 0) {\n deleteText(1, 'backward');\n }\n return;\n }\n\n if (key === 'delete') {\n if (cursorPosition < text.length) {\n deleteText(1, 'forward');\n }\n return;\n }\n\n // Navigation keys\n if (key === 'leftArrow') {\n moveCursor(cursorPosition - 1);\n return;\n }\n\n if (key === 'rightArrow') {\n moveCursor(cursorPosition + 1);\n return;\n }\n\n if (key === 'upArrow') {\n moveCursorByLines(-1);\n return;\n }\n\n if (key === 'downArrow') {\n moveCursorByLines(1);\n return;\n }\n\n if (key === 'home') {\n const lineStart = getLineStartPosition(text, cursorPosition);\n moveCursor(lineStart);\n return;\n }\n\n if (key === 'end') {\n const lineEnd = getLineEndPosition(text, cursorPosition);\n moveCursor(lineEnd);\n return;\n }\n\n if (key === 'pageUp') {\n moveCursorByLines(-editorHeight);\n return;\n }\n\n if (key === 'pageDown') {\n moveCursorByLines(editorHeight);\n return;\n }\n\n // Ctrl shortcuts\n if (ctrl) {\n switch (key) {\n case 'a': // Select all (move to end for now)\n moveCursor(text.length);\n return;\n case 'home': // Go to document start\n moveCursor(0);\n return;\n case 'end': // Go to document end\n moveCursor(text.length);\n return;\n case 'j': // Ctrl+J adds new line (alternative method)\n insertText('\\n');\n return;\n case 'z': // Undo (not implemented yet)\n return;\n case 'y': // Redo (not implemented yet)\n return;\n }\n }\n\n // Regular character input - handle all printable characters\n if (!ctrl && !meta && !alt && key !== 'unknown' &&\n !['return', 'escape', 'tab', 'backspace', 'delete', 'upArrow',\n 'downArrow', 'leftArrow', 'rightArrow', 'pageUp', 'pageDown',\n 'home', 'end'].includes(key)) {\n insertText(key);\n return;\n }\n }\n });\n\n // Global shortcuts\n useKeyboard({\n bindings: [\n {\n key: 'escape',\n handler: () => {\n if (showingHelp || showingPreview || showingAnalysis || showingVariables) {\n setShowingHelp(false);\n setShowingPreview(false);\n setShowingAnalysis(false);\n setShowingVariables(false);\n } else if (isDirty) {\n setShowConfirmExit(true);\n } else {\n onCancel();\n }\n }\n },\n {\n key: 'f1',\n handler: () => setShowingHelp(true)\n },\n {\n key: 'f2',\n handler: () => showPreview && setShowingPreview(!showingPreview)\n },\n {\n key: 'f3',\n handler: () => showAnalysis && setShowingAnalysis(!showingAnalysis)\n },\n {\n key: 'f4',\n handler: () => setShowingVariables(!showingVariables)\n },\n {\n key: 'ctrl+s',\n handler: () => {\n if (text.trim()) {\n onSubmit(text);\n }\n }\n }\n ]\n });\n\n // Render visible lines - ensure we always show at least 5 lines for proper editing\n const visibleLines = lines.slice(viewportStart, viewportStart + editorHeight);\n\n // Pad with empty lines if we have fewer than the minimum height\n while (visibleLines.length < minHeight && viewportStart + visibleLines.length < lines.length + minHeight) {\n visibleLines.push('');\n }\n\n const lineNumberWidth = Math.max(String(lines.length).length + 1, 3);\n\n return (\n <>\n {/* Modern Header */}\n <Box\n flexDirection=\"column\"\n marginBottom={1}\n paddingX={1}\n paddingY={1}\n borderStyle=\"round\"\n borderColor={theme.primary}\n >\n <Box justifyContent=\"space-between\" marginBottom={1}>\n <Box flexDirection=\"row\" gap={2}>\n <Text color={theme.primary} bold>📝 Prompt Editor</Text>\n <Text color={theme.muted}>\n {currentLineIndex + 1}:{currentColumnIndex + 1}\n </Text>\n </Box>\n <Box flexDirection=\"row\" gap={1}>\n <Text color={isDirty ? theme.warning : theme.success}>\n {isDirty ? '● UNSAVED' : '✓ SAVED'}\n </Text>\n </Box>\n </Box>\n\n <Box justifyContent=\"space-between\">\n <Box flexDirection=\"row\" gap={2}>\n {templateVariableErrors.length > 0 && (\n <Text color={theme.error}>\n ⚠ {templateVariableErrors.length} variable error{templateVariableErrors.length > 1 ? 's' : ''}\n </Text>\n )}\n {tokenEstimate && (\n <Text color={theme.muted}>\n {formatTokenDisplay(tokenEstimate)}\n </Text>\n )}\n {promptAnalysis && (\n <Text color={promptAnalysis.qualityScore >= 80 ? theme.success :\n promptAnalysis.qualityScore >= 60 ? theme.warning : theme.error}>\n Quality: {promptAnalysis.qualityScore}%\n </Text>\n )}\n </Box>\n <Text color={theme.muted}>\n {text.length}/{maxLength} characters\n </Text>\n </Box>\n </Box>\n\n {/* Editor area */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"double\"\n borderColor={isDirty ? theme.warning : theme.primary}\n width=\"100%\"\n minHeight={editorHeight + 2}\n paddingX={1}\n backgroundColor={undefined}\n >\n {visibleLines.map((line, index) => {\n const actualLineIndex = viewportStart + index;\n const isCurrentLine = actualLineIndex === currentLineIndex;\n\n // Calculate cursor position for current line\n let displayLine = line;\n let cursorChar = '';\n\n if (isCurrentLine) {\n const lineStartPos = getLineStartPosition(text, cursorPosition);\n const relativeCursorPos = cursorPosition - lineStartPos;\n\n if (relativeCursorPos <= line.length) {\n const beforeCursor = line.slice(0, relativeCursorPos);\n const atCursor = line[relativeCursorPos] || ' ';\n const afterCursor = line.slice(relativeCursorPos + 1);\n\n displayLine = beforeCursor + afterCursor;\n cursorChar = atCursor;\n }\n }\n\n return (\n <Box key={actualLineIndex} marginY={0}>\n {/* Line number with modern styling */}\n <Text\n color={isCurrentLine ? theme.primary : theme.muted}\n width={lineNumberWidth}\n backgroundColor={isCurrentLine ? undefined : undefined}\n >\n {String(actualLineIndex + 1).padStart(lineNumberWidth - 1, ' ')}\n {isCurrentLine ? '►' : ' '}\n </Text>\n\n {/* Line content with enhanced styling */}\n <Text\n color={isCurrentLine ? theme.text : theme.muted}\n backgroundColor={isCurrentLine ? undefined : undefined}\n >\n {enableSyntaxHighlighting ?\n highlightLine(displayLine, 0, templateVariables) :\n displayLine}\n {isCurrentLine && (\n <Text inverse backgroundColor={theme.primary}>{cursorChar}</Text>\n )}\n </Text>\n </Box>\n );\n })}\n\n {/* Empty editor message - only show if no lines are displayed */}\n {visibleLines.length === 0 && (\n <Box justifyContent=\"center\" alignItems=\"center\" height={Math.max(5, editorHeight)} flexDirection=\"column\">\n <Text color={theme.primary} bold>✨ Ready to Create</Text>\n <Text color={theme.muted}>Start typing your prompt here...</Text>\n <Text color={theme.muted}>Press <Text color={theme.success}>Enter</Text> to submit or <Text color={theme.success}>Ctrl+J</Text> for new lines</Text>\n </Box>\n )}\n </Box>\n\n {/* Modern Footer */}\n <Box\n marginTop={1}\n paddingX={1}\n paddingY={1}\n borderStyle=\"single\"\n borderColor={theme.muted}\n justifyContent=\"space-between\"\n >\n <Box flexDirection=\"column\">\n <Text color={theme.primary} bold>Quick Keys:</Text>\n <Text color={theme.muted}>\n <Text color={theme.success}>Enter</Text> submit • <Text color={theme.success}>Ctrl+J</Text> new line • <Text color={theme.success}>Ctrl+S</Text> save • <Text color={theme.success}>ESC</Text> cancel\n </Text>\n {(showPreview || showAnalysis) && (\n <Text color={theme.muted}>\n {showPreview && <><Text color={theme.success}>F2</Text> preview</>}\n {showPreview && showAnalysis && ' • '}\n {showAnalysis && <><Text color={theme.success}>F3</Text> analysis</>}\n {' • '}<Text color={theme.success}>F4</Text> variables • <Text color={theme.success}>F1</Text> help\n </Text>\n )}\n </Box>\n <Box flexDirection=\"column\" alignItems=\"flex-end\">\n <Text color={theme.primary} bold>\n {showingHelp ? '📖 Help' :\n showingPreview ? '👁 Preview' :\n showingAnalysis ? '🔍 Analysis' :\n showingVariables ? '🔧 Variables' : '✏️ Editor'}\n </Text>\n <Text color={theme.muted}>\n Mode\n </Text>\n </Box>\n </Box>\n\n {/* Preview dialog */}\n {showPreview && showingPreview && previewText && (\n <Dialog\n title=\"Template Preview\"\n message={`Preview with substituted variables:\\n\\n${previewText}`}\n isVisible={showingPreview}\n onClose={() => setShowingPreview(false)}\n type=\"info\"\n />\n )}\n\n {/* Analysis dialog */}\n {showAnalysis && showingAnalysis && promptAnalysis && (\n <Dialog\n title=\"Prompt Quality Analysis\"\n message={getAnalysisText(promptAnalysis)}\n isVisible={showingAnalysis}\n onClose={() => setShowingAnalysis(false)}\n type={promptAnalysis.qualityScore >= 60 ? \"info\" : \"warning\"}\n />\n )}\n\n {/* Variables dialog */}\n {showingVariables && (\n <Dialog\n title=\"Template Variables\"\n message={getVariablesText(templateVariables, templateVariableErrors)}\n isVisible={showingVariables}\n onClose={() => setShowingVariables(false)}\n type={templateVariableErrors.length > 0 ? \"warning\" : \"info\"}\n />\n )}\n\n {/* Help dialog */}\n {showHelp && showingHelp && (\n <Dialog\n title=\"Prompt Editor Help\"\n message={getHelpText()}\n isVisible={showingHelp}\n onClose={() => setShowingHelp(false)}\n type=\"info\"\n />\n )}\n\n {/* Confirm exit dialog */}\n <Dialog\n title=\"Confirm Exit\"\n message=\"You have unsaved changes. Are you sure you want to exit without saving?\"\n isVisible={showConfirmExit}\n onClose={() => setShowConfirmExit(false)}\n buttons={[\n {\n label: 'Save & Exit',\n action: () => {\n if (text.trim()) {\n onSubmit(text);\n } else {\n onCancel();\n }\n },\n variant: 'primary',\n isDefault: true\n },\n {\n label: 'Exit Without Saving',\n action: onCancel,\n variant: 'warning'\n },\n {\n label: 'Cancel',\n action: () => setShowConfirmExit(false),\n variant: 'secondary'\n }\n ]}\n type=\"warning\"\n />\n </>\n );\n};\n\n/**\n * Advanced prompt editor with rich features\n * This is the main component that wraps the internal editor in TUIApp\n */\nexport const PromptEditor: React.FC<PromptEditorProps> = (props) => {\n return (\n <TUIApp\n title=\"Prompt Editor\"\n exitOnEscape={false}\n testId={props.testId}\n >\n <PromptEditorInternal {...props} />\n </TUIApp>\n );\n};\n\n/**\n * Simple prompt editor for basic use cases\n */\nexport const SimplePromptEditor: React.FC<{\n initialValue?: string;\n onSubmit: (prompt: string) => void;\n onCancel: () => void;\n placeholder?: string;\n testId?: string;\n}> = ({\n initialValue = '',\n onSubmit,\n onCancel,\n placeholder = 'Enter your prompt...',\n testId\n}) => {\n const [prompt, setPrompt] = useState(initialValue);\n\n return (\n <TUIApp title=\"Enter Prompt\" testId={testId}>\n <Box flexDirection=\"column\" padding={1}>\n <Input\n label=\"Prompt\"\n value={prompt}\n onChange={setPrompt}\n onSubmit={onSubmit}\n placeholder={placeholder}\n multiline={true}\n autoFocus={true}\n />\n\n <Box marginTop={2} justifyContent=\"flex-end\" gap={1}>\n <Text color=\"gray\">Ctrl+Enter to submit • ESC to cancel</Text>\n </Box>\n </Box>\n </TUIApp>\n );\n};\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\nfunction getCurrentLineIndex(text: string, cursorPosition: number): number {\n return text.slice(0, cursorPosition).split('\\n').length - 1;\n}\n\nfunction getCurrentColumnIndex(text: string, cursorPosition: number): number {\n const beforeCursor = text.slice(0, cursorPosition);\n const lines = beforeCursor.split('\\n');\n return lines[lines.length - 1].length;\n}\n\nfunction getLineStartPosition(text: string, cursorPosition: number): number {\n const beforeCursor = text.slice(0, cursorPosition);\n const lastNewlineIndex = beforeCursor.lastIndexOf('\\n');\n return lastNewlineIndex === -1 ? 0 : lastNewlineIndex + 1;\n}\n\nfunction getLineEndPosition(text: string, cursorPosition: number): number {\n const afterCursor = text.slice(cursorPosition);\n const nextNewlineIndex = afterCursor.indexOf('\\n');\n return nextNewlineIndex === -1 ? text.length : cursorPosition + nextNewlineIndex;\n}\n\nfunction getPositionFromLineColumn(text: string, lineIndex: number, columnIndex: number): number {\n const lines = text.split('\\n');\n let position = 0;\n\n for (let i = 0; i < lineIndex && i < lines.length; i++) {\n position += lines[i].length + 1; // +1 for newline character\n }\n\n if (lineIndex < lines.length) {\n position += Math.min(columnIndex, lines[lineIndex].length);\n }\n\n return position;\n}\n\nfunction getAnalysisText(analysis: PromptAnalysis): string {\n const lines = [\n `Overall Quality Score: ${analysis.qualityScore}/100`,\n '',\n `Structure Analysis (${analysis.structure.score}/100):`,\n `• Clear Structure: ${analysis.structure.hasClearStructure ? 'Yes' : 'No'}`,\n `• Has Context: ${analysis.structure.hasContext ? 'Yes' : 'No'}`,\n `• Has Task Definition: ${analysis.structure.hasTask ? 'Yes' : 'No'}`,\n `• Has Constraints: ${analysis.structure.hasConstraints ? 'Yes' : 'No'}`,\n `• Has Examples: ${analysis.structure.hasExamples ? 'Yes' : 'No'}`,\n '',\n `Clarity Analysis (${analysis.clarity.clarityScore}/100):`,\n `• Average Sentence Length: ${Math.round(analysis.clarity.avgSentenceLength)} characters`,\n `• Ambiguous Words: ${analysis.clarity.ambiguousWordCount}`,\n `• Passive Voice Ratio: ${Math.round(analysis.clarity.passiveVoiceRatio * 100)}%`,\n '',\n `Completeness Analysis (${analysis.completeness.score}/100):`,\n `• Task Definition: ${analysis.completeness.hasTaskDefinition ? 'Yes' : 'No'}`,\n `• Context Provided: ${analysis.completeness.hasContext ? 'Yes' : 'No'}`,\n `• Output Format: ${analysis.completeness.hasOutputFormat ? 'Yes' : 'No'}`,\n `• Examples: ${analysis.completeness.hasExamples ? 'Yes' : 'No'}`\n ];\n\n if (analysis.suggestions.length > 0) {\n lines.push('', 'Optimization Suggestions:');\n analysis.suggestions.slice(0, 5).forEach((suggestion, index) => {\n lines.push(`${index + 1}. [${suggestion.priority.toUpperCase()}] ${suggestion.message}`);\n lines.push(` ${suggestion.suggestion}`);\n });\n }\n\n return lines.join('\\n');\n}\n\nfunction getVariablesText(\n templateVariables: Record<string, any>,\n errors: Array<{ variable: string; line: number; column: number; message: string }>\n): string {\n const lines = [];\n\n // Show detected variables\n const detectedVars = Object.keys(templateVariables);\n if (detectedVars.length > 0) {\n lines.push('Template Variables:');\n detectedVars.forEach(varName => {\n const value = templateVariables[varName];\n lines.push(`• ${varName}: ${String(value)} (${typeof value})`);\n });\n } else {\n lines.push('No template variables defined.');\n }\n\n // Show errors\n if (errors.length > 0) {\n lines.push('', 'Variable Errors:');\n errors.forEach(error => {\n lines.push(`• Line ${error.line}, Column ${error.column}: ${error.message}`);\n });\n }\n\n lines.push('', 'Variable Syntax:');\n lines.push('• Standard: {VARIABLE_NAME}');\n lines.push('• Environment: $VAR or ${VAR}');\n lines.push('• Variables must be UPPERCASE with underscores');\n\n return lines.join('\\n');\n}\n\nfunction getHelpText(): string {\n return `\nAdvanced Prompt Editor Help:\n\nNavigation:\n• Arrow keys - Move cursor\n• Home/End - Start/end of line\n• Ctrl+Home/End - Start/end of document\n• Page Up/Down - Scroll page\n\nEditing:\n• Type normally to insert text\n• Enter - Submit prompt\n• Ctrl+J - New line (for multiline prompts)\n• Backspace/Delete - Remove characters\n• Tab - Insert spaces (indentation)\n\nCommands:\n• Enter/Ctrl+S - Save and submit\n• ESC - Cancel (warns if unsaved)\n• F1 - Show this help\n• F2 - Toggle template preview (if enabled)\n• F3 - Show prompt quality analysis (if enabled)\n• F4 - Show template variables\n\nAdvanced Features:\n• Syntax Highlighting - Highlights template variables, URLs, code, etc.\n• Template Variables - Use {VARIABLE_NAME} syntax for substitution\n• Token Counting - Real-time token estimation for AI models\n• Quality Analysis - Automatic prompt structure and clarity analysis\n• Real-time Preview - See how your prompt looks with variables substituted\n\nTemplate Variables:\n• Standard: {VARIABLE_NAME} - Must be UPPERCASE with underscores\n• Environment: $VAR or ${VAR} - Access environment variables\n• Variables are highlighted in green (valid) or red (undefined)\n\nThe editor supports multi-line prompts with advanced AI-specific features.\nYour prompt will be optimized for the best AI interaction results.\n `.trim();\n}\n\nexport default PromptEditor;","/**\n * TUI Renderer Utilities for juno-task-ts\n *\n * Core rendering utilities for TUI applications, including render management,\n * cleanup, and integration with Ink's rendering system.\n */\n\nimport React from 'react';\nimport { render, RenderOptions, Instance } from 'ink';\nimport { isHeadlessEnvironment } from '../../utils/environment.js';\nimport type { TUIRenderOptions, TUIError } from '../types.js';\n\n/**\n * TUI render result with cleanup capabilities\n */\nexport interface TUIRenderResult {\n /** The Ink instance */\n instance: Instance;\n /** Cleanup function to stop rendering */\n cleanup: () => Promise<void>;\n /** Wait for the app to exit */\n waitUntilExit: () => Promise<void>;\n /** Re-render the component */\n rerender: (component: React.ReactElement) => void;\n /** Clear the output */\n clear: () => void;\n /** Unmount the component */\n unmount: () => void;\n}\n\n/**\n * Enhanced TUI renderer with error handling and cleanup\n */\nexport class TUIRenderer {\n private instances: Map<string, Instance> = new Map();\n private cleanupHandlers: Map<string, () => Promise<void>> = new Map();\n\n /**\n * Render a TUI component with enhanced options\n */\n async render(\n component: React.ReactElement,\n options: TUIRenderOptions = {}\n ): Promise<TUIRenderResult> {\n const {\n exitOnCtrlC = true,\n debug = false,\n stdout = process.stdout,\n stdin = process.stdin,\n waitUntilExit = false\n } = options;\n\n // Check for headless environment\n if (isHeadlessEnvironment()) {\n throw new TUIError(\n 'Cannot render TUI in headless environment',\n 'TUI_HEADLESS_ERROR'\n );\n }\n\n // Prepare render options\n const renderOptions: RenderOptions = {\n exitOnCtrlC,\n debug,\n stdout,\n stdin\n };\n\n try {\n // Render the component\n const instance = render(component, renderOptions);\n const instanceId = this.generateInstanceId();\n\n // Store instance for cleanup\n this.instances.set(instanceId, instance);\n\n // Create cleanup handler\n const cleanup = async () => {\n try {\n instance.unmount();\n this.instances.delete(instanceId);\n this.cleanupHandlers.delete(instanceId);\n } catch (error) {\n if (debug) {\n console.error('Cleanup error:', error);\n }\n }\n };\n\n this.cleanupHandlers.set(instanceId, cleanup);\n\n // Create result object\n const result: TUIRenderResult = {\n instance,\n cleanup,\n waitUntilExit: () => instance.waitUntilExit(),\n rerender: (newComponent: React.ReactElement) => {\n instance.rerender(newComponent);\n },\n clear: () => {\n if (stdout.isTTY) {\n stdout.write('\\x1b[2J\\x1b[3J\\x1b[H');\n }\n },\n unmount: () => {\n instance.unmount();\n this.instances.delete(instanceId);\n this.cleanupHandlers.delete(instanceId);\n }\n };\n\n // Wait for exit if requested\n if (waitUntilExit) {\n await instance.waitUntilExit();\n }\n\n return result;\n\n } catch (error) {\n throw new TUIError(\n `Failed to render TUI component: ${error}`,\n 'TUI_RENDER_ERROR'\n );\n }\n }\n\n /**\n * Render a temporary TUI component (auto-cleanup)\n */\n async renderTemporary(\n component: React.ReactElement,\n duration?: number,\n options: TUIRenderOptions = {}\n ): Promise<void> {\n const result = await this.render(component, options);\n\n try {\n if (duration) {\n // Auto-cleanup after duration\n setTimeout(async () => {\n await result.cleanup();\n }, duration);\n } else {\n // Wait for exit and cleanup\n await result.waitUntilExit();\n }\n } finally {\n await result.cleanup();\n }\n }\n\n /**\n * Render in test mode (for testing components)\n */\n async renderTest(\n component: React.ReactElement,\n options: TUIRenderOptions = {}\n ): Promise<TUIRenderResult> {\n const testOptions: TUIRenderOptions = {\n ...options,\n debug: true,\n exitOnCtrlC: false,\n waitUntilExit: false\n };\n\n return this.render(component, testOptions);\n }\n\n /**\n * Create a headless fallback renderer\n */\n createHeadlessFallback<T>(\n fallbackFn: () => Promise<T>\n ): Promise<T> {\n if (isHeadlessEnvironment()) {\n return fallbackFn();\n }\n\n throw new TUIError(\n 'Headless fallback called in interactive environment',\n 'TUI_INVALID_FALLBACK'\n );\n }\n\n /**\n * Cleanup all active instances\n */\n async cleanupAll(): Promise<void> {\n const cleanupPromises = Array.from(this.cleanupHandlers.values()).map(\n cleanup => cleanup()\n );\n\n await Promise.allSettled(cleanupPromises);\n this.instances.clear();\n this.cleanupHandlers.clear();\n }\n\n /**\n * Get active instance count\n */\n getActiveInstanceCount(): number {\n return this.instances.size;\n }\n\n /**\n * Generate unique instance ID\n */\n private generateInstanceId(): string {\n return `tui_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n/**\n * Global TUI renderer instance\n */\nexport const tuiRenderer = new TUIRenderer();\n\n/**\n * High-level render function for simple use cases\n */\nexport async function renderTUI(\n component: React.ReactElement,\n options: TUIRenderOptions = {}\n): Promise<TUIRenderResult> {\n return tuiRenderer.render(component, options);\n}\n\n/**\n * Render and wait for TUI component to complete\n */\nexport async function renderAndWait(\n component: React.ReactElement,\n options: TUIRenderOptions = {}\n): Promise<void> {\n const result = await tuiRenderer.render(component, {\n ...options,\n waitUntilExit: true\n });\n\n try {\n await result.waitUntilExit();\n } finally {\n await result.cleanup();\n }\n}\n\n/**\n * Quick TUI alert/notification\n */\nexport async function showTUIAlert(\n message: string,\n duration: number = 3000,\n options: TUIRenderOptions = {}\n): Promise<void> {\n const AlertComponent = React.createElement(\n 'div',\n {},\n React.createElement('text', { color: 'cyan' }, message)\n );\n\n await tuiRenderer.renderTemporary(AlertComponent, duration, options);\n}\n\n/**\n * Utility to check if TUI rendering is available\n */\nexport function isTUIAvailable(): boolean {\n return !isHeadlessEnvironment() && process.stdout.isTTY;\n}\n\n/**\n * Safe TUI render with automatic fallback\n */\nexport async function safeTUIRender<T>(\n component: React.ReactElement,\n fallbackFn: () => Promise<T>,\n options: TUIRenderOptions = {}\n): Promise<T | TUIRenderResult> {\n if (!isTUIAvailable()) {\n return fallbackFn();\n }\n\n try {\n return await tuiRenderer.render(component, options);\n } catch (error) {\n console.warn('TUI render failed, falling back:', error);\n return fallbackFn();\n }\n}\n\n/**\n * Process exit cleanup handler\n */\nlet cleanupRegistered = false;\n\nexport function registerCleanupHandlers(): void {\n if (cleanupRegistered) return;\n\n const cleanup = async () => {\n await tuiRenderer.cleanupAll();\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n process.on('exit', cleanup);\n process.on('uncaughtException', async (error) => {\n console.error('Uncaught exception:', error);\n await cleanup();\n process.exit(1);\n });\n\n cleanupRegistered = true;\n}\n\n/**\n * Initialize TUI renderer with cleanup handlers\n */\nexport function initializeTUIRenderer(): TUIRenderer {\n registerCleanupHandlers();\n return tuiRenderer;\n}\n\n// Auto-register cleanup handlers\nregisterCleanupHandlers();","/**\n * Headless Mode Utilities for juno-task-ts TUI\n *\n * Utilities for handling headless environments and providing fallback\n * functionality when TUI is not available.\n */\n\nimport * as readline from 'node:readline';\nimport { isHeadlessEnvironment } from '../../utils/environment.js';\n\n/**\n * Headless fallback for TUI prompt editor\n */\nexport async function headlessPromptEditor(options: {\n initialValue?: string;\n title?: string;\n maxLength?: number;\n}): Promise<string | null> {\n const { initialValue = '', title = 'Enter Prompt', maxLength = 10000 } = options;\n\n console.log(`\\n${title}:`);\n if (initialValue) {\n console.log(`Initial value: ${initialValue}`);\n }\n console.log(`Maximum length: ${maxLength} characters`);\n console.log('Enter your prompt (press Ctrl+D when finished):\\n');\n\n return new Promise((resolve, reject) => {\n let input = initialValue;\n\n process.stdin.setEncoding('utf8');\n process.stdin.resume();\n\n process.stdin.on('data', (chunk) => {\n input += chunk;\n });\n\n process.stdin.on('end', () => {\n const trimmed = input.trim();\n if (!trimmed) {\n resolve(null);\n } else if (trimmed.length > maxLength) {\n console.error(`\\nError: Prompt too long (${trimmed.length}/${maxLength} characters)`);\n resolve(null);\n } else {\n resolve(trimmed);\n }\n });\n\n process.stdin.on('error', (error) => {\n console.error('\\nError reading input:', error);\n resolve(null);\n });\n });\n}\n\n/**\n * Headless fallback for confirmation dialogs\n */\nexport async function headlessConfirmation(options: {\n message: string;\n defaultValue?: boolean;\n}): Promise<boolean> {\n const { message, defaultValue = false } = options;\n\n console.log(`\\n${message}`);\n console.log(`Enter 'y' for yes, 'n' for no (default: ${defaultValue ? 'y' : 'n'}):`);\n\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n rl.question('> ', (answer: string) => {\n rl.close();\n\n const trimmed = answer.trim().toLowerCase();\n if (trimmed === 'y' || trimmed === 'yes') {\n resolve(true);\n } else if (trimmed === 'n' || trimmed === 'no') {\n resolve(false);\n } else {\n resolve(defaultValue);\n }\n });\n });\n}\n\n/**\n * Headless fallback for selection dialogs\n */\nexport async function headlessSelection<T>(options: {\n message: string;\n choices: Array<{ label: string; value: T; description?: string }>;\n multiple?: boolean;\n}): Promise<T | T[] | null> {\n const { message, choices, multiple = false } = options;\n\n console.log(`\\n${message}`);\n console.log('Available options:');\n\n choices.forEach((choice, index) => {\n const description = choice.description ? ` - ${choice.description}` : '';\n console.log(` ${index + 1}. ${choice.label}${description}`);\n });\n\n if (multiple) {\n console.log('\\nEnter numbers separated by commas (e.g., 1,3,5):');\n } else {\n console.log('\\nEnter the number of your choice:');\n }\n\n return new Promise((resolve) => {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n rl.question('> ', (answer: string) => {\n rl.close();\n\n try {\n if (multiple) {\n const indexes = answer\n .split(',')\n .map(s => parseInt(s.trim()) - 1)\n .filter(i => i >= 0 && i < choices.length);\n\n if (indexes.length === 0) {\n resolve(null);\n } else {\n const selectedValues = indexes.map(i => choices[i].value);\n resolve(selectedValues);\n }\n } else {\n const index = parseInt(answer.trim()) - 1;\n if (index >= 0 && index < choices.length) {\n resolve(choices[index].value);\n } else {\n resolve(null);\n }\n }\n } catch {\n resolve(null);\n }\n });\n });\n}\n\n/**\n * Headless fallback for alert dialogs\n */\nexport function headlessAlert(options: {\n title?: string;\n message: string;\n type?: 'info' | 'success' | 'warning' | 'error';\n}): void {\n const { title, message, type = 'info' } = options;\n\n const typeIcons = {\n info: 'ℹ',\n success: '✓',\n warning: '⚠',\n error: '✗'\n };\n\n const icon = typeIcons[type];\n const fullMessage = title ? `${title}: ${message}` : message;\n\n console.log(`\\n${icon} ${fullMessage}\\n`);\n}\n\n/**\n * Detect TUI capability and provide appropriate interface\n */\nexport function getTUICapabilities(): {\n hasColors: boolean;\n hasUnicode: boolean;\n terminalWidth: number;\n terminalHeight: number;\n isInteractive: boolean;\n supportsRichText: boolean;\n} {\n const isInteractive = !isHeadlessEnvironment() && process.stdout.isTTY;\n\n return {\n hasColors: isInteractive && process.env.TERM !== 'dumb',\n hasUnicode: isInteractive && !process.env.ASCII_ONLY,\n terminalWidth: process.stdout.columns || 80,\n terminalHeight: process.stdout.rows || 24,\n isInteractive,\n supportsRichText: isInteractive && !process.env.NO_RICH_TEXT\n };\n}\n\n/**\n * Progressive enhancement based on terminal capabilities\n */\nexport function enhanceForTerminal(content: {\n plain: string;\n colored?: string;\n unicode?: string;\n rich?: string;\n}): string {\n const capabilities = getTUICapabilities();\n\n if (capabilities.supportsRichText && content.rich) {\n return content.rich;\n }\n\n if (capabilities.hasUnicode && content.unicode) {\n return content.unicode;\n }\n\n if (capabilities.hasColors && content.colored) {\n return content.colored;\n }\n\n return content.plain;\n}\n\n/**\n * Safe console output with fallback handling\n */\nexport function safeConsoleOutput(\n message: string,\n options: {\n type?: 'log' | 'info' | 'warn' | 'error';\n color?: string;\n bold?: boolean;\n } = {}\n): void {\n const { type = 'log', color, bold } = options;\n const capabilities = getTUICapabilities();\n\n let output = message;\n\n // Apply styling if supported\n if (capabilities.hasColors && (color || bold)) {\n const chalk = require('chalk');\n\n if (color && chalk[color]) {\n output = chalk[color](output);\n }\n\n if (bold) {\n output = chalk.bold(output);\n }\n }\n\n // Output using appropriate method\n console[type](output);\n}\n\n/**\n * Create a progress indicator for headless environments\n */\nexport function createHeadlessProgress(options: {\n total?: number;\n label?: string;\n showPercentage?: boolean;\n}): {\n update: (current: number, message?: string) => void;\n complete: (message?: string) => void;\n fail: (message?: string) => void;\n} {\n const { total, label = 'Progress', showPercentage = true } = options;\n let lastUpdate = 0;\n\n return {\n update: (current: number, message?: string) => {\n // Throttle updates to avoid spam\n const now = Date.now();\n if (now - lastUpdate < 100) return;\n lastUpdate = now;\n\n let output = `${label}: `;\n\n if (total && showPercentage) {\n const percentage = Math.round((current / total) * 100);\n output += `${percentage}% `;\n }\n\n if (message) {\n output += message;\n } else if (total) {\n output += `${current}/${total}`;\n } else {\n output += current.toString();\n }\n\n // Clear line and write progress\n process.stdout.write(`\\r${output.padEnd(80)}`);\n },\n\n complete: (message?: string) => {\n const output = message || `${label}: Complete`;\n console.log(`\\r${output.padEnd(80)}`);\n },\n\n fail: (message?: string) => {\n const output = message || `${label}: Failed`;\n console.error(`\\r${output.padEnd(80)}`);\n }\n };\n}\n\n/**\n * Environment detection for appropriate fallbacks\n */\nexport function getEnvironmentType(): 'tui' | 'cli' | 'headless' | 'ci' {\n if (process.env.CI || process.env.CONTINUOUS_INTEGRATION) {\n return 'ci';\n }\n\n if (isHeadlessEnvironment()) {\n return 'headless';\n }\n\n if (process.stdout.isTTY && process.env.TERM !== 'dumb') {\n return 'tui';\n }\n\n return 'cli';\n}\n\nexport default {\n headlessPromptEditor,\n headlessConfirmation,\n headlessSelection,\n headlessAlert,\n getTUICapabilities,\n enhanceForTerminal,\n safeConsoleOutput,\n createHeadlessProgress,\n getEnvironmentType\n};","/**\n * juno-task-ts - TypeScript implementation of juno-task CLI tool\n *\n * Main entry point for the library exports\n */\n\n// Core exports\nexport * from './core/config';\nexport * from './core/engine';\nexport * from './core/session';\nexport * from './core/metrics';\n\n// Utility exports (excluding validateConfig to avoid conflicts)\nexport * from './utils/environment';\nexport * from './utils/hooks';\nexport {\n ValidationError,\n SubagentSchema,\n LogLevelSchema,\n SessionStatusSchema,\n IterationsSchema,\n FilePathSchema,\n DirectoryPathSchema,\n GitUrlSchema,\n SessionIdSchema,\n ModelSchema,\n CLIOptionsSchema,\n ConfigValidationSchema,\n validateSubagent,\n validateModel,\n validateIterations,\n validateLogLevel,\n validatePaths,\n isValidSubagent,\n isValidSessionStatus,\n isValidLogLevel,\n isValidPath,\n sanitizePromptText,\n sanitizeFilePath,\n sanitizeGitUrl,\n sanitizeSessionId,\n formatValidationError,\n validateWithFallback,\n validateEnvironmentVars,\n validateCommandOptions,\n isDefined,\n validateJson,\n validateUniqueArray,\n validateNumberRange,\n validateStringLength\n} from './utils/validation';\n\n// Type exports (consolidated to avoid conflicts)\nexport * from './types';\n\n// TUI exports\nexport * from './tui';\n\n// Version information\nexport { version } from './version';\n\n// MCP exports (full implementation exports)\nexport * from './mcp';\n\n// Template exports\nexport type { TemplateEngine } from './templates/engine';\n\n// Error exports (unified error hierarchy)\nexport * from './errors';","/**\n * Core configuration module for juno-task-ts\n *\n * Provides comprehensive configuration management with multi-source loading,\n * validation, and environment variable support.\n *\n * @module core/config\n */\n\nimport { z } from 'zod';\nimport * as path from 'node:path';\nimport * as nodeFs from 'node:fs';\nimport { promises as fsPromises } from 'node:fs';\nimport * as yaml from 'js-yaml';\nimport fs from 'fs-extra';\nimport type {\n JunoTaskConfig,\n Hooks,\n HookType,\n Hook\n} from '../types/index';\nimport type { ProfileManager } from './profiles.js';\n\n/**\n * Environment variable mapping for configuration options\n * All config options can be set via JUNO_TASK_* environment variables\n */\nexport const ENV_VAR_MAPPING = {\n // Core settings\n JUNO_TASK_DEFAULT_SUBAGENT: 'defaultSubagent',\n JUNO_TASK_DEFAULT_MAX_ITERATIONS: 'defaultMaxIterations',\n JUNO_TASK_DEFAULT_MODEL: 'defaultModel',\n\n // Logging settings\n JUNO_TASK_LOG_LEVEL: 'logLevel',\n JUNO_TASK_LOG_FILE: 'logFile',\n JUNO_TASK_VERBOSE: 'verbose',\n JUNO_TASK_QUIET: 'quiet',\n\n // MCP settings\n JUNO_TASK_MCP_TIMEOUT: 'mcpTimeout',\n JUNO_TASK_MCP_RETRIES: 'mcpRetries',\n JUNO_TASK_MCP_SERVER_PATH: 'mcpServerPath',\n JUNO_TASK_MCP_SERVER_NAME: 'mcpServerName',\n\n // TUI settings\n JUNO_TASK_INTERACTIVE: 'interactive',\n JUNO_TASK_HEADLESS_MODE: 'headlessMode',\n\n // Paths\n JUNO_TASK_WORKING_DIRECTORY: 'workingDirectory',\n JUNO_TASK_SESSION_DIRECTORY: 'sessionDirectory',\n} as const;\n\n/**\n * Zod schema for validating subagent types\n */\nconst SubagentTypeSchema = z.enum(['claude', 'cursor', 'codex', 'gemini']);\n\n/**\n * Zod schema for validating log levels\n */\nconst LogLevelSchema = z.enum(['error', 'warn', 'info', 'debug', 'trace']);\n\n/**\n * Zod schema for validating hook types\n */\nconst HookTypeSchema = z.enum(['START_RUN', 'START_ITERATION', 'END_ITERATION', 'END_RUN']);\n\n/**\n * Zod schema for validating individual hook configuration\n */\nconst HookSchema = z.object({\n commands: z.array(z.string()).describe('List of bash commands to execute for this hook')\n});\n\n/**\n * Zod schema for validating hooks configuration\n * Maps hook types to their respective configurations\n */\nconst HooksSchema = z.record(HookTypeSchema, HookSchema).optional();\n\n/**\n * Zod schema for validating JunoTaskConfig\n * Provides runtime validation with detailed error messages\n */\nexport const JunoTaskConfigSchema = z.object({\n // Core settings\n defaultSubagent: SubagentTypeSchema\n .describe('Default subagent to use for task execution'),\n\n defaultMaxIterations: z.number()\n .int()\n .min(1)\n .max(1000)\n .describe('Default maximum number of iterations for task execution'),\n\n defaultModel: z.string()\n .optional()\n .describe('Default model to use for the subagent'),\n\n // Logging settings\n logLevel: LogLevelSchema\n .describe('Logging level for the application'),\n\n logFile: z.string()\n .optional()\n .describe('Path to log file (optional)'),\n\n verbose: z.boolean()\n .describe('Enable verbose output'),\n\n quiet: z.boolean()\n .describe('Enable quiet mode (minimal output)'),\n\n // MCP settings\n mcpTimeout: z.number()\n .int()\n .min(1000)\n // Allow very large timeouts to satisfy real-world workflows and user tests\n // User feedback requires accepting values like 6,000,000 ms (100 minutes)\n .max(86400000) // up to 24 hours\n .describe('MCP server timeout in milliseconds'),\n\n mcpRetries: z.number()\n .int()\n .min(0)\n .max(10)\n .describe('Number of retries for MCP operations'),\n\n mcpServerPath: z.string()\n .optional()\n .describe('Path to MCP server executable (auto-discovered if not specified)'),\n\n mcpServerName: z.string()\n .optional()\n .describe('Named MCP server to connect to (e.g., \"roundtable-ai\")'),\n\n // TUI settings\n interactive: z.boolean()\n .describe('Enable interactive mode'),\n\n headlessMode: z.boolean()\n .describe('Enable headless mode (no TUI)'),\n\n // Paths\n workingDirectory: z.string()\n .describe('Working directory for task execution'),\n\n sessionDirectory: z.string()\n .describe('Directory for storing session data'),\n\n // Hooks configuration\n hooks: HooksSchema\n .describe('Hook system configuration for executing commands at specific lifecycle events'),\n}).strict();\n\n/**\n * Default configuration values\n * These are used as fallbacks when no other configuration is provided\n */\nexport const DEFAULT_CONFIG: JunoTaskConfig = {\n // Core settings\n defaultSubagent: 'claude',\n defaultMaxIterations: 50,\n\n // Logging settings\n logLevel: 'info',\n verbose: false,\n quiet: false,\n\n // MCP settings\n mcpTimeout: 86400000, // 86400 seconds (24 hours / 1 day) - maximum safe timeout for long-running operations\n mcpRetries: 3,\n mcpServerName: 'roundtable-ai', // Default to roundtable-ai server\n\n // TUI settings\n interactive: true,\n headlessMode: false,\n\n // Paths\n workingDirectory: process.cwd(),\n sessionDirectory: path.join(process.cwd(), '.juno_task'),\n\n // Hooks configuration\n hooks: {},\n};\n\n/**\n * Global configuration file names to search for\n * Searched in order of preference (after project-specific config)\n */\nconst GLOBAL_CONFIG_FILE_NAMES = [\n 'juno-task.config.json',\n 'juno-task.config.js',\n '.juno-taskrc.json',\n '.juno-taskrc.js',\n 'package.json', // Will look for 'junoTask' field\n] as const;\n\n/**\n * Project-specific configuration file (highest precedence for project settings)\n */\nconst PROJECT_CONFIG_FILE = '.juno_task/config.json';\n\n/**\n * Supported configuration file formats\n */\ntype ConfigFileFormat = 'json' | 'yaml' | 'toml' | 'js';\n\n/**\n * Configuration source types for precedence handling\n * Precedence order: cli > env > projectFile > file > profile > defaults\n */\ntype ConfigSource = 'defaults' | 'profile' | 'file' | 'projectFile' | 'env' | 'cli';\n\n/**\n * Utility function to resolve paths (relative to absolute)\n *\n * @param inputPath - The path to resolve\n * @param basePath - Base path for relative resolution (defaults to cwd)\n * @returns Absolute path\n */\nfunction resolvePath(inputPath: string, basePath: string = process.cwd()): string {\n if (path.isAbsolute(inputPath)) {\n return inputPath;\n }\n return path.resolve(basePath, inputPath);\n}\n\n/**\n * Utility function to parse environment variables\n * Handles type conversion for boolean and number values\n *\n * @param value - Environment variable value\n * @returns Parsed value with appropriate type\n */\nfunction parseEnvValue(value: string): string | number | boolean {\n // Handle empty string\n if (value === '') return value;\n\n // Handle boolean values\n if (value.toLowerCase() === 'true') return true;\n if (value.toLowerCase() === 'false') return false;\n\n // Handle numeric values\n const numValue = Number(value);\n if (!isNaN(numValue) && isFinite(numValue)) {\n return numValue;\n }\n\n // Return as string\n return value;\n}\n\n/**\n * Load configuration from environment variables\n * Maps JUNO_TASK_* environment variables to config properties\n *\n * @returns Partial configuration from environment variables\n */\nfunction loadConfigFromEnv(): Partial<JunoTaskConfig> {\n const config: Partial<JunoTaskConfig> = {};\n\n for (const [envVar, configKey] of Object.entries(ENV_VAR_MAPPING)) {\n const value = process.env[envVar];\n if (value !== undefined) {\n (config as any)[configKey] = parseEnvValue(value);\n }\n }\n\n return config;\n}\n\n/**\n * Load configuration from a JSON file\n *\n * @param filePath - Path to the JSON configuration file\n * @returns Parsed configuration object\n */\nasync function loadJsonConfig(filePath: string): Promise<Partial<JunoTaskConfig>> {\n try {\n const content = await fsPromises.readFile(filePath, 'utf-8');\n return JSON.parse(content);\n } catch (error) {\n throw new Error(`Failed to load JSON config from ${filePath}: ${error}`);\n }\n}\n\n/**\n * Load configuration from a YAML file\n *\n * @param filePath - Path to the YAML configuration file\n * @returns Parsed configuration object\n */\nasync function loadYamlConfig(filePath: string): Promise<Partial<JunoTaskConfig>> {\n try {\n const content = await fsPromises.readFile(filePath, 'utf-8');\n const parsed = yaml.load(content);\n return parsed as Partial<JunoTaskConfig>;\n } catch (error) {\n throw new Error(`Failed to load YAML config from ${filePath}: ${error}`);\n }\n}\n\n/**\n * Load configuration from package.json\n * Looks for configuration in the 'junoTask' field\n *\n * @param filePath - Path to package.json\n * @returns Parsed configuration object\n */\nasync function loadPackageJsonConfig(filePath: string): Promise<Partial<JunoTaskConfig>> {\n try {\n const content = await fsPromises.readFile(filePath, 'utf-8');\n const packageJson = JSON.parse(content);\n return packageJson.junoTask || {};\n } catch (error) {\n throw new Error(`Failed to load package.json config from ${filePath}: ${error}`);\n }\n}\n\n/**\n * Determine configuration file format based on file extension\n *\n * @param filePath - Path to the configuration file\n * @returns Configuration file format\n */\nfunction getConfigFileFormat(filePath: string): ConfigFileFormat {\n const ext = path.extname(filePath).toLowerCase();\n\n switch (ext) {\n case '.json':\n return 'json';\n case '.yaml':\n case '.yml':\n return 'yaml';\n case '.toml':\n return 'toml';\n case '.js':\n case '.mjs':\n return 'js';\n default:\n // For files like .juno-taskrc (no extension), assume JSON\n return 'json';\n }\n}\n\n/**\n * Load configuration from a file\n * Automatically detects file format and uses appropriate parser\n *\n * @param filePath - Path to the configuration file\n * @returns Parsed configuration object\n */\nasync function loadConfigFromFile(filePath: string): Promise<Partial<JunoTaskConfig>> {\n const format = getConfigFileFormat(filePath);\n const resolvedPath = resolvePath(filePath);\n\n // Check if file exists\n try {\n await fsPromises.access(resolvedPath, nodeFs.constants.R_OK);\n } catch {\n throw new Error(`Configuration file not readable: ${resolvedPath}`);\n }\n\n switch (format) {\n case 'json':\n if (path.basename(filePath) === 'package.json') {\n return loadPackageJsonConfig(resolvedPath);\n }\n return loadJsonConfig(resolvedPath);\n\n case 'yaml':\n return loadYamlConfig(resolvedPath);\n\n case 'toml':\n // TOML support would require additional dependency\n throw new Error('TOML configuration files are not yet supported');\n\n case 'js':\n // JavaScript config files would require dynamic import\n throw new Error('JavaScript configuration files are not yet supported');\n\n default:\n throw new Error(`Unsupported configuration file format: ${format}`);\n }\n}\n\n/**\n * Find project-specific configuration file\n * Looks for .juno_task/config.json in the specified directory\n *\n * @param searchDir - Directory to search for project configuration file\n * @returns Path to found project config file, or null if none found\n */\nasync function findProjectConfigFile(searchDir: string = process.cwd()): Promise<string | null> {\n const filePath = path.join(searchDir, PROJECT_CONFIG_FILE);\n\n try {\n await fsPromises.access(filePath, nodeFs.constants.R_OK);\n return filePath;\n } catch {\n // File doesn't exist or isn't readable\n return null;\n }\n}\n\n/**\n * Find global configuration file in the specified directory\n * Searches for global config files in order of preference\n *\n * @param searchDir - Directory to search for global configuration files\n * @returns Path to found global config file, or null if none found\n */\nasync function findGlobalConfigFile(searchDir: string = process.cwd()): Promise<string | null> {\n for (const fileName of GLOBAL_CONFIG_FILE_NAMES) {\n const filePath = path.join(searchDir, fileName);\n\n try {\n await fsPromises.access(filePath, nodeFs.constants.R_OK);\n return filePath;\n } catch {\n // File doesn't exist or isn't readable, continue searching\n continue;\n }\n }\n\n return null;\n}\n\n/**\n * Find configuration file in the specified directory (legacy function for backward compatibility)\n * Searches for config files in order of preference\n *\n * @param searchDir - Directory to search for configuration files\n * @returns Path to found configuration file, or null if none found\n * @deprecated Use findProjectConfigFile and findGlobalConfigFile for proper precedence handling\n */\nasync function findConfigFile(searchDir: string = process.cwd()): Promise<string | null> {\n for (const fileName of GLOBAL_CONFIG_FILE_NAMES) {\n const filePath = path.join(searchDir, fileName);\n\n try {\n await fsPromises.access(filePath, nodeFs.constants.R_OK);\n return filePath;\n } catch {\n // File doesn't exist or isn't readable, continue searching\n continue;\n }\n }\n\n return null;\n}\n\n/**\n * ConfigLoader class for multi-source configuration loading\n *\n * Implements configuration precedence: CLI args > Environment Variables > Project Config > Global Config Files > Profile > Defaults\n */\nexport class ConfigLoader {\n private configSources: Map<ConfigSource, Partial<JunoTaskConfig>> = new Map();\n\n /**\n * Create a new ConfigLoader instance\n *\n * @param baseDir - Base directory for relative path resolution\n */\n constructor(private baseDir: string = process.cwd()) {\n // Initialize with defaults\n this.configSources.set('defaults', DEFAULT_CONFIG);\n }\n\n /**\n * Load configuration from environment variables\n *\n * @returns This ConfigLoader instance for method chaining\n */\n fromEnvironment(): this {\n const envConfig = loadConfigFromEnv();\n this.configSources.set('env', envConfig);\n return this;\n }\n\n /**\n * Load configuration from a specific file\n *\n * @param filePath - Path to configuration file\n * @returns This ConfigLoader instance for method chaining\n */\n async fromFile(filePath: string): Promise<this> {\n try {\n const fileConfig = await loadConfigFromFile(filePath);\n this.configSources.set('file', fileConfig);\n } catch (error) {\n throw new Error(`Failed to load configuration file: ${error}`);\n }\n return this;\n }\n\n /**\n * Load configuration from project-specific config file\n * Loads from .juno_task/config.json with highest precedence for project settings\n *\n * @returns This ConfigLoader instance for method chaining\n */\n async fromProjectConfig(): Promise<this> {\n try {\n const projectConfigFile = await findProjectConfigFile(this.baseDir);\n if (projectConfigFile) {\n const fileConfig = await loadConfigFromFile(projectConfigFile);\n this.configSources.set('projectFile', fileConfig);\n }\n } catch (error) {\n throw new Error(`Failed to load project configuration file: ${error}`);\n }\n return this;\n }\n\n /**\n * Automatically discover and load configuration files\n * Searches for both project-specific and global config files in the base directory\n * Project-specific config (.juno_task/config.json) takes precedence over global configs\n *\n * @returns This ConfigLoader instance for method chaining\n */\n async autoDiscoverFile(): Promise<this> {\n // First, try to load project-specific config\n const projectConfigFile = await findProjectConfigFile(this.baseDir);\n if (projectConfigFile) {\n const fileConfig = await loadConfigFromFile(projectConfigFile);\n this.configSources.set('projectFile', fileConfig);\n }\n\n // Then, try to load global config file\n const globalConfigFile = await findGlobalConfigFile(this.baseDir);\n if (globalConfigFile) {\n const fileConfig = await loadConfigFromFile(globalConfigFile);\n this.configSources.set('file', fileConfig);\n }\n\n return this;\n }\n\n /**\n * Load configuration from CLI arguments\n *\n * @param cliConfig - Configuration object from CLI argument parsing\n * @returns This ConfigLoader instance for method chaining\n */\n fromCli(cliConfig: Partial<JunoTaskConfig>): this {\n this.configSources.set('cli', cliConfig);\n return this;\n }\n\n /**\n * Load configuration from active profile\n *\n * @param profileManager - ProfileManager instance to load active profile from\n * @returns This ConfigLoader instance for method chaining\n */\n async fromProfile(profileManager: ProfileManager): Promise<this> {\n try {\n const profileConfig = await profileManager.getActiveProfile();\n this.configSources.set('profile', profileConfig);\n } catch (error) {\n // If profile loading fails, we continue without profile config\n // This allows the system to work even if profiles are misconfigured\n console.warn(`Warning: Failed to load active profile: ${error}`);\n }\n return this;\n }\n\n /**\n * Merge all configuration sources according to precedence\n * CLI args > Environment Variables > Project Config > Global Config Files > Profile > Defaults\n *\n * @returns Merged configuration object\n */\n merge(): JunoTaskConfig {\n // Start with defaults to ensure all required properties are present\n const mergedConfig = { ...DEFAULT_CONFIG };\n\n // Apply sources in order of precedence (lowest to highest)\n const sourcePrecedence: ConfigSource[] = ['profile', 'file', 'projectFile', 'env', 'cli'];\n\n for (const source of sourcePrecedence) {\n const sourceConfig = this.configSources.get(source);\n if (sourceConfig) {\n Object.assign(mergedConfig, sourceConfig);\n }\n }\n\n // Resolve paths to absolute paths\n if (mergedConfig.workingDirectory) {\n mergedConfig.workingDirectory = resolvePath(mergedConfig.workingDirectory, this.baseDir);\n }\n\n if (mergedConfig.sessionDirectory) {\n mergedConfig.sessionDirectory = resolvePath(mergedConfig.sessionDirectory, this.baseDir);\n }\n\n if (mergedConfig.logFile) {\n mergedConfig.logFile = resolvePath(mergedConfig.logFile, this.baseDir);\n }\n\n if (mergedConfig.mcpServerPath) {\n mergedConfig.mcpServerPath = resolvePath(mergedConfig.mcpServerPath, this.baseDir);\n }\n\n return mergedConfig;\n }\n\n /**\n * Load and merge configuration from all sources\n * Convenience method that performs auto-discovery and returns validated config\n *\n * @param cliConfig - Optional CLI configuration\n * @param profileManager - Optional ProfileManager for profile support\n * @returns Promise resolving to validated configuration\n */\n async loadAll(cliConfig?: Partial<JunoTaskConfig>, profileManager?: ProfileManager): Promise<JunoTaskConfig> {\n // Load from environment\n this.fromEnvironment();\n\n // Load from active profile if available\n if (profileManager) {\n await this.fromProfile(profileManager);\n }\n\n // Auto-discover configuration file\n await this.autoDiscoverFile();\n\n // Add CLI config if provided\n if (cliConfig) {\n this.fromCli(cliConfig);\n }\n\n // Merge and return\n return this.merge();\n }\n}\n\n/**\n * Validate configuration object against schema\n *\n * @param config - Configuration object to validate\n * @returns Validated configuration object\n * @throws Error if validation fails\n */\nexport function validateConfig(config: unknown): JunoTaskConfig {\n try {\n const parsed = JunoTaskConfigSchema.parse(config);\n return parsed as JunoTaskConfig;\n } catch (error) {\n if (error instanceof z.ZodError) {\n const errorMessages = error.errors.map(err =>\n `${err.path.join('.')}: ${err.message}`\n ).join('; ');\n throw new Error(`Configuration validation failed: ${errorMessages}`);\n }\n throw error;\n }\n}\n\n/**\n * Ensure hooks configuration exists in project config file\n *\n * This function handles auto-migration for the hooks configuration:\n * - If .juno_task/config.json doesn't exist: create it with default config including empty hooks section\n * - If it exists but has no \"hooks\" field: add hooks: {} to the file\n * - Preserve all existing configuration\n *\n * @param baseDir - Base directory where .juno_task directory should be located\n * @returns Promise that resolves when migration is complete\n */\nasync function ensureHooksConfig(baseDir: string): Promise<void> {\n try {\n const configDir = path.join(baseDir, '.juno_task');\n const configPath = path.join(configDir, 'config.json');\n\n // Ensure the .juno_task directory exists\n await fs.ensureDir(configDir);\n\n // Check if config file exists\n const configExists = await fs.pathExists(configPath);\n\n // Define all available hook types with empty command arrays as examples\n const allHookTypes = {\n START_RUN: { commands: [] },\n START_ITERATION: { commands: [] },\n END_ITERATION: { commands: [] },\n END_RUN: { commands: [] }\n };\n\n if (!configExists) {\n // Create new config file with default config including all hook types\n const defaultConfig = {\n ...DEFAULT_CONFIG,\n hooks: allHookTypes\n };\n await fs.writeJson(configPath, defaultConfig, { spaces: 2 });\n } else {\n // Read existing config and ensure hooks field exists with all hook types\n const existingConfig = await fs.readJson(configPath);\n\n // If hooks field doesn't exist, add it with all hook types\n if (!existingConfig.hooks) {\n existingConfig.hooks = allHookTypes;\n await fs.writeJson(configPath, existingConfig, { spaces: 2 });\n }\n }\n } catch (error) {\n // Log warning but don't block app startup\n console.warn(`Warning: Failed to ensure hooks configuration: ${error}`);\n }\n}\n\n/**\n * Load and validate configuration from all sources\n *\n * This is the main entry point for configuration loading.\n * It performs auto-discovery, merging, and validation.\n *\n * @param options - Configuration loading options\n * @param options.baseDir - Base directory for relative path resolution\n * @param options.configFile - Specific configuration file to load\n * @param options.cliConfig - CLI configuration override\n * @param options.profileManager - ProfileManager for profile support\n * @returns Promise resolving to validated configuration\n *\n * @example\n * ```typescript\n * // Load with auto-discovery\n * const config = await loadConfig();\n *\n * // Load with specific file\n * const config = await loadConfig({\n * configFile: './my-config.json'\n * });\n *\n * // Load with CLI overrides\n * const config = await loadConfig({\n * cliConfig: { verbose: true, logLevel: 'debug' }\n * });\n *\n * // Load with profile support\n * const config = await loadConfig({\n * profileManager: profileManagerInstance\n * });\n * ```\n */\nexport async function loadConfig(options: {\n baseDir?: string;\n configFile?: string;\n cliConfig?: Partial<JunoTaskConfig>;\n profileManager?: ProfileManager;\n} = {}): Promise<JunoTaskConfig> {\n const {\n baseDir = process.cwd(),\n configFile,\n cliConfig,\n profileManager\n } = options;\n\n // Ensure hooks configuration exists in project config (auto-migration)\n await ensureHooksConfig(baseDir);\n\n const loader = new ConfigLoader(baseDir);\n\n // Load from environment\n loader.fromEnvironment();\n\n // Load from active profile if available\n if (profileManager) {\n await loader.fromProfile(profileManager);\n }\n\n // Load from specific file or auto-discover\n if (configFile) {\n await loader.fromFile(configFile);\n } else {\n await loader.autoDiscoverFile();\n }\n\n // Add CLI config if provided\n if (cliConfig) {\n loader.fromCli(cliConfig);\n }\n\n // Merge and validate\n const mergedConfig = loader.merge();\n return validateConfig(mergedConfig);\n}\n\n/**\n * Type export for configuration loading options\n */\nexport type ConfigLoadOptions = Parameters<typeof loadConfig>[0];\n\n/**\n * Type export for environment variable mapping\n */\nexport type EnvVarMapping = typeof ENV_VAR_MAPPING;\n\n/**\n * Re-export ProfileManager and related types for convenience\n */\nexport type { ProfileManager, ProfileConfig, ProfileMetadata } from './profiles.js';\nexport { createProfileManager, ProfileError, ProfileNotFoundError, ProfileExistsError, CircularInheritanceError } from './profiles.js';\n","/**\n * Configuration Profile Management for juno-task-ts\n *\n * Provides comprehensive profile management including creation, switching,\n * inheritance, and import/export functionality as specified in config.md.\n *\n * @module core/profiles\n */\n\nimport { z } from 'zod';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { promises as fsPromises } from 'node:fs';\nimport * as yaml from 'js-yaml';\nimport type { JunoTaskConfig, SubagentType, LogLevel } from '../types/index.js';\n\n/**\n * Profile metadata interface\n */\nexport interface ProfileMetadata {\n /** Profile creation timestamp */\n created: string;\n /** Profile author */\n author?: string;\n /** Profile tags for organization */\n tags?: string[];\n /** Profile version for migrations */\n version?: string;\n /** Profile description */\n description?: string;\n}\n\n/**\n * Profile configuration interface\n */\nexport interface ProfileConfig {\n /** Profile name (must be unique) */\n name: string;\n /** Profile description */\n description?: string;\n /** Profiles to inherit from (applied in order) */\n inherits?: string[];\n /** Partial configuration for this profile */\n config: Partial<JunoTaskConfig>;\n /** Profile metadata */\n metadata?: ProfileMetadata;\n}\n\n/**\n * Profile storage format for persistence\n */\nexport interface ProfileStorage {\n /** Profile configuration */\n profile: ProfileConfig;\n /** Storage format version */\n version: string;\n /** Resolved configuration (computed, not stored) */\n resolvedConfig?: JunoTaskConfig;\n}\n\n/**\n * Zod schema for JunoTaskConfig (partial definition for profiles)\n * This is defined here to avoid circular dependency with config.ts\n */\nconst PartialJunoTaskConfigSchema = z.object({\n defaultSubagent: z.enum(['claude', 'cursor', 'codex', 'gemini']).optional(),\n defaultMaxIterations: z.number().int().min(1).max(1000).optional(),\n defaultModel: z.string().optional(),\n logLevel: z.enum(['error', 'warn', 'info', 'debug', 'trace']).optional(),\n logFile: z.string().optional(),\n verbose: z.boolean().optional(),\n quiet: z.boolean().optional(),\n mcpTimeout: z.number().int().min(1000).max(300000).optional(),\n mcpRetries: z.number().int().min(0).max(10).optional(),\n mcpServerPath: z.string().optional(),\n interactive: z.boolean().optional(),\n headlessMode: z.boolean().optional(),\n workingDirectory: z.string().optional(),\n sessionDirectory: z.string().optional(),\n}).partial();\n\n/**\n * Zod schema for profile validation\n */\nconst ProfileMetadataSchema = z.object({\n created: z.string(),\n author: z.string().optional(),\n tags: z.array(z.string()).optional(),\n version: z.string().optional(),\n description: z.string().optional(),\n});\n\nconst ProfileConfigSchema = z.object({\n name: z.string()\n .min(1)\n .max(50)\n .regex(/^[a-zA-Z0-9_-]+$/, 'Profile name must contain only alphanumeric characters, underscores, and hyphens'),\n description: z.string().optional(),\n inherits: z.array(z.string()).optional(),\n config: PartialJunoTaskConfigSchema,\n metadata: ProfileMetadataSchema.optional(),\n});\n\nconst ProfileStorageSchema = z.object({\n profile: ProfileConfigSchema,\n version: z.string(),\n resolvedConfig: PartialJunoTaskConfigSchema.optional(),\n});\n\n/**\n * Configuration Profile Manager\n *\n * Manages multiple named configuration profiles with inheritance,\n * switching, and import/export functionality.\n */\nexport class ProfileManager {\n private readonly profilesDir: string;\n private readonly activeProfileFile: string;\n private readonly defaultConfigFile: string;\n private profileCache = new Map<string, ProfileConfig>();\n private activeProfile: string | null = null;\n\n constructor(configDir: string) {\n this.profilesDir = path.join(configDir, 'profiles');\n this.activeProfileFile = path.join(configDir, 'active-profile.txt');\n this.defaultConfigFile = path.join(configDir, 'config.json');\n }\n\n /**\n * Initialize the profile system\n */\n async initialize(): Promise<void> {\n // Ensure profiles directory exists\n await fsPromises.mkdir(this.profilesDir, { recursive: true });\n\n // Create default profile if it doesn't exist\n if (!await this.profileExists('default')) {\n await this.createDefaultProfile();\n }\n\n // Load active profile or set default\n try {\n const activeProfileContent = await fsPromises.readFile(this.activeProfileFile, 'utf-8');\n this.activeProfile = activeProfileContent.trim();\n\n // Verify active profile exists\n if (!await this.profileExists(this.activeProfile)) {\n console.warn(`Active profile '${this.activeProfile}' not found, switching to default`);\n await this.setActiveProfile('default');\n }\n } catch {\n // No active profile set, use default\n await this.setActiveProfile('default');\n }\n }\n\n /**\n * List all available profiles\n */\n async listProfiles(): Promise<string[]> {\n try {\n const files = await fsPromises.readdir(this.profilesDir);\n const profiles: string[] = [];\n\n for (const file of files) {\n if (file.endsWith('.json') || file.endsWith('.yaml') || file.endsWith('.yml')) {\n const profileName = this.getProfileNameFromFile(file);\n if (profileName) {\n profiles.push(profileName);\n }\n }\n }\n\n return profiles.sort();\n } catch {\n return [];\n }\n }\n\n /**\n * Get a specific profile configuration\n */\n async getProfile(name: string): Promise<ProfileConfig | null> {\n // Check cache first\n if (this.profileCache.has(name)) {\n return this.profileCache.get(name)!;\n }\n\n const profilePath = await this.findProfileFile(name);\n if (!profilePath) {\n return null;\n }\n\n try {\n const content = await fsPromises.readFile(profilePath, 'utf-8');\n const data = profilePath.endsWith('.json')\n ? JSON.parse(content)\n : yaml.load(content);\n\n const storage = ProfileStorageSchema.parse(data);\n const profile = storage.profile;\n\n // Cache the profile\n this.profileCache.set(name, profile);\n return profile;\n } catch (error) {\n throw new Error(`Failed to load profile '${name}': ${error}`);\n }\n }\n\n /**\n * Get the currently active profile\n */\n getActiveProfileName(): string {\n return this.activeProfile || 'default';\n }\n\n /**\n * Get the active profile configuration with inheritance resolved\n */\n async getActiveProfile(): Promise<JunoTaskConfig> {\n const activeProfileName = this.getActiveProfileName();\n return await this.resolveProfile(activeProfileName);\n }\n\n /**\n * Set the active profile\n */\n async setActiveProfile(name: string): Promise<void> {\n if (!await this.profileExists(name)) {\n throw new Error(`Profile '${name}' does not exist`);\n }\n\n this.activeProfile = name;\n await fsPromises.writeFile(this.activeProfileFile, name, 'utf-8');\n }\n\n /**\n * Create a new profile\n */\n async createProfile(profile: ProfileConfig): Promise<void> {\n // Validate profile\n ProfileConfigSchema.parse(profile);\n\n // Check if profile already exists\n if (await this.profileExists(profile.name)) {\n throw new Error(`Profile '${profile.name}' already exists`);\n }\n\n // Validate inheritance chain\n if (profile.inherits) {\n await this.validateInheritanceChain(profile.inherits, [profile.name]);\n }\n\n // Add metadata if not provided\n if (!profile.metadata) {\n profile.metadata = {\n created: new Date().toISOString(),\n version: '1.0.0',\n };\n }\n\n // Create storage object\n const storage: ProfileStorage = {\n profile,\n version: '1.0.0',\n };\n\n // Save profile\n const profilePath = path.join(this.profilesDir, `${profile.name}.json`);\n await fsPromises.writeFile(profilePath, JSON.stringify(storage, null, 2), 'utf-8');\n\n // Clear cache\n this.profileCache.delete(profile.name);\n }\n\n /**\n * Update an existing profile\n */\n async updateProfile(name: string, updates: Partial<ProfileConfig>): Promise<void> {\n const existing = await this.getProfile(name);\n if (!existing) {\n throw new Error(`Profile '${name}' does not exist`);\n }\n\n // Merge updates\n const updated: ProfileConfig = {\n ...existing,\n ...updates,\n name, // Ensure name doesn't change\n metadata: {\n ...existing.metadata,\n ...updates.metadata,\n },\n };\n\n // Validate updated profile\n ProfileConfigSchema.parse(updated);\n\n // Validate inheritance chain if changed\n if (updates.inherits) {\n await this.validateInheritanceChain(updates.inherits, [name]);\n }\n\n // Save updated profile\n const storage: ProfileStorage = {\n profile: updated,\n version: '1.0.0',\n };\n\n const profilePath = await this.findProfileFile(name);\n if (profilePath) {\n await fsPromises.writeFile(profilePath, JSON.stringify(storage, null, 2), 'utf-8');\n }\n\n // Clear cache\n this.profileCache.delete(name);\n }\n\n /**\n * Delete a profile\n */\n async deleteProfile(name: string): Promise<void> {\n if (name === 'default') {\n throw new Error('Cannot delete the default profile');\n }\n\n if (!await this.profileExists(name)) {\n throw new Error(`Profile '${name}' does not exist`);\n }\n\n // If this is the active profile, switch to default\n if (this.getActiveProfileName() === name) {\n await this.setActiveProfile('default');\n }\n\n // Delete profile file\n const profilePath = await this.findProfileFile(name);\n if (profilePath) {\n await fsPromises.unlink(profilePath);\n }\n\n // Clear cache\n this.profileCache.delete(name);\n }\n\n /**\n * Export a profile to string format\n */\n async exportProfile(name: string, format: 'json' | 'yaml' = 'json'): Promise<string> {\n const profile = await this.getProfile(name);\n if (!profile) {\n throw new Error(`Profile '${name}' does not exist`);\n }\n\n const storage: ProfileStorage = {\n profile,\n version: '1.0.0',\n };\n\n if (format === 'yaml') {\n return yaml.dump(storage, { indent: 2 });\n } else {\n return JSON.stringify(storage, null, 2);\n }\n }\n\n /**\n * Import a profile from string data\n */\n async importProfile(data: string, format: 'json' | 'yaml' = 'json'): Promise<void> {\n let parsed: any;\n\n try {\n if (format === 'yaml') {\n parsed = yaml.load(data);\n } else {\n parsed = JSON.parse(data);\n }\n } catch (error) {\n throw new Error(`Failed to parse ${format}: ${error}`);\n }\n\n // Validate storage format\n const storage = ProfileStorageSchema.parse(parsed);\n\n // Create the profile\n await this.createProfile(storage.profile);\n }\n\n /**\n * Resolve a profile with all inheritance applied\n */\n async resolveProfile(name: string): Promise<JunoTaskConfig> {\n const profile = await this.getProfile(name);\n if (!profile) {\n throw new Error(`Profile '${name}' does not exist`);\n }\n\n // Start with an empty config and build up through inheritance\n let resolvedConfig: Partial<JunoTaskConfig> = {};\n\n // Apply inheritance chain in order\n if (profile.inherits) {\n for (const inheritedName of profile.inherits) {\n const inheritedConfig = await this.resolveProfile(inheritedName);\n resolvedConfig = this.mergeConfigs(resolvedConfig, inheritedConfig);\n }\n }\n\n // Apply this profile's config\n resolvedConfig = this.mergeConfigs(resolvedConfig, profile.config);\n\n // Apply defaults for any missing required fields\n const defaultConfig = this.getDefaultConfig();\n const finalConfig = this.mergeConfigs(defaultConfig, resolvedConfig);\n\n // Return the merged configuration (validation happens in config.ts)\n return finalConfig as JunoTaskConfig;\n }\n\n /**\n * Check if a profile exists\n */\n async profileExists(name: string): Promise<boolean> {\n const profilePath = await this.findProfileFile(name);\n return profilePath !== null;\n }\n\n /**\n * Get profile information including resolved configuration\n */\n async getProfileInfo(name: string): Promise<{\n profile: ProfileConfig;\n resolvedConfig: JunoTaskConfig;\n inheritance: string[];\n }> {\n const profile = await this.getProfile(name);\n if (!profile) {\n throw new Error(`Profile '${name}' does not exist`);\n }\n\n const resolvedConfig = await this.resolveProfile(name);\n const inheritance = await this.getInheritanceChain(name);\n\n return {\n profile,\n resolvedConfig,\n inheritance,\n };\n }\n\n // ============================================================================\n // Private Methods\n // ============================================================================\n\n private async createDefaultProfile(): Promise<void> {\n const defaultProfile: ProfileConfig = {\n name: 'default',\n description: 'Default configuration profile',\n config: this.getDefaultConfig(),\n metadata: {\n created: new Date().toISOString(),\n author: 'system',\n version: '1.0.0',\n description: 'System-generated default profile',\n },\n };\n\n await this.createProfile(defaultProfile);\n }\n\n private async findProfileFile(name: string): Promise<string | null> {\n const extensions = ['.json', '.yaml', '.yml'];\n\n for (const ext of extensions) {\n const filePath = path.join(this.profilesDir, `${name}${ext}`);\n try {\n await fsPromises.access(filePath);\n return filePath;\n } catch {\n // File doesn't exist, try next extension\n }\n }\n\n return null;\n }\n\n private getProfileNameFromFile(filename: string): string | null {\n const match = filename.match(/^(.+)\\.(json|yaml|yml)$/);\n return match ? match[1] : null;\n }\n\n private async validateInheritanceChain(inherits: string[], visited: string[] = []): Promise<void> {\n for (const inheritedName of inherits) {\n if (visited.includes(inheritedName)) {\n throw new Error(`Circular inheritance detected: ${visited.join(' -> ')} -> ${inheritedName}`);\n }\n\n if (!await this.profileExists(inheritedName)) {\n throw new Error(`Inherited profile '${inheritedName}' does not exist`);\n }\n\n const inheritedProfile = await this.getProfile(inheritedName);\n if (inheritedProfile?.inherits) {\n await this.validateInheritanceChain(inheritedProfile.inherits, [...visited, inheritedName]);\n }\n }\n }\n\n private async getInheritanceChain(name: string): Promise<string[]> {\n const profile = await this.getProfile(name);\n if (!profile?.inherits) {\n return [name];\n }\n\n const chain: string[] = [];\n for (const inheritedName of profile.inherits) {\n const inheritedChain = await this.getInheritanceChain(inheritedName);\n chain.push(...inheritedChain);\n }\n chain.push(name);\n\n return chain;\n }\n\n private mergeConfigs(base: Partial<JunoTaskConfig>, override: Partial<JunoTaskConfig>): Partial<JunoTaskConfig> {\n const result = { ...base };\n\n for (const [key, value] of Object.entries(override)) {\n if (value !== undefined) {\n (result as any)[key] = value;\n }\n }\n\n return result;\n }\n\n private getDefaultConfig(): JunoTaskConfig {\n return {\n // Core settings\n defaultSubagent: 'claude',\n defaultMaxIterations: 1,\n defaultModel: undefined,\n\n // Logging settings\n logLevel: 'info',\n logFile: undefined,\n verbose: false,\n quiet: false,\n\n // MCP settings\n mcpTimeout: 30000,\n mcpRetries: 3,\n mcpServerPath: undefined,\n\n // TUI settings\n interactive: false,\n headlessMode: false,\n\n // Paths\n workingDirectory: process.cwd(),\n sessionDirectory: path.join(process.cwd(), '.juno_task', 'sessions'),\n };\n }\n}\n\n/**\n * Create a profile manager instance\n */\nexport function createProfileManager(configDir: string): ProfileManager {\n return new ProfileManager(configDir);\n}\n\n/**\n * Profile management errors\n */\nexport class ProfileError extends Error {\n constructor(message: string, public readonly code: string = 'PROFILE_ERROR') {\n super(message);\n this.name = 'ProfileError';\n }\n}\n\nexport class ProfileNotFoundError extends ProfileError {\n constructor(profileName: string) {\n super(`Profile '${profileName}' not found`, 'PROFILE_NOT_FOUND');\n this.name = 'ProfileNotFoundError';\n }\n}\n\nexport class ProfileExistsError extends ProfileError {\n constructor(profileName: string) {\n super(`Profile '${profileName}' already exists`, 'PROFILE_EXISTS');\n this.name = 'ProfileExistsError';\n }\n}\n\nexport class CircularInheritanceError extends ProfileError {\n constructor(chain: string[]) {\n super(`Circular inheritance detected: ${chain.join(' -> ')}`, 'CIRCULAR_INHERITANCE');\n this.name = 'CircularInheritanceError';\n }\n}","/**\n * Core execution engine module for juno-task-ts\n *\n * This module provides the main execution orchestration engine that manages\n * the entire workflow for AI task execution, including session management,\n * MCP client integration, progress tracking, error handling, and cancellation.\n *\n * The implementation closely matches the Python budi-cli execution patterns,\n * including rate limit handling, iteration logic, and progress tracking.\n *\n * @module core/engine\n * @since 1.0.0\n */\n\nimport { EventEmitter } from 'node:events';\nimport type {\n JunoTaskConfig,\n SubagentType,\n ProgressEventType,\n} from '../types/index';\nimport type {\n MCPClient,\n ProgressEvent,\n ProgressCallback,\n ToolCallRequest,\n ToolCallResult,\n MCPSessionContext,\n} from '../mcp/types';\nimport {\n MCPError,\n MCPRateLimitError,\n} from '../mcp/errors';\nimport { executeHook } from '../utils/hooks.js';\nimport { engineLogger } from '../cli/utils/advanced-logger.js';\n\n// =============================================================================\n// Type Definitions\n// =============================================================================\n\n/**\n * Execution request interface for starting task execution\n */\nexport interface ExecutionRequest {\n /** Unique request identifier */\n readonly requestId: string;\n\n /** Task instruction or prompt text */\n readonly instruction: string;\n\n /** Subagent to use for execution */\n readonly subagent: SubagentType;\n\n /** Working directory for execution */\n readonly workingDirectory: string;\n\n /** Maximum number of iterations (-1 for unlimited) */\n readonly maxIterations: number;\n\n /** Optional specific model to use */\n readonly model?: string;\n\n /** Optional timeout in milliseconds (overrides config) */\n readonly timeoutMs?: number;\n\n /** Session metadata */\n readonly sessionMetadata?: Record<string, unknown>;\n\n /** Custom progress callbacks */\n readonly progressCallbacks?: ProgressCallback[];\n\n /** Request priority level */\n readonly priority?: 'low' | 'normal' | 'high';\n}\n\n/**\n * Execution result interface for completed executions\n */\nexport interface ExecutionResult {\n /** Request that generated this result */\n readonly request: ExecutionRequest;\n\n /** Execution status */\n readonly status: ExecutionStatus;\n\n /** Execution start time */\n readonly startTime: Date;\n\n /** Execution end time */\n readonly endTime: Date;\n\n /** Total execution duration in milliseconds */\n readonly duration: number;\n\n /** All iteration results */\n readonly iterations: readonly IterationResult[];\n\n /** Final execution statistics */\n readonly statistics: ExecutionStatistics;\n\n /** Any error that terminated execution */\n readonly error?: MCPError;\n\n /** Session context information */\n readonly sessionContext: MCPSessionContext;\n\n /** All progress events captured during execution */\n readonly progressEvents: readonly ProgressEvent[];\n}\n\n/**\n * Individual iteration result\n */\nexport interface IterationResult {\n /** Iteration number (1-based) */\n readonly iterationNumber: number;\n\n /** Iteration success status */\n readonly success: boolean;\n\n /** Iteration start time */\n readonly startTime: Date;\n\n /** Iteration end time */\n readonly endTime: Date;\n\n /** Iteration duration in milliseconds */\n readonly duration: number;\n\n /** Tool call result */\n readonly toolResult: ToolCallResult;\n\n /** Iteration-specific progress events */\n readonly progressEvents: readonly ProgressEvent[];\n\n /** Any error that occurred during iteration */\n readonly error?: MCPError;\n}\n\n/**\n * Execution status enumeration\n */\nexport enum ExecutionStatus {\n PENDING = 'pending',\n RUNNING = 'running',\n COMPLETED = 'completed',\n FAILED = 'failed',\n CANCELLED = 'cancelled',\n TIMEOUT = 'timeout',\n RATE_LIMITED = 'rate_limited',\n}\n\n/**\n * Execution statistics for performance tracking\n */\nexport interface ExecutionStatistics {\n /** Total iterations attempted */\n totalIterations: number;\n\n /** Number of successful iterations */\n successfulIterations: number;\n\n /** Number of failed iterations */\n failedIterations: number;\n\n /** Average iteration duration in milliseconds */\n averageIterationDuration: number;\n\n /** Total tool calls made */\n totalToolCalls: number;\n\n /** Total progress events processed */\n totalProgressEvents: number;\n\n /** Rate limit encounters */\n rateLimitEncounters: number;\n\n /** Total rate limit wait time in milliseconds */\n rateLimitWaitTime: number;\n\n /** Error breakdown by type */\n errorBreakdown: Record<string, number>;\n\n /** Performance metrics */\n performanceMetrics: PerformanceMetrics;\n}\n\n/**\n * Performance metrics for detailed analysis\n */\nexport interface PerformanceMetrics {\n /** CPU usage percentage during execution */\n cpuUsage: number;\n\n /** Memory usage in bytes */\n memoryUsage: number;\n\n /** Network requests made */\n networkRequests: number;\n\n /** File system operations */\n fileSystemOperations: number;\n\n /** Throughput metrics */\n throughput: ThroughputMetrics;\n}\n\n/**\n * Throughput metrics\n */\nexport interface ThroughputMetrics {\n /** Iterations per minute */\n iterationsPerMinute: number;\n\n /** Progress events per second */\n progressEventsPerSecond: number;\n\n /** Tool calls per minute */\n toolCallsPerMinute: number;\n}\n\n/**\n * Rate limit information for handling\n */\nexport interface RateLimitInfo {\n /** Whether currently rate limited */\n readonly isRateLimited: boolean;\n\n /** Rate limit reset time */\n readonly resetTime?: Date;\n\n /** Remaining requests in current window */\n readonly remaining: number;\n\n /** Time to wait before next request in milliseconds */\n readonly waitTimeMs: number;\n\n /** Rate limit tier/category */\n readonly tier?: string;\n}\n\n/**\n * Error recovery strategy configuration\n */\nexport interface ErrorRecoveryConfig {\n /** Maximum recovery attempts per error type */\n readonly maxAttempts: Record<string, number>;\n\n /** Retry delays by error type in milliseconds */\n readonly retryDelays: Record<string, number>;\n\n /** Whether to continue on specific error types */\n readonly continueOnError: Record<string, boolean>;\n\n /** Custom recovery strategies */\n readonly customStrategies: Record<string, (error: MCPError) => Promise<boolean>>;\n}\n\n/**\n * Execution engine configuration\n */\nexport interface ExecutionEngineConfig {\n /** Base configuration */\n readonly config: JunoTaskConfig;\n\n /** MCP client instance */\n readonly mcpClient: MCPClient;\n\n /** Error recovery configuration */\n readonly errorRecovery: ErrorRecoveryConfig;\n\n /** Rate limit handling configuration */\n readonly rateLimitConfig: RateLimitHandlingConfig;\n\n /** Progress tracking configuration */\n readonly progressConfig: ProgressTrackingConfig;\n}\n\n/**\n * Rate limit handling configuration\n */\nexport interface RateLimitHandlingConfig {\n /** Enable automatic rate limit handling */\n readonly enabled: boolean;\n\n /** Maximum wait time for rate limits in milliseconds */\n readonly maxWaitTimeMs: number;\n\n /** Rate limit detection patterns */\n readonly detectionPatterns: readonly RegExp[];\n\n /** Custom rate limit parsers */\n readonly customParsers: readonly RateLimitParser[];\n}\n\n/**\n * Rate limit parser interface\n */\nexport interface RateLimitParser {\n /** Pattern to match rate limit messages */\n readonly pattern: RegExp;\n\n /** Parse function to extract reset time */\n readonly parse: (message: string) => Date | null;\n}\n\n/**\n * Progress tracking configuration\n */\nexport interface ProgressTrackingConfig {\n /** Enable progress tracking */\n readonly enabled: boolean;\n\n /** Buffer size for progress events */\n readonly bufferSize: number;\n\n /** Progress event filters */\n readonly filters: readonly ProgressEventFilter[];\n\n /** Custom progress processors */\n readonly processors: readonly ProgressEventProcessor[];\n}\n\n/**\n * Progress event filter\n */\nexport interface ProgressEventFilter {\n /** Filter type */\n readonly type: ProgressEventType | 'custom';\n\n /** Filter predicate */\n readonly predicate: (event: ProgressEvent) => boolean;\n}\n\n/**\n * Progress event processor\n */\nexport interface ProgressEventProcessor {\n /** Processor name */\n readonly name: string;\n\n /** Process function */\n readonly process: (event: ProgressEvent) => Promise<void>;\n}\n\n// =============================================================================\n// Default Configurations\n// =============================================================================\n\n/**\n * Default error recovery configuration\n */\nexport const DEFAULT_ERROR_RECOVERY_CONFIG: ErrorRecoveryConfig = {\n maxAttempts: {\n connection: 3,\n timeout: 2,\n rate_limit: 5,\n tool_execution: 2,\n validation: 1,\n server_not_found: 1,\n protocol: 2,\n authentication: 1,\n },\n retryDelays: {\n connection: 1000,\n timeout: 2000,\n rate_limit: 0, // Wait time determined by rate limit reset\n tool_execution: 1500,\n validation: 0, // No retry for validation errors\n server_not_found: 0, // No retry for server not found\n protocol: 1000,\n authentication: 0, // No retry for auth errors\n },\n continueOnError: {\n connection: true,\n timeout: true,\n rate_limit: true,\n tool_execution: false,\n validation: false,\n server_not_found: false,\n protocol: true,\n authentication: false,\n },\n customStrategies: {},\n};\n\n/**\n * Default rate limit handling configuration\n */\nexport const DEFAULT_RATE_LIMIT_CONFIG: RateLimitHandlingConfig = {\n enabled: true,\n maxWaitTimeMs: 3600000, // 1 hour\n detectionPatterns: [\n /resets\\s+(\\d{1,2}):?(\\d{2})?\\s*(am|pm)?/i,\n /resets\\s+(\\d{1,2})\\s*(am|pm)/i,\n /try again in (\\d+)\\s*(minutes?|hours?)/i,\n /5-hour limit reached.*resets\\s+(\\d{1,2})\\s*(am|pm)/i,\n ],\n customParsers: [],\n};\n\n/**\n * Default progress tracking configuration\n */\nexport const DEFAULT_PROGRESS_CONFIG: ProgressTrackingConfig = {\n enabled: true,\n bufferSize: 10000,\n filters: [],\n processors: [],\n};\n\n// =============================================================================\n// Main ExecutionEngine Class\n// =============================================================================\n\n/**\n * Main execution engine class for orchestrating AI task execution\n *\n * This class manages the complete execution lifecycle including:\n * - Session creation and management\n * - Iteration loop with rate limit handling\n * - Progress tracking and statistics collection\n * - Error handling with recovery strategies\n * - Cancellation and cleanup\n *\n * @example\n * ```typescript\n * const engine = new ExecutionEngine({\n * config: await loadConfig(),\n * mcpClient: new MCPClientImpl(mcpConfig),\n * errorRecovery: DEFAULT_ERROR_RECOVERY_CONFIG,\n * rateLimitConfig: DEFAULT_RATE_LIMIT_CONFIG,\n * progressConfig: DEFAULT_PROGRESS_CONFIG,\n * });\n *\n * const request: ExecutionRequest = {\n * requestId: 'req-123',\n * instruction: 'Implement a new feature',\n * subagent: 'claude',\n * workingDirectory: '/path/to/project',\n * maxIterations: 10,\n * };\n *\n * const result = await engine.execute(request);\n * ```\n */\nexport class ExecutionEngine extends EventEmitter {\n private readonly engineConfig: ExecutionEngineConfig;\n private readonly activeExecutions = new Map<string, ExecutionContext>();\n private readonly progressCallbacks: ProgressCallback[] = [];\n private readonly cleanupTasks: (() => Promise<void>)[] = [];\n private isShuttingDown = false;\n\n /**\n * Create a new ExecutionEngine instance\n *\n * @param config - Engine configuration\n */\n constructor(config: ExecutionEngineConfig) {\n super();\n this.engineConfig = config;\n this.setupErrorHandling();\n this.setupProgressTracking();\n }\n\n // =============================================================================\n // Public API Methods\n // =============================================================================\n\n /**\n * Execute a task request with comprehensive orchestration\n *\n * @param request - Execution request parameters\n * @param abortSignal - Optional abort signal for cancellation\n * @returns Promise resolving to execution result\n */\n async execute(\n request: ExecutionRequest,\n abortSignal?: AbortSignal\n ): Promise<ExecutionResult> {\n this.validateRequest(request);\n\n const context = this.createExecutionContext(request, abortSignal);\n this.activeExecutions.set(request.requestId, context);\n\n try {\n this.emit('execution:start', { request, context });\n\n const result = await this.executeInternal(context);\n\n this.emit('execution:complete', { request, result });\n return result;\n } catch (error) {\n const mcpError = this.wrapError(error);\n this.emit('execution:error', { request, error: mcpError });\n throw mcpError;\n } finally {\n this.activeExecutions.delete(request.requestId);\n await this.cleanupExecution(context);\n }\n }\n\n /**\n * Add a progress callback for all executions\n *\n * @param callback - Progress callback function\n * @returns Cleanup function to remove the callback\n */\n onProgress(callback: ProgressCallback): () => void {\n this.progressCallbacks.push(callback);\n return () => {\n const index = this.progressCallbacks.indexOf(callback);\n if (index !== -1) {\n this.progressCallbacks.splice(index, 1);\n }\n };\n }\n\n /**\n * Get current rate limit information\n *\n * @returns Current rate limit status\n */\n async getRateLimitInfo(): Promise<RateLimitInfo> {\n // Implementation would query MCP client for rate limit status\n return {\n isRateLimited: false,\n remaining: 100,\n resetTime: new Date(Date.now() + 60000), // 1 minute from now\n waitTimeMs: 0,\n };\n }\n\n /**\n * Cancel all active executions and shutdown gracefully\n *\n * @param timeoutMs - Maximum time to wait for cleanup\n */\n async shutdown(timeoutMs: number = 30000): Promise<void> {\n if (this.isShuttingDown) {\n return;\n }\n\n this.isShuttingDown = true;\n this.emit('engine:shutdown:start');\n\n try {\n // Cancel all active executions\n const cancellationPromises = Array.from(this.activeExecutions.values()).map(\n context => this.cancelExecution(context)\n );\n\n // Wait for cancellations with timeout\n await Promise.race([\n Promise.all(cancellationPromises),\n new Promise((_, reject) =>\n setTimeout(() => reject(new Error('Shutdown timeout')), timeoutMs)\n ),\n ]);\n\n // Run cleanup tasks\n await Promise.all(this.cleanupTasks.map(task => task()));\n\n this.emit('engine:shutdown:complete');\n } catch (error) {\n this.emit('engine:shutdown:error', error);\n throw error;\n } finally {\n this.removeAllListeners();\n }\n }\n\n /**\n * Get statistics for all executions\n *\n * @returns Aggregate execution statistics\n */\n getExecutionStatistics(): ExecutionStatistics {\n const contexts = Array.from(this.activeExecutions.values());\n\n return {\n totalIterations: contexts.reduce((sum, ctx) => sum + ctx.statistics.totalIterations, 0),\n successfulIterations: contexts.reduce((sum, ctx) => sum + ctx.statistics.successfulIterations, 0),\n failedIterations: contexts.reduce((sum, ctx) => sum + ctx.statistics.failedIterations, 0),\n averageIterationDuration: this.calculateAverageIterationDuration(contexts),\n totalToolCalls: contexts.reduce((sum, ctx) => sum + ctx.statistics.totalToolCalls, 0),\n totalProgressEvents: contexts.reduce((sum, ctx) => sum + ctx.statistics.totalProgressEvents, 0),\n rateLimitEncounters: contexts.reduce((sum, ctx) => sum + ctx.statistics.rateLimitEncounters, 0),\n rateLimitWaitTime: contexts.reduce((sum, ctx) => sum + ctx.statistics.rateLimitWaitTime, 0),\n errorBreakdown: this.aggregateErrorBreakdown(contexts),\n performanceMetrics: this.calculatePerformanceMetrics(contexts),\n };\n }\n\n // =============================================================================\n // Private Implementation Methods\n // =============================================================================\n\n /**\n * Setup error handling for the engine\n */\n private setupErrorHandling(): void {\n this.engineConfig.mcpClient.on('connection:error', (error: Error) => {\n this.emit('engine:error', error);\n });\n\n process.on('uncaughtException', (error) => {\n this.emit('engine:uncaught-exception', error);\n });\n\n process.on('unhandledRejection', (reason) => {\n this.emit('engine:unhandled-rejection', reason);\n });\n }\n\n /**\n * Setup progress tracking for the engine\n */\n private setupProgressTracking(): void {\n this.engineConfig.mcpClient.onProgress(async (event: ProgressEvent) => {\n try {\n // Process through configured processors\n for (const processor of this.engineConfig.progressConfig.processors) {\n await processor.process(event);\n }\n\n // Notify all registered callbacks\n await Promise.all([\n ...this.progressCallbacks.map(callback => callback(event)),\n ]);\n\n this.emit('progress:event', event);\n } catch (error) {\n this.emit('progress:error', { event, error });\n }\n });\n }\n\n /**\n * Validate execution request parameters\n */\n private validateRequest(request: ExecutionRequest): void {\n if (!request.requestId?.trim()) {\n throw new Error('Request ID is required');\n }\n\n if (!request.instruction?.trim()) {\n throw new Error('Instruction is required');\n }\n\n if (!request.subagent?.trim()) {\n throw new Error('Subagent is required');\n }\n\n if (!request.workingDirectory?.trim()) {\n throw new Error('Working directory is required');\n }\n\n if (request.maxIterations < -1 || request.maxIterations === 0) {\n throw new Error('Max iterations must be positive or -1 for unlimited');\n }\n }\n\n /**\n * Create execution context for a request\n */\n private createExecutionContext(\n request: ExecutionRequest,\n abortSignal?: AbortSignal\n ): ExecutionContext {\n const abortController = new AbortController();\n\n // Chain external abort signal if provided\n if (abortSignal) {\n abortSignal.addEventListener('abort', () => {\n abortController.abort();\n });\n }\n\n return {\n request,\n status: ExecutionStatus.PENDING,\n startTime: new Date(),\n endTime: null,\n iterations: [],\n statistics: this.createInitialStatistics(),\n progressEvents: [],\n error: null,\n abortController,\n sessionContext: this.createSessionContext(request),\n rateLimitInfo: {\n isRateLimited: false,\n remaining: 100,\n waitTimeMs: 0,\n },\n };\n }\n\n /**\n * Create initial statistics object\n */\n private createInitialStatistics(): ExecutionStatistics {\n return {\n totalIterations: 0,\n successfulIterations: 0,\n failedIterations: 0,\n averageIterationDuration: 0,\n totalToolCalls: 0,\n totalProgressEvents: 0,\n rateLimitEncounters: 0,\n rateLimitWaitTime: 0,\n errorBreakdown: {},\n performanceMetrics: {\n cpuUsage: 0,\n memoryUsage: 0,\n networkRequests: 0,\n fileSystemOperations: 0,\n throughput: {\n iterationsPerMinute: 0,\n progressEventsPerSecond: 0,\n toolCallsPerMinute: 0,\n },\n },\n };\n }\n\n /**\n * Create session context for execution\n */\n private createSessionContext(request: ExecutionRequest): MCPSessionContext {\n return {\n sessionId: `session-${request.requestId}`,\n startTime: new Date(),\n userId: 'system',\n metadata: {\n ...request.sessionMetadata,\n subagent: request.subagent,\n workingDirectory: request.workingDirectory,\n },\n activeToolCalls: [],\n state: 'initializing' as any,\n lastActivity: new Date(),\n };\n }\n\n /**\n * Internal execution implementation\n */\n private async executeInternal(context: ExecutionContext): Promise<ExecutionResult> {\n context.status = ExecutionStatus.RUNNING;\n context.sessionContext = { ...context.sessionContext, state: 'active' as any };\n\n // Execute START_RUN hook\n try {\n if (this.engineConfig.config.hooks) {\n await executeHook('START_RUN', this.engineConfig.config.hooks, {\n workingDirectory: context.request.workingDirectory,\n sessionId: context.sessionContext.sessionId,\n runId: context.request.requestId,\n metadata: {\n sessionId: context.sessionContext.sessionId,\n requestId: context.request.requestId,\n subagent: context.request.subagent,\n maxIterations: context.request.maxIterations,\n instruction: context.request.instruction,\n }\n });\n }\n } catch (error) {\n engineLogger.warn('Hook START_RUN failed', { error });\n // Continue execution despite hook failure\n }\n\n try {\n await this.runIterationLoop(context);\n\n context.status = ExecutionStatus.COMPLETED;\n context.sessionContext = { ...context.sessionContext, state: 'completed' as any };\n } catch (error) {\n context.error = this.wrapError(error);\n context.status = this.determineErrorStatus(context.error);\n context.sessionContext = { ...context.sessionContext, state: 'failed' as any };\n } finally {\n context.endTime = new Date();\n }\n\n // Execute END_RUN hook\n try {\n if (this.engineConfig.config.hooks) {\n await executeHook('END_RUN', this.engineConfig.config.hooks, {\n workingDirectory: context.request.workingDirectory,\n sessionId: context.sessionContext.sessionId,\n runId: context.request.requestId,\n metadata: {\n sessionId: context.sessionContext.sessionId,\n requestId: context.request.requestId,\n status: context.status,\n totalIterations: context.statistics.totalIterations,\n successfulIterations: context.statistics.successfulIterations,\n failedIterations: context.statistics.failedIterations,\n duration: context.endTime ? context.endTime.getTime() - context.startTime.getTime() : 0,\n success: context.status === ExecutionStatus.COMPLETED,\n }\n });\n }\n } catch (error) {\n engineLogger.warn('Hook END_RUN failed', { error });\n // Continue execution despite hook failure\n }\n\n return this.createExecutionResult(context);\n }\n\n /**\n * Run the main iteration loop\n */\n private async runIterationLoop(context: ExecutionContext): Promise<void> {\n let iterationNumber = 1;\n\n while (!this.shouldStopIterating(context, iterationNumber)) {\n this.checkAbortSignal(context);\n\n try {\n await this.executeIteration(context, iterationNumber);\n iterationNumber++;\n } catch (error) {\n if (error instanceof MCPRateLimitError) {\n await this.handleRateLimit(context, error);\n // Don't increment iteration number, retry same iteration\n continue;\n }\n\n const shouldContinue = await this.handleIterationError(context, error, iterationNumber);\n if (!shouldContinue) {\n throw error;\n }\n\n iterationNumber++;\n }\n\n // Brief delay between iterations\n await this.sleep(2000);\n }\n }\n\n /**\n * Execute a single iteration\n */\n private async executeIteration(context: ExecutionContext, iterationNumber: number): Promise<void> {\n const iterationStart = new Date();\n\n // Execute START_ITERATION hook\n try {\n if (this.engineConfig.config.hooks) {\n await executeHook('START_ITERATION', this.engineConfig.config.hooks, {\n workingDirectory: context.request.workingDirectory,\n sessionId: context.sessionContext.sessionId,\n runId: context.request.requestId,\n iteration: iterationNumber,\n totalIterations: context.request.maxIterations,\n metadata: {\n sessionId: context.sessionContext.sessionId,\n requestId: context.request.requestId,\n iterationNumber,\n maxIterations: context.request.maxIterations,\n subagent: context.request.subagent,\n }\n });\n }\n } catch (error) {\n engineLogger.warn('Hook START_ITERATION failed', { error, iterationNumber });\n // Continue execution despite hook failure\n }\n\n\n this.emit('iteration:start', { context, iterationNumber });\n\n const toolRequest: ToolCallRequest = {\n toolName: this.getToolNameForSubagent(context.request.subagent),\n arguments: {\n instruction: context.request.instruction,\n project_path: context.request.workingDirectory,\n ...(context.request.model !== undefined && { model: context.request.model }),\n iteration: iterationNumber,\n },\n timeout: context.request.timeoutMs || this.engineConfig.config.mcpTimeout,\n priority: context.request.priority || 'normal',\n metadata: {\n sessionId: context.sessionContext.sessionId,\n iterationNumber,\n },\n progressCallback: async (event: ProgressEvent) => {\n context.progressEvents.push(event);\n context.statistics.totalProgressEvents++;\n await this.processProgressEvent(context, event);\n },\n };\n\n try {\n const toolResult = await this.engineConfig.mcpClient.callTool(toolRequest);\n\n const iterationEnd = new Date();\n const duration = iterationEnd.getTime() - iterationStart.getTime();\n\n const iterationResult: IterationResult = {\n iterationNumber,\n success: toolResult.status?.toLowerCase() === 'completed',\n startTime: iterationStart,\n endTime: iterationEnd,\n duration,\n toolResult,\n progressEvents: toolResult.progressEvents,\n ...(toolResult.error !== undefined && toolResult.error !== null && { error: toolResult.error }),\n };\n\n context.iterations.push(iterationResult);\n this.updateStatistics(context, iterationResult);\n\n this.emit('iteration:complete', { context, iterationResult });\n\n // Execute END_ITERATION hook for successful iteration\n try {\n if (this.engineConfig.config.hooks) {\n await executeHook('END_ITERATION', this.engineConfig.config.hooks, {\n workingDirectory: context.request.workingDirectory,\n sessionId: context.sessionContext.sessionId,\n runId: context.request.requestId,\n iteration: iterationNumber,\n totalIterations: context.request.maxIterations,\n metadata: {\n sessionId: context.sessionContext.sessionId,\n requestId: context.request.requestId,\n iterationNumber,\n success: iterationResult.success,\n duration: iterationResult.duration,\n toolCallStatus: iterationResult.toolResult.status,\n }\n });\n }\n } catch (error) {\n engineLogger.warn('Hook END_ITERATION failed', { error, iterationNumber });\n // Continue execution despite hook failure\n }\n } catch (error) {\n const iterationEnd = new Date();\n const duration = iterationEnd.getTime() - iterationStart.getTime();\n const mcpError = this.wrapError(error);\n\n const iterationResult: IterationResult = {\n iterationNumber,\n success: false,\n startTime: iterationStart,\n endTime: iterationEnd,\n duration,\n toolResult: {\n content: '',\n status: 'failed' as any,\n startTime: iterationStart,\n endTime: iterationEnd,\n duration,\n error: mcpError,\n progressEvents: [],\n request: toolRequest,\n },\n progressEvents: [],\n error: mcpError,\n };\n\n context.iterations.push(iterationResult);\n this.updateStatistics(context, iterationResult);\n\n this.emit('iteration:error', { context, iterationResult });\n\n // Execute END_ITERATION hook for failed iteration\n try {\n if (this.engineConfig.config.hooks) {\n await executeHook('END_ITERATION', this.engineConfig.config.hooks, {\n workingDirectory: context.request.workingDirectory,\n sessionId: context.sessionContext.sessionId,\n runId: context.request.requestId,\n iteration: iterationNumber,\n totalIterations: context.request.maxIterations,\n metadata: {\n sessionId: context.sessionContext.sessionId,\n requestId: context.request.requestId,\n iterationNumber,\n success: false,\n duration: iterationResult.duration,\n error: mcpError.message,\n errorType: mcpError.type,\n }\n });\n }\n } catch (hookError) {\n engineLogger.warn('Hook END_ITERATION failed', { error: hookError, iterationNumber });\n // Continue execution despite hook failure\n }\n\n throw error;\n }\n }\n\n /**\n * Handle rate limit errors with automatic retry\n */\n private async handleRateLimit(context: ExecutionContext, error: MCPRateLimitError): Promise<void> {\n if (!this.engineConfig.rateLimitConfig.enabled) {\n throw error;\n }\n\n context.statistics.rateLimitEncounters++;\n\n const waitTimeMs = this.calculateRateLimitWaitTime(error);\n if (waitTimeMs > this.engineConfig.rateLimitConfig.maxWaitTimeMs) {\n throw new Error(`Rate limit wait time (${waitTimeMs}ms) exceeds maximum allowed (${this.engineConfig.rateLimitConfig.maxWaitTimeMs}ms)`);\n }\n\n context.statistics.rateLimitWaitTime += waitTimeMs;\n context.rateLimitInfo = {\n isRateLimited: true,\n ...(error.resetTime !== undefined && { resetTime: error.resetTime }),\n remaining: error.remaining || 0,\n waitTimeMs,\n ...(error.tier !== undefined && { tier: error.tier }),\n };\n\n this.emit('rate-limit:start', { context, error, waitTimeMs });\n\n await this.sleep(waitTimeMs);\n\n context.rateLimitInfo = {\n isRateLimited: false,\n remaining: 100,\n waitTimeMs: 0,\n };\n\n this.emit('rate-limit:end', { context });\n }\n\n /**\n * Calculate wait time for rate limit reset\n */\n private calculateRateLimitWaitTime(error: MCPRateLimitError): number {\n if (error.resetTime) {\n const now = new Date();\n const waitTime = error.resetTime.getTime() - now.getTime();\n return Math.max(0, waitTime);\n }\n\n // Default wait time if no reset time provided\n return 60000; // 1 minute\n }\n\n /**\n * Handle iteration errors with recovery strategies\n */\n private async handleIterationError(\n context: ExecutionContext,\n error: unknown,\n iterationNumber: number\n ): Promise<boolean> {\n const mcpError = this.wrapError(error);\n const errorType = mcpError.type;\n\n context.statistics.errorBreakdown[errorType] = (context.statistics.errorBreakdown[errorType] || 0) + 1;\n\n // Check if we should continue on this error type\n const shouldContinue = this.engineConfig.errorRecovery.continueOnError[errorType] ?? false;\n if (!shouldContinue) {\n return false;\n }\n\n // Attempt recovery if strategy exists\n const customStrategy = this.engineConfig.errorRecovery.customStrategies[errorType];\n if (customStrategy) {\n try {\n const recovered = await customStrategy(mcpError);\n if (recovered) {\n this.emit('error:recovered', { context, error: mcpError, iterationNumber });\n return true;\n }\n } catch (recoveryError) {\n this.emit('error:recovery-failed', { context, error: mcpError, recoveryError, iterationNumber });\n }\n }\n\n // Apply retry delay if configured\n const retryDelay = this.engineConfig.errorRecovery.retryDelays[errorType] || 0;\n if (retryDelay > 0) {\n await this.sleep(retryDelay);\n }\n\n this.emit('error:continuing', { context, error: mcpError, iterationNumber });\n return true;\n }\n\n /**\n * Process individual progress events\n */\n private async processProgressEvent(context: ExecutionContext, event: ProgressEvent): Promise<void> {\n // Apply filters\n for (const filter of this.engineConfig.progressConfig.filters) {\n if (!filter.predicate(event)) {\n return;\n }\n }\n\n // Update session activity\n context.sessionContext = {\n ...context.sessionContext,\n lastActivity: new Date(),\n };\n\n this.emit('progress:processed', { context, event });\n }\n\n /**\n * Update execution statistics\n */\n private updateStatistics(context: ExecutionContext, iteration: IterationResult): void {\n const stats = context.statistics;\n\n stats.totalIterations++;\n stats.totalToolCalls++;\n\n if (iteration.success) {\n stats.successfulIterations++;\n } else {\n stats.failedIterations++;\n }\n\n // Update average iteration duration\n const totalDuration = stats.averageIterationDuration * (stats.totalIterations - 1) + iteration.duration;\n stats.averageIterationDuration = totalDuration / stats.totalIterations;\n\n // Update performance metrics\n this.updatePerformanceMetrics(context);\n }\n\n /**\n * Update performance metrics\n */\n private updatePerformanceMetrics(context: ExecutionContext): void {\n const metrics = context.statistics.performanceMetrics;\n\n // Get current resource usage\n const memUsage = process.memoryUsage();\n metrics.memoryUsage = memUsage.heapUsed;\n\n // Calculate throughput\n const duration = Date.now() - context.startTime.getTime();\n const durationMinutes = duration / (1000 * 60);\n\n if (durationMinutes > 0) {\n metrics.throughput.iterationsPerMinute = context.statistics.totalIterations / durationMinutes;\n metrics.throughput.toolCallsPerMinute = context.statistics.totalToolCalls / durationMinutes;\n metrics.throughput.progressEventsPerSecond = context.statistics.totalProgressEvents / (duration / 1000);\n }\n }\n\n /**\n * Check if iteration loop should stop\n */\n private shouldStopIterating(context: ExecutionContext, iterationNumber: number): boolean {\n // Check abort signal\n if (context.abortController.signal.aborted) {\n return true;\n }\n\n // Check max iterations\n if (context.request.maxIterations !== -1 && iterationNumber > context.request.maxIterations) {\n return true;\n }\n\n // Check for shutdown\n if (this.isShuttingDown) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Check abort signal and throw if aborted\n */\n private checkAbortSignal(context: ExecutionContext): void {\n if (context.abortController.signal.aborted) {\n throw new Error('Execution aborted');\n }\n }\n\n /**\n * Get tool name for subagent\n */\n private getToolNameForSubagent(subagent: SubagentType): string {\n const mapping: Record<SubagentType, string> = {\n claude: 'claude_subagent',\n cursor: 'cursor_subagent',\n codex: 'codex_subagent',\n gemini: 'gemini_subagent',\n };\n\n return mapping[subagent] || 'claude_subagent';\n }\n\n /**\n * Wrap unknown errors as MCP errors\n */\n private wrapError(error: unknown): MCPError {\n if (error instanceof MCPError) {\n return error;\n }\n\n // Classify common transport/socket failures as connection errors so the loop can continue\n const msg = error instanceof Error ? `${error.name}: ${error.message}` : String(error);\n const lower = msg.toLowerCase();\n const isConnectionLike = [\n 'epipe',\n 'broken pipe',\n 'econnreset',\n 'socket hang up',\n 'err_socket_closed',\n 'connection reset by peer',\n ].some(token => lower.includes(token));\n\n if (isConnectionLike) {\n return {\n type: 'connection',\n message: msg,\n timestamp: new Date(),\n code: 'MCP_CONNECTION_LOST' as any,\n } as any;\n }\n\n // Fallback: treat as tool execution error\n return {\n type: 'tool_execution',\n message: msg,\n timestamp: new Date(),\n } as any;\n }\n\n /**\n * Determine execution status from error\n */\n private determineErrorStatus(error: MCPError): ExecutionStatus {\n switch (error.type) {\n case 'rate_limit':\n return ExecutionStatus.RATE_LIMITED;\n case 'timeout':\n return ExecutionStatus.TIMEOUT;\n default:\n return ExecutionStatus.FAILED;\n }\n }\n\n /**\n * Create final execution result\n */\n private createExecutionResult(context: ExecutionContext): ExecutionResult {\n const endTime = context.endTime || new Date();\n return {\n request: context.request,\n status: context.status,\n startTime: context.startTime,\n endTime,\n duration: endTime.getTime() - context.startTime.getTime(),\n iterations: context.iterations,\n statistics: context.statistics,\n ...(context.error !== undefined && context.error !== null && { error: context.error }),\n sessionContext: context.sessionContext,\n progressEvents: context.progressEvents,\n };\n }\n\n /**\n * Cancel an execution\n */\n private async cancelExecution(context: ExecutionContext): Promise<void> {\n context.abortController.abort();\n context.status = ExecutionStatus.CANCELLED;\n this.emit('execution:cancelled', { context });\n }\n\n /**\n * Cleanup execution resources\n */\n private async cleanupExecution(context: ExecutionContext): Promise<void> {\n // Cleanup would happen here\n this.emit('execution:cleanup', { context });\n }\n\n /**\n * Calculate average iteration duration across contexts\n */\n private calculateAverageIterationDuration(contexts: ExecutionContext[]): number {\n if (contexts.length === 0) return 0;\n\n const totalDuration = contexts.reduce((sum, ctx) =>\n sum + ctx.statistics.averageIterationDuration * ctx.statistics.totalIterations, 0\n );\n const totalIterations = contexts.reduce((sum, ctx) => sum + ctx.statistics.totalIterations, 0);\n\n return totalIterations > 0 ? totalDuration / totalIterations : 0;\n }\n\n /**\n * Aggregate error breakdown across contexts\n */\n private aggregateErrorBreakdown(contexts: ExecutionContext[]): Record<string, number> {\n const breakdown: Record<string, number> = {};\n\n for (const context of contexts) {\n for (const [errorType, count] of Object.entries(context.statistics.errorBreakdown)) {\n breakdown[errorType] = (breakdown[errorType] || 0) + count;\n }\n }\n\n return breakdown;\n }\n\n /**\n * Calculate performance metrics across contexts\n */\n private calculatePerformanceMetrics(contexts: ExecutionContext[]): PerformanceMetrics {\n if (contexts.length === 0) {\n return {\n cpuUsage: 0,\n memoryUsage: 0,\n networkRequests: 0,\n fileSystemOperations: 0,\n throughput: {\n iterationsPerMinute: 0,\n progressEventsPerSecond: 0,\n toolCallsPerMinute: 0,\n },\n };\n }\n\n // Aggregate metrics from all contexts\n const avgMetrics = contexts.reduce((acc, ctx) => ({\n cpuUsage: acc.cpuUsage + ctx.statistics.performanceMetrics.cpuUsage,\n memoryUsage: acc.memoryUsage + ctx.statistics.performanceMetrics.memoryUsage,\n networkRequests: acc.networkRequests + ctx.statistics.performanceMetrics.networkRequests,\n fileSystemOperations: acc.fileSystemOperations + ctx.statistics.performanceMetrics.fileSystemOperations,\n throughput: {\n iterationsPerMinute: acc.throughput.iterationsPerMinute + ctx.statistics.performanceMetrics.throughput.iterationsPerMinute,\n progressEventsPerSecond: acc.throughput.progressEventsPerSecond + ctx.statistics.performanceMetrics.throughput.progressEventsPerSecond,\n toolCallsPerMinute: acc.throughput.toolCallsPerMinute + ctx.statistics.performanceMetrics.throughput.toolCallsPerMinute,\n },\n }), {\n cpuUsage: 0,\n memoryUsage: 0,\n networkRequests: 0,\n fileSystemOperations: 0,\n throughput: {\n iterationsPerMinute: 0,\n progressEventsPerSecond: 0,\n toolCallsPerMinute: 0,\n },\n });\n\n // Average the metrics\n const count = contexts.length;\n return {\n cpuUsage: avgMetrics.cpuUsage / count,\n memoryUsage: avgMetrics.memoryUsage / count,\n networkRequests: avgMetrics.networkRequests / count,\n fileSystemOperations: avgMetrics.fileSystemOperations / count,\n throughput: {\n iterationsPerMinute: avgMetrics.throughput.iterationsPerMinute / count,\n progressEventsPerSecond: avgMetrics.throughput.progressEventsPerSecond / count,\n toolCallsPerMinute: avgMetrics.throughput.toolCallsPerMinute / count,\n },\n };\n }\n\n /**\n * Sleep utility for delays\n */\n private async sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n }\n}\n\n// =============================================================================\n// Internal Types\n// =============================================================================\n\n/**\n * Internal execution context\n */\ninterface ExecutionContext {\n request: ExecutionRequest;\n status: ExecutionStatus;\n startTime: Date;\n endTime: Date | null;\n iterations: IterationResult[];\n statistics: ExecutionStatistics;\n progressEvents: ProgressEvent[];\n error: MCPError | null;\n abortController: AbortController;\n sessionContext: MCPSessionContext;\n rateLimitInfo: RateLimitInfo;\n}\n\n// =============================================================================\n// Factory Functions\n// =============================================================================\n\n/**\n * Create an execution engine with default configuration\n *\n * @param config - Base juno-task configuration\n * @param mcpClient - MCP client instance\n * @returns Configured execution engine\n */\nexport function createExecutionEngine(\n config: JunoTaskConfig,\n mcpClient: MCPClient\n): ExecutionEngine {\n return new ExecutionEngine({\n config,\n mcpClient,\n errorRecovery: DEFAULT_ERROR_RECOVERY_CONFIG,\n rateLimitConfig: DEFAULT_RATE_LIMIT_CONFIG,\n progressConfig: DEFAULT_PROGRESS_CONFIG,\n });\n}\n\n/**\n * Create an execution request with defaults\n *\n * @param options - Request options\n * @returns Execution request\n */\nexport function createExecutionRequest(options: {\n instruction: string;\n subagent?: SubagentType;\n workingDirectory?: string;\n maxIterations?: number;\n model?: string;\n requestId?: string;\n}): ExecutionRequest {\n const result: ExecutionRequest = {\n requestId: options.requestId || `req-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n instruction: options.instruction,\n subagent: options.subagent || 'claude',\n workingDirectory: options.workingDirectory || process.cwd(),\n maxIterations: options.maxIterations || 50,\n };\n\n if (options.model !== undefined) {\n (result as any).model = options.model;\n }\n\n return result;\n}\n","/**\n * MCP error definitions for juno-task-ts\n *\n * Provides comprehensive error classes and utilities for MCP operations,\n * including error codes, context tracking, recovery suggestions, and\n * specialized error types for different failure scenarios.\n *\n * @module mcp/errors\n * @version 1.0.0\n */\n\n// =============================================================================\n// Error Type Enums and Constants\n// =============================================================================\n\n/**\n * MCP error categories for targeted error handling\n */\nexport enum MCPErrorType {\n CONNECTION = 'connection',\n TIMEOUT = 'timeout',\n RATE_LIMIT = 'rate_limit',\n TOOL_EXECUTION = 'tool_execution',\n VALIDATION = 'validation',\n SERVER_NOT_FOUND = 'server_not_found',\n PROTOCOL = 'protocol',\n AUTHENTICATION = 'authentication'\n}\n\n/**\n * Error codes for specific error conditions\n */\nexport enum MCPErrorCode {\n // Connection errors\n CONNECTION_FAILED = 'MCP_CONNECTION_FAILED',\n CONNECTION_TIMEOUT = 'MCP_CONNECTION_TIMEOUT',\n CONNECTION_REFUSED = 'MCP_CONNECTION_REFUSED',\n CONNECTION_LOST = 'MCP_CONNECTION_LOST',\n RECONNECTION_FAILED = 'MCP_RECONNECTION_FAILED',\n\n // Tool execution errors\n TOOL_NOT_FOUND = 'MCP_TOOL_NOT_FOUND',\n TOOL_EXECUTION_FAILED = 'MCP_TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT = 'MCP_TOOL_TIMEOUT',\n TOOL_INVALID_ARGUMENTS = 'MCP_TOOL_INVALID_ARGUMENTS',\n\n // Rate limit errors\n RATE_LIMIT_EXCEEDED = 'MCP_RATE_LIMIT_EXCEEDED',\n RATE_LIMIT_HOURLY = 'MCP_RATE_LIMIT_HOURLY',\n RATE_LIMIT_DAILY = 'MCP_RATE_LIMIT_DAILY',\n\n // Validation errors\n VALIDATION_FAILED = 'MCP_VALIDATION_FAILED',\n INVALID_REQUEST = 'MCP_INVALID_REQUEST',\n MISSING_PARAMETERS = 'MCP_MISSING_PARAMETERS',\n INVALID_PARAMETERS = 'MCP_INVALID_PARAMETERS',\n\n // Server errors\n SERVER_NOT_FOUND = 'MCP_SERVER_NOT_FOUND',\n SERVER_NOT_EXECUTABLE = 'MCP_SERVER_NOT_EXECUTABLE',\n SERVER_STARTUP_FAILED = 'MCP_SERVER_STARTUP_FAILED',\n SERVER_CRASHED = 'MCP_SERVER_CRASHED',\n\n // Protocol errors\n PROTOCOL_ERROR = 'MCP_PROTOCOL_ERROR',\n INVALID_RESPONSE = 'MCP_INVALID_RESPONSE',\n VERSION_MISMATCH = 'MCP_VERSION_MISMATCH',\n\n // Authentication errors\n AUTHENTICATION_FAILED = 'MCP_AUTHENTICATION_FAILED',\n UNAUTHORIZED = 'MCP_UNAUTHORIZED',\n TOKEN_EXPIRED = 'MCP_TOKEN_EXPIRED'\n}\n\n/**\n * Rate limit message patterns for parsing reset times\n */\nexport const RATE_LIMIT_PATTERNS = [\n // Unix timestamp patterns (must come first to avoid conflicts)\n /resets?\\s+(?:at\\s+)?(\\d{10,13})/i,\n\n // ISO date patterns\n /resets?\\s+(?:at\\s+)?([\\d-]+T[\\d:.]+Z?)/i,\n\n // Standard patterns\n /resets\\s+(?:at\\s+)?(\\d{1,2}):?(\\d{2})?\\s*(am|pm)?/i,\n /resets\\s+(?:at\\s+)?(\\d{1,2})\\s*(am|pm)/i,\n\n // Duration-based patterns\n /try again in (\\d+)\\s*(minutes?|hours?|seconds?)/i,\n /wait\\s+(\\d+)\\s*(minutes?|hours?|seconds?)/i,\n\n // Specific service patterns\n /5-hour limit reached.*resets\\s+(?:at\\s+)?(\\d{1,2})\\s*(am|pm)/i,\n /hourly limit.*resets\\s+(?:at\\s+)?(\\d{1,2}):(\\d{2})/i\n] as const;\n\n// =============================================================================\n// Error Context Interfaces\n// =============================================================================\n\n/**\n * Base error options for MCP errors\n */\nexport interface MCPErrorOptions {\n /** Error code for programmatic handling */\n readonly code?: MCPErrorCode;\n\n /** Operation context when error occurred */\n readonly context?: string;\n\n /** Retry information */\n readonly retryInfo?: RetryInfo;\n\n /** Recovery suggestions for the user */\n readonly recoverySuggestions?: readonly string[];\n\n /** Cause error for error chaining */\n readonly cause?: Error;\n\n /** Additional metadata */\n readonly metadata?: Readonly<Record<string, unknown>>;\n}\n\n/**\n * Retry information for error context\n */\nexport interface RetryInfo {\n /** Current attempt number */\n readonly attempt: number;\n\n /** Maximum attempts allowed */\n readonly maxAttempts: number;\n\n /** Next retry time */\n readonly nextRetryTime?: Date;\n\n /** Retry strategy used */\n readonly strategy: string;\n\n /** Backoff delay in milliseconds */\n readonly backoffDelay?: number;\n}\n\n/**\n * Server information for connection errors\n */\nexport interface ServerInfo {\n /** Server executable path */\n readonly path: string;\n\n /** Server version */\n readonly version?: string;\n\n /** Process ID */\n readonly pid?: number;\n\n /** Server status */\n readonly status: string;\n\n /** Server arguments */\n readonly args?: readonly string[];\n\n /** Working directory */\n readonly workingDirectory?: string;\n}\n\n/**\n * Tool information for tool errors\n */\nexport interface ToolInfo {\n /** Tool name */\n readonly name: string;\n\n /** Tool version */\n readonly version?: string;\n\n /** Subagent type */\n readonly subagent: string;\n\n /** Model used */\n readonly model?: string;\n\n /** Tool capabilities */\n readonly capabilities?: readonly string[];\n}\n\n/**\n * Tool execution details for error context\n */\nexport interface ToolExecutionDetails {\n /** Execution start time */\n readonly startTime: Date;\n\n /** Execution duration in milliseconds */\n readonly duration: number;\n\n /** Arguments used */\n readonly arguments: Readonly<Record<string, unknown>>;\n\n /** Progress events captured */\n readonly progressEvents?: readonly unknown[];\n\n /** Execution timeout */\n readonly timeout?: number;\n\n /** Session ID */\n readonly sessionId?: string;\n}\n\n// =============================================================================\n// Base MCP Error Class\n// =============================================================================\n\n/**\n * Base MCP error class with enhanced context and recovery information\n */\nexport abstract class MCPError extends Error {\n /** Error type classification */\n public readonly type: MCPErrorType;\n\n /** Error code for programmatic handling */\n public readonly code: MCPErrorCode;\n\n /** Error timestamp */\n public readonly timestamp: Date;\n\n /** Operation context */\n public readonly context?: string;\n\n /** Retry information */\n public readonly retryInfo?: RetryInfo;\n\n /** Recovery suggestions */\n public readonly recoverySuggestions?: readonly string[];\n\n /** Additional metadata */\n public readonly metadata?: Readonly<Record<string, unknown>>;\n\n /** Cause error for error chaining */\n public readonly cause?: Error;\n\n constructor(\n message: string,\n type: MCPErrorType,\n code: MCPErrorCode,\n options?: MCPErrorOptions\n ) {\n super(message);\n this.name = this.constructor.name;\n this.type = type;\n this.code = options?.code ?? code;\n this.timestamp = new Date();\n this.context = options?.context;\n this.retryInfo = options?.retryInfo;\n this.recoverySuggestions = options?.recoverySuggestions;\n this.metadata = options?.metadata;\n this.cause = options?.cause;\n\n // Maintain proper stack trace\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n /**\n * Get user-friendly error message\n */\n getUserMessage(): string {\n return this.message;\n }\n\n /**\n * Get technical error details\n */\n getTechnicalDetails(): string {\n const details = [\n `Error: ${this.name}`,\n `Type: ${this.type}`,\n `Code: ${this.code}`,\n `Message: ${this.message}`,\n `Timestamp: ${this.timestamp.toISOString()}`,\n ];\n\n if (this.context) {\n details.push(`Context: ${this.context}`);\n }\n\n if (this.retryInfo) {\n details.push(`Retry: ${this.retryInfo.attempt}/${this.retryInfo.maxAttempts}`);\n }\n\n if (this.cause) {\n details.push(`Cause: ${this.cause.message}`);\n }\n\n return details.join('\\n');\n }\n\n /**\n * Check if error is retryable\n */\n isRetryable(): boolean {\n if (!this.retryInfo) {\n return false;\n }\n return this.retryInfo.attempt < this.retryInfo.maxAttempts;\n }\n\n /**\n * Get time until next retry\n */\n getRetryDelay(): number {\n if (!this.retryInfo?.nextRetryTime) {\n return 0;\n }\n return Math.max(0, this.retryInfo.nextRetryTime.getTime() - Date.now());\n }\n\n /**\n * Serialize error to JSON\n */\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n type: this.type,\n code: this.code,\n message: this.message,\n timestamp: this.timestamp.toISOString(),\n context: this.context,\n retryInfo: this.retryInfo,\n recoverySuggestions: this.recoverySuggestions,\n metadata: this.metadata,\n stack: this.stack,\n };\n }\n}\n\n// =============================================================================\n// Connection Error Classes\n// =============================================================================\n\n/**\n * MCP connection error for server connection failures\n */\nexport class MCPConnectionError extends MCPError {\n /** Server information */\n public readonly serverInfo?: ServerInfo;\n\n constructor(\n message: string,\n context?: string,\n serverInfo?: ServerInfo,\n options?: MCPErrorOptions\n ) {\n const code = options?.code ?? MCPErrorCode.CONNECTION_FAILED;\n const suggestions = options?.recoverySuggestions ?? [\n 'Check if the MCP server is running',\n 'Verify server path and permissions',\n 'Check network connectivity',\n 'Review server configuration',\n ];\n\n super(message, MCPErrorType.CONNECTION, code, {\n ...options,\n context,\n recoverySuggestions: suggestions,\n });\n\n this.serverInfo = serverInfo;\n }\n\n /**\n * Create connection timeout error\n */\n static timeout(timeoutMs: number, serverPath?: string): MCPConnectionError {\n return new MCPConnectionError(\n `Connection timeout after ${timeoutMs}ms`,\n 'connection_timeout',\n serverPath ? { path: serverPath, status: 'timeout' } : undefined,\n {\n code: MCPErrorCode.CONNECTION_TIMEOUT,\n recoverySuggestions: [\n 'Increase connection timeout value',\n 'Check server responsiveness',\n 'Verify network latency',\n ],\n }\n );\n }\n\n /**\n * Create connection refused error\n */\n static refused(serverPath: string, port?: number): MCPConnectionError {\n return new MCPConnectionError(\n `Connection refused to ${serverPath}${port ? `:${port}` : ''}`,\n 'connection_refused',\n { path: serverPath, status: 'refused' },\n {\n code: MCPErrorCode.CONNECTION_REFUSED,\n recoverySuggestions: [\n 'Verify server is running and listening',\n 'Check server address and port',\n 'Review firewall settings',\n ],\n }\n );\n }\n\n /**\n * Create server not found error\n */\n static serverNotFound(serverPath: string): MCPConnectionError {\n return new MCPConnectionError(\n `MCP server not found at path: ${serverPath}`,\n 'server_discovery',\n { path: serverPath, status: 'not_found' },\n {\n code: MCPErrorCode.SERVER_NOT_FOUND,\n recoverySuggestions: [\n 'Check server installation path',\n 'Verify executable permissions',\n 'Install the MCP server package',\n 'Update PATH environment variable',\n ],\n }\n );\n }\n}\n\n// =============================================================================\n// Tool Error Classes\n// =============================================================================\n\n/**\n * MCP tool execution error\n */\nexport class MCPToolError extends MCPError {\n /** Tool information */\n public readonly toolInfo: ToolInfo;\n\n /** Execution details */\n public readonly executionDetails?: ToolExecutionDetails;\n\n constructor(\n message: string,\n toolInfo: ToolInfo,\n context?: string,\n options?: MCPErrorOptions & { executionDetails?: ToolExecutionDetails }\n ) {\n const code = options?.code ?? MCPErrorCode.TOOL_EXECUTION_FAILED;\n const suggestions = options?.recoverySuggestions ?? [\n 'Check tool arguments and parameters',\n 'Verify tool is available and accessible',\n 'Review tool documentation',\n 'Check server logs for details',\n ];\n\n super(message, MCPErrorType.TOOL_EXECUTION, code, {\n ...options,\n context,\n recoverySuggestions: suggestions,\n });\n\n this.toolInfo = toolInfo;\n this.executionDetails = options?.executionDetails;\n }\n\n /**\n * Create tool not found error\n */\n static notFound(toolName: string): MCPToolError {\n return new MCPToolError(\n `Tool not found: ${toolName}`,\n { name: toolName, subagent: 'unknown' },\n 'tool_discovery',\n {\n code: MCPErrorCode.TOOL_NOT_FOUND,\n recoverySuggestions: [\n 'Check available tools with listTools()',\n 'Verify tool name spelling',\n 'Ensure MCP server supports this tool',\n ],\n }\n );\n }\n\n /**\n * Create tool timeout error\n */\n static timeout(\n toolName: string,\n timeoutMs: number,\n executionDetails?: ToolExecutionDetails\n ): MCPToolError {\n return new MCPToolError(\n `Tool execution timeout: ${toolName} (${timeoutMs}ms)`,\n { name: toolName, subagent: 'unknown' },\n 'tool_timeout',\n {\n code: MCPErrorCode.TOOL_TIMEOUT,\n executionDetails,\n recoverySuggestions: [\n 'Increase tool execution timeout',\n 'Check tool complexity and resource usage',\n 'Consider breaking task into smaller parts',\n ],\n }\n );\n }\n\n /**\n * Create invalid arguments error\n */\n static invalidArguments(\n toolName: string,\n invalidArgs: Record<string, unknown>,\n expectedFormat?: string\n ): MCPToolError {\n return new MCPToolError(\n `Invalid arguments for tool: ${toolName}`,\n { name: toolName, subagent: 'unknown' },\n 'argument_validation',\n {\n code: MCPErrorCode.TOOL_INVALID_ARGUMENTS,\n metadata: { invalidArgs, expectedFormat },\n recoverySuggestions: [\n 'Check tool documentation for required arguments',\n 'Verify argument types and formats',\n 'Review tool schema definition',\n ],\n }\n );\n }\n}\n\n// =============================================================================\n// Timeout Error Classes\n// =============================================================================\n\n/**\n * MCP timeout error for operation timeouts\n */\nexport class MCPTimeoutError extends MCPError {\n /** Timeout duration in milliseconds */\n public readonly timeoutMs: number;\n\n /** Operation type that timed out */\n public readonly operationType: string;\n\n constructor(\n message: string,\n timeoutMs: number,\n operationType: string,\n context?: string,\n options?: MCPErrorOptions\n ) {\n const code = options?.code ?? MCPErrorCode.CONNECTION_TIMEOUT;\n const suggestions = options?.recoverySuggestions ?? [\n 'Increase timeout value',\n 'Check operation complexity',\n 'Verify network connectivity',\n 'Consider breaking operation into smaller parts',\n ];\n\n super(message, MCPErrorType.TIMEOUT, code, {\n ...options,\n context,\n recoverySuggestions: suggestions,\n });\n\n this.timeoutMs = timeoutMs;\n this.operationType = operationType;\n }\n\n /**\n * Create connection timeout error\n */\n static connection(timeoutMs: number): MCPTimeoutError {\n return new MCPTimeoutError(\n `Connection timeout after ${timeoutMs}ms`,\n timeoutMs,\n 'connection',\n 'mcp_connection',\n {\n code: MCPErrorCode.CONNECTION_TIMEOUT,\n recoverySuggestions: [\n 'Increase connection timeout',\n 'Check server startup time',\n 'Verify network latency',\n ],\n }\n );\n }\n\n /**\n * Create tool execution timeout error\n */\n static toolExecution(toolName: string, timeoutMs: number): MCPTimeoutError {\n return new MCPTimeoutError(\n `Tool execution timeout: ${toolName} (${timeoutMs}ms)`,\n timeoutMs,\n 'tool_execution',\n `tool_${toolName}`,\n {\n code: MCPErrorCode.TOOL_TIMEOUT,\n recoverySuggestions: [\n 'Increase tool execution timeout',\n 'Optimize tool parameters',\n 'Check tool resource usage',\n ],\n }\n );\n }\n}\n\n// =============================================================================\n// Rate Limit Error Classes\n// =============================================================================\n\n/**\n * MCP rate limit error with reset time parsing\n */\nexport class MCPRateLimitError extends MCPError {\n /** Rate limit reset time */\n public readonly resetTime?: Date;\n\n /** Current rate limit tier */\n public readonly tier?: string;\n\n /** Requests remaining */\n public readonly remaining: number;\n\n /** Rate limit window */\n public readonly window?: string;\n\n constructor(\n message: string,\n remaining: number = 0,\n resetTime?: Date,\n tier?: string,\n context?: string,\n options?: MCPErrorOptions\n ) {\n const code = options?.code ?? MCPErrorCode.RATE_LIMIT_EXCEEDED;\n const waitTime = resetTime ? Math.ceil((resetTime.getTime() - Date.now()) / 1000) : 0;\n const suggestions = options?.recoverySuggestions ?? [\n `Wait ${waitTime > 0 ? waitTime + ' seconds' : 'for rate limit reset'}`,\n 'Reduce request frequency',\n 'Implement request queuing',\n 'Consider upgrading service tier',\n ];\n\n super(message, MCPErrorType.RATE_LIMIT, code, {\n ...options,\n context,\n recoverySuggestions: suggestions,\n retryInfo: resetTime ? {\n attempt: 1,\n maxAttempts: 1,\n nextRetryTime: resetTime,\n strategy: 'rate_limit_wait',\n } : options?.retryInfo,\n });\n\n this.resetTime = resetTime;\n this.tier = tier;\n this.remaining = remaining;\n }\n\n /**\n * Parse rate limit error from message text\n */\n static fromMessage(message: string, context?: string): MCPRateLimitError {\n const resetTime = parseRateLimitResetTime(message);\n\n // Extract remaining requests if available\n const remainingMatch = message.match(/(\\d+)\\s*(?:requests?|calls?)\\s*remaining/i);\n const remaining = remainingMatch ? parseInt(remainingMatch[1], 10) : 0;\n\n // Extract tier information if available\n const tierMatch = message.match(/tier[:\\s]*([a-zA-Z0-9_-]+)/i);\n const tier = tierMatch ? tierMatch[1] : undefined;\n\n return new MCPRateLimitError(\n message,\n remaining,\n resetTime,\n tier,\n context,\n {\n code: MCPErrorCode.RATE_LIMIT_EXCEEDED,\n metadata: { originalMessage: message },\n }\n );\n }\n\n /**\n * Create hourly rate limit error\n */\n static hourly(resetTime: Date, remaining: number = 0): MCPRateLimitError {\n return new MCPRateLimitError(\n `Hourly rate limit exceeded. Resets at ${resetTime.toLocaleTimeString()}`,\n remaining,\n resetTime,\n 'hourly',\n 'hourly_limit',\n {\n code: MCPErrorCode.RATE_LIMIT_HOURLY,\n }\n );\n }\n\n /**\n * Create daily rate limit error\n */\n static daily(resetTime: Date, remaining: number = 0): MCPRateLimitError {\n return new MCPRateLimitError(\n `Daily rate limit exceeded. Resets at ${resetTime.toLocaleDateString()} ${resetTime.toLocaleTimeString()}`,\n remaining,\n resetTime,\n 'daily',\n 'daily_limit',\n {\n code: MCPErrorCode.RATE_LIMIT_DAILY,\n }\n );\n }\n\n /**\n * Get wait time in milliseconds\n */\n getWaitTimeMs(): number {\n if (!this.resetTime) {\n return 0;\n }\n return Math.max(0, this.resetTime.getTime() - Date.now());\n }\n\n /**\n * Get wait time in seconds\n */\n getWaitTimeSeconds(): number {\n return Math.ceil(this.getWaitTimeMs() / 1000);\n }\n}\n\n// =============================================================================\n// Validation Error Classes\n// =============================================================================\n\n/**\n * MCP validation error for input validation failures\n */\nexport class MCPValidationError extends MCPError {\n /** Validation rule that failed */\n public readonly rule: string;\n\n /** Invalid value */\n public readonly value: unknown;\n\n /** Expected format/value */\n public readonly expected?: string;\n\n /** Field path for nested validation */\n public readonly field?: string;\n\n constructor(\n message: string,\n rule: string,\n value: unknown,\n expected?: string,\n field?: string,\n context?: string,\n options?: MCPErrorOptions\n ) {\n const code = options?.code ?? MCPErrorCode.VALIDATION_FAILED;\n const suggestions = options?.recoverySuggestions ?? [\n 'Check parameter types and formats',\n 'Refer to API documentation',\n 'Validate input before sending',\n ];\n\n super(message, MCPErrorType.VALIDATION, code, {\n ...options,\n context,\n recoverySuggestions: suggestions,\n });\n\n this.rule = rule;\n this.value = value;\n this.expected = expected;\n this.field = field;\n }\n\n /**\n * Create required field error\n */\n static required(field: string): MCPValidationError {\n return new MCPValidationError(\n `Required field missing: ${field}`,\n 'required',\n undefined,\n 'non-empty value',\n field,\n 'parameter_validation',\n {\n code: MCPErrorCode.MISSING_PARAMETERS,\n }\n );\n }\n\n /**\n * Create type mismatch error\n */\n static typeMismatch(\n field: string,\n value: unknown,\n expectedType: string\n ): MCPValidationError {\n return new MCPValidationError(\n `Invalid type for field '${field}': expected ${expectedType}, got ${typeof value}`,\n 'type_mismatch',\n value,\n expectedType,\n field,\n 'type_validation',\n {\n code: MCPErrorCode.INVALID_PARAMETERS,\n }\n );\n }\n\n /**\n * Create format error\n */\n static format(\n field: string,\n value: unknown,\n expectedFormat: string\n ): MCPValidationError {\n return new MCPValidationError(\n `Invalid format for field '${field}': expected ${expectedFormat}`,\n 'format',\n value,\n expectedFormat,\n field,\n 'format_validation',\n {\n code: MCPErrorCode.INVALID_PARAMETERS,\n }\n );\n }\n\n /**\n * Create range error\n */\n static range(\n field: string,\n value: unknown,\n min?: number,\n max?: number\n ): MCPValidationError {\n const range = min !== undefined && max !== undefined\n ? `${min}-${max}`\n : min !== undefined\n ? `>= ${min}`\n : `<= ${max}`;\n\n return new MCPValidationError(\n `Value out of range for field '${field}': expected ${range}`,\n 'range',\n value,\n range,\n field,\n 'range_validation',\n {\n code: MCPErrorCode.INVALID_PARAMETERS,\n }\n );\n }\n}\n\n// =============================================================================\n// Utility Functions\n// =============================================================================\n\n/**\n * Parse rate limit reset time from various message formats\n */\nexport function parseRateLimitResetTime(message: string): Date | undefined {\n for (const pattern of RATE_LIMIT_PATTERNS) {\n const match = message.match(pattern);\n if (match) {\n try {\n return parseTimeFromMatch(match);\n } catch {\n // Continue to next pattern\n }\n }\n }\n return undefined;\n}\n\n/**\n * Parse time information from regex match\n */\nfunction parseTimeFromMatch(match: RegExpMatchArray): Date | undefined {\n const [, time1, time2, period] = match;\n\n // Handle ISO date string (check before Unix timestamp to avoid conflicts)\n if (time1 && time1.includes('T')) {\n return new Date(time1);\n }\n\n // Handle Unix timestamp\n if (time1 && time1.length >= 10) {\n const timestamp = parseInt(time1, 10);\n return new Date(timestamp > 9999999999 ? timestamp : timestamp * 1000);\n }\n\n // Handle duration-based patterns\n if (time2 && (time2.includes('minute') || time2.includes('hour') || time2.includes('second'))) {\n const duration = parseInt(time1, 10);\n const unit = time2.toLowerCase();\n const now = new Date();\n\n if (unit.includes('minute')) {\n return new Date(now.getTime() + duration * 60 * 1000);\n } else if (unit.includes('hour')) {\n return new Date(now.getTime() + duration * 60 * 60 * 1000);\n } else if (unit.includes('second')) {\n return new Date(now.getTime() + duration * 1000);\n }\n }\n\n // Handle time-based patterns (e.g., \"3:30 PM\", \"15:30\")\n if (time1) {\n const hour = parseInt(time1, 10);\n const minute = time2 ? parseInt(time2, 10) : 0;\n let adjustedHour = hour;\n\n if (period) {\n const isPM = period.toLowerCase().includes('pm');\n if (isPM && hour < 12) {\n adjustedHour += 12;\n } else if (!isPM && hour === 12) {\n adjustedHour = 0;\n }\n }\n\n const resetTime = new Date();\n resetTime.setHours(adjustedHour, minute, 0, 0);\n\n // If the time has passed today, set it for tomorrow\n if (resetTime <= new Date()) {\n resetTime.setDate(resetTime.getDate() + 1);\n }\n\n return resetTime;\n }\n\n return undefined;\n}\n\n/**\n * Type guards for error checking\n */\n\n/**\n * Check if error is an MCP error\n */\nexport function isMCPError(error: unknown): error is MCPError {\n return error instanceof MCPError;\n}\n\n/**\n * Check if error is a connection error\n */\nexport function isConnectionError(error: unknown): error is MCPConnectionError {\n return error instanceof MCPConnectionError;\n}\n\n/**\n * Check if error is a tool error\n */\nexport function isToolError(error: unknown): error is MCPToolError {\n return error instanceof MCPToolError;\n}\n\n/**\n * Check if error is a timeout error\n */\nexport function isTimeoutError(error: unknown): error is MCPTimeoutError {\n return error instanceof MCPTimeoutError;\n}\n\n/**\n * Check if error is a rate limit error\n */\nexport function isRateLimitError(error: unknown): error is MCPRateLimitError {\n return error instanceof MCPRateLimitError;\n}\n\n/**\n * Check if error is a validation error\n */\nexport function isValidationError(error: unknown): error is MCPValidationError {\n return error instanceof MCPValidationError;\n}\n\n/**\n * Check if error is retryable\n */\nexport function isRetryableError(error: unknown): boolean {\n if (!isMCPError(error)) {\n return false;\n }\n\n // Rate limits are retryable after the reset time\n if (isRateLimitError(error)) {\n return true;\n }\n\n // Connection errors are usually retryable\n if (isConnectionError(error)) {\n return true;\n }\n\n // Some timeout errors are retryable\n if (isTimeoutError(error)) {\n return true;\n }\n\n // Validation errors are not retryable\n if (isValidationError(error)) {\n return false;\n }\n\n return error.isRetryable();\n}\n\n/**\n * Get error category for recovery strategy\n */\nexport function getErrorCategory(error: unknown): MCPErrorType | 'unknown' {\n if (isMCPError(error)) {\n return error.type;\n }\n return 'unknown';\n}\n\n/**\n * Format error for user display\n */\nexport function formatErrorForUser(error: unknown): string {\n if (isMCPError(error)) {\n return error.getUserMessage();\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n return String(error);\n}\n\n/**\n * Format error for logging\n */\nexport function formatErrorForLogging(error: unknown): string {\n if (isMCPError(error)) {\n return error.getTechnicalDetails();\n }\n\n if (error instanceof Error) {\n return `${error.name}: ${error.message}\\n${error.stack || 'No stack trace'}`;\n }\n\n return `Unknown error: ${JSON.stringify(error)}`;\n}\n\n/**\n * Extract recovery suggestions from error\n */\nexport function getRecoverySuggestions(error: unknown): string[] {\n if (isMCPError(error) && error.recoverySuggestions) {\n return Array.from(error.recoverySuggestions);\n }\n\n // Default suggestions based on error type\n if (isConnectionError(error)) {\n return [\n 'Check network connectivity',\n 'Verify server is running',\n 'Check server configuration',\n ];\n }\n\n if (isRateLimitError(error)) {\n return [\n 'Wait for rate limit reset',\n 'Reduce request frequency',\n 'Implement request queuing',\n ];\n }\n\n if (isValidationError(error)) {\n return [\n 'Check input parameters',\n 'Refer to API documentation',\n 'Validate data before sending',\n ];\n }\n\n return [\n 'Check error message for details',\n 'Review configuration',\n 'Contact support if problem persists',\n ];\n}\n\n/**\n * Create error chain from multiple errors\n */\nexport function createErrorChain(errors: Error[]): MCPError {\n if (errors.length === 0) {\n return new MCPConnectionError('Unknown error occurred', 'error_chain');\n }\n\n if (errors.length === 1) {\n const error = errors[0];\n if (isMCPError(error)) {\n return error;\n }\n return new MCPConnectionError(error.message, 'wrapped_error', undefined, {\n cause: error,\n });\n }\n\n const primaryError = errors[0];\n const additionalErrors = errors.slice(1);\n\n return new MCPConnectionError(\n `Multiple errors occurred: ${primaryError.message}`,\n 'error_chain',\n undefined,\n {\n cause: primaryError,\n metadata: {\n additionalErrors: additionalErrors.map(e => ({\n name: e.name,\n message: e.message,\n })),\n },\n recoverySuggestions: [\n 'Address the primary error first',\n 'Check for cascading failures',\n 'Review system configuration',\n ],\n }\n );\n}\n\n// =============================================================================\n// Error Recovery Utilities\n// =============================================================================\n\n/**\n * Error recovery strategy type\n */\nexport type ErrorRecoveryStrategy =\n | 'retry'\n | 'wait'\n | 'reconnect'\n | 'fallback'\n | 'abort'\n | 'manual';\n\n/**\n * Get recommended recovery strategy for error\n */\nexport function getRecoveryStrategy(error: unknown): ErrorRecoveryStrategy {\n if (isRateLimitError(error)) {\n return 'wait';\n }\n\n if (isConnectionError(error)) {\n return 'reconnect';\n }\n\n if (isTimeoutError(error)) {\n return 'retry';\n }\n\n if (isValidationError(error)) {\n return 'manual';\n }\n\n if (isToolError(error)) {\n return 'fallback';\n }\n\n return 'abort';\n}\n\n/**\n * Calculate retry delay based on error and attempt\n */\nexport function calculateRetryDelay(\n error: unknown,\n attempt: number,\n baseDelay: number = 1000,\n maxDelay: number = 30000\n): number {\n if (isRateLimitError(error)) {\n return error.getWaitTimeMs();\n }\n\n // Exponential backoff with jitter\n const exponentialDelay = Math.min(baseDelay * Math.pow(2, attempt - 1), maxDelay);\n const jitter = exponentialDelay * 0.1 * (Math.random() - 0.5);\n\n return Math.max(0, exponentialDelay + jitter);\n}\n\n// All exports are already declared above with their class definitions","/**\n * Hook execution utility module for juno-task-ts\n *\n * Provides robust hook execution functionality with comprehensive logging,\n * error handling, and execution context tracking.\n *\n * @module utils/hooks\n */\n\nimport { execa } from 'execa';\nimport { logger, LogContext, LogLevel } from '../cli/utils/advanced-logger.js';\n\n/**\n * Supported hook types for lifecycle execution\n */\nexport type HookType = 'START_RUN' | 'START_ITERATION' | 'END_ITERATION' | 'END_RUN';\n\n/**\n * Hook configuration interface\n */\nexport interface Hook {\n /** List of bash commands to execute for this hook */\n commands: string[];\n}\n\n/**\n * Complete hooks configuration mapping hook types to their configurations\n */\nexport interface HooksConfig {\n [key: string]: Hook;\n}\n\n/**\n * Execution context for hooks - provides information about the current execution state\n */\nexport interface HookExecutionContext {\n /** Current iteration number (for iteration-based hooks) */\n iteration?: number;\n /** Session ID for tracking */\n sessionId?: string;\n /** Working directory for command execution */\n workingDirectory?: string;\n /** Additional metadata */\n metadata?: Record<string, any>;\n /** Run ID for tracking across hooks */\n runId?: string;\n /** Total iterations planned */\n totalIterations?: number;\n}\n\n/**\n * Result of a single command execution within a hook\n */\nexport interface CommandExecutionResult {\n /** The command that was executed */\n command: string;\n /** Exit code (0 for success) */\n exitCode: number;\n /** Standard output */\n stdout: string;\n /** Standard error output */\n stderr: string;\n /** Execution duration in milliseconds */\n duration: number;\n /** Whether the command succeeded */\n success: boolean;\n /** Error if execution failed */\n error?: Error;\n}\n\n/**\n * Result of executing all commands in a hook\n */\nexport interface HookExecutionResult {\n /** Hook type that was executed */\n hookType: HookType;\n /** Total execution duration for all commands */\n totalDuration: number;\n /** Results for each command */\n commandResults: CommandExecutionResult[];\n /** Overall success (true if all commands succeeded) */\n success: boolean;\n /** Number of commands executed */\n commandsExecuted: number;\n /** Number of commands that failed */\n commandsFailed: number;\n}\n\n/**\n * Hook execution options\n */\nexport interface HookExecutionOptions {\n /** Maximum timeout per command in milliseconds (default: 30000) */\n commandTimeout?: number;\n /** Environment variables to pass to commands */\n env?: Record<string, string>;\n /** Whether to continue executing commands if one fails (default: true) */\n continueOnError?: boolean;\n /** Custom logger context (default: 'SYSTEM') */\n logContext?: LogContext;\n}\n\n/**\n * Create a context-specific logger for hook execution\n */\nconst hookLogger = logger.child(LogContext.SYSTEM, { component: 'hooks' });\n\n/**\n * Execute a specific hook type with the provided context\n *\n * This is the main entry point for hook execution. It handles:\n * - Hook existence validation\n * - Sequential command execution\n * - Comprehensive logging with execution context\n * - Robust error handling (log but don't throw)\n * - Performance tracking\n *\n * @param hookType - The type of hook to execute\n * @param hooks - The complete hooks configuration\n * @param context - Execution context with iteration, session info, etc.\n * @param options - Additional execution options\n * @returns Promise that resolves when all commands complete (never throws)\n *\n * @example\n * ```typescript\n * const hooks = {\n * START_ITERATION: {\n * commands: ['echo \"Starting iteration $ITERATION\"', 'npm test']\n * }\n * };\n *\n * const context = {\n * iteration: 1,\n * sessionId: 'session-123',\n * workingDirectory: '/path/to/project'\n * };\n *\n * await executeHook('START_ITERATION', hooks, context);\n * ```\n */\nexport async function executeHook(\n hookType: HookType,\n hooks: HooksConfig,\n context: HookExecutionContext = {},\n options: HookExecutionOptions = {}\n): Promise<HookExecutionResult> {\n const startTime = Date.now();\n const {\n commandTimeout = 30000,\n env = {},\n continueOnError = true,\n logContext = LogContext.SYSTEM,\n } = options;\n\n // Create context-specific logger\n const contextLogger = logger.child(logContext, {\n hookType,\n iteration: context.iteration,\n sessionId: context.sessionId,\n runId: context.runId,\n });\n\n contextLogger.info(`Starting hook execution: ${hookType}`, {\n context,\n workingDirectory: context.workingDirectory || process.cwd(),\n commandTimeout,\n continueOnError,\n });\n\n // Check if hook exists\n const hook = hooks[hookType];\n if (!hook) {\n contextLogger.debug(`Hook ${hookType} not defined - skipping execution`);\n return {\n hookType,\n totalDuration: Date.now() - startTime,\n commandResults: [],\n success: true,\n commandsExecuted: 0,\n commandsFailed: 0,\n };\n }\n\n // Check if hook has commands\n if (!hook.commands || hook.commands.length === 0) {\n contextLogger.debug(`Hook ${hookType} has no commands - skipping execution`);\n return {\n hookType,\n totalDuration: Date.now() - startTime,\n commandResults: [],\n success: true,\n commandsExecuted: 0,\n commandsFailed: 0,\n };\n }\n\n contextLogger.info(`Executing ${hook.commands.length} commands for hook ${hookType}`);\n\n const commandResults: CommandExecutionResult[] = [];\n let commandsFailed = 0;\n\n // Execute each command sequentially\n for (let i = 0; i < hook.commands.length; i++) {\n const command = hook.commands[i];\n const commandStartTime = Date.now();\n\n contextLogger.info(`Executing command ${i + 1}/${hook.commands.length}: ${command}`, {\n commandIndex: i,\n totalCommands: hook.commands.length,\n });\n\n try {\n // Prepare environment variables with context\n const execEnv = {\n ...process.env,\n ...env,\n // Add context as environment variables\n HOOK_TYPE: hookType,\n ITERATION: context.iteration?.toString() || '',\n SESSION_ID: context.sessionId || '',\n RUN_ID: context.runId || '',\n TOTAL_ITERATIONS: context.totalIterations?.toString() || '',\n // Add any metadata as prefixed environment variables\n ...Object.fromEntries(\n Object.entries(context.metadata || {}).map(([key, value]) => [\n `JUNO_${key.toUpperCase()}`,\n String(value),\n ])\n ),\n };\n\n // Execute command with timeout and proper working directory\n const result = await execa(command, {\n shell: true,\n timeout: commandTimeout,\n cwd: context.workingDirectory || process.cwd(),\n env: execEnv,\n // Capture both stdout and stderr\n all: true,\n reject: false, // Don't throw on non-zero exit codes\n });\n\n const duration = Date.now() - commandStartTime;\n const success = result.exitCode === 0;\n\n const commandResult: CommandExecutionResult = {\n command,\n exitCode: result.exitCode,\n stdout: result.stdout || '',\n stderr: result.stderr || '',\n duration,\n success,\n };\n\n commandResults.push(commandResult);\n\n if (success) {\n contextLogger.info(`Command completed successfully`, {\n command,\n exitCode: result.exitCode,\n duration,\n stdout: result.stdout ? result.stdout.substring(0, 500) : undefined, // Truncate for logging\n });\n\n // Log stdout if present\n if (result.stdout) {\n contextLogger.debug(`Command stdout:`, { stdout: result.stdout });\n }\n } else {\n commandsFailed++;\n contextLogger.error(`Command failed`, {\n command,\n exitCode: result.exitCode,\n duration,\n stderr: result.stderr,\n stdout: result.stdout,\n });\n\n // Log stderr if present\n if (result.stderr) {\n contextLogger.error(`Command stderr:`, { stderr: result.stderr });\n }\n\n // If we shouldn't continue on error, break the loop\n if (!continueOnError) {\n contextLogger.warn(`Stopping hook execution due to command failure (continueOnError=false)`);\n break;\n }\n }\n } catch (error) {\n const duration = Date.now() - commandStartTime;\n commandsFailed++;\n\n let errorMessage = 'Unknown error';\n let isTimeout = false;\n\n if (error instanceof Error) {\n errorMessage = error.message;\n // Check for execa-specific timeout property\n isTimeout = 'timedOut' in error ? Boolean((error as any).timedOut) : false;\n }\n\n const commandResult: CommandExecutionResult = {\n command,\n exitCode: -1,\n stdout: '',\n stderr: errorMessage,\n duration,\n success: false,\n error: error as Error,\n };\n\n commandResults.push(commandResult);\n\n if (isTimeout) {\n contextLogger.error(`Command timed out after ${commandTimeout}ms`, {\n command,\n timeout: commandTimeout,\n duration,\n error: errorMessage,\n });\n } else {\n contextLogger.error(`Command execution failed`, {\n command,\n duration,\n error: errorMessage,\n });\n }\n\n // If we shouldn't continue on error, break the loop\n if (!continueOnError) {\n contextLogger.warn(`Stopping hook execution due to command failure (continueOnError=false)`);\n break;\n }\n }\n }\n\n const totalDuration = Date.now() - startTime;\n const success = commandsFailed === 0;\n const commandsExecuted = commandResults.length;\n\n const result: HookExecutionResult = {\n hookType,\n totalDuration,\n commandResults,\n success,\n commandsExecuted,\n commandsFailed,\n };\n\n contextLogger.info(`Hook execution completed`, {\n hookType,\n totalDuration,\n commandsExecuted,\n commandsFailed,\n success,\n });\n\n return result;\n}\n\n/**\n * Execute multiple hooks in sequence\n *\n * Convenience function for executing multiple hooks with the same context.\n * Each hook is executed independently - failure of one hook does not stop\n * execution of subsequent hooks.\n *\n * @param hookTypes - Array of hook types to execute\n * @param hooks - The complete hooks configuration\n * @param context - Execution context\n * @param options - Execution options\n * @returns Promise resolving to array of hook execution results\n */\nexport async function executeHooks(\n hookTypes: HookType[],\n hooks: HooksConfig,\n context: HookExecutionContext = {},\n options: HookExecutionOptions = {}\n): Promise<HookExecutionResult[]> {\n const results: HookExecutionResult[] = [];\n\n hookLogger.info(`Starting batch hook execution`, {\n hookTypes,\n context,\n });\n\n for (const hookType of hookTypes) {\n const result = await executeHook(hookType, hooks, context, options);\n results.push(result);\n }\n\n const totalSuccess = results.every(r => r.success);\n const totalCommands = results.reduce((sum, r) => sum + r.commandsExecuted, 0);\n const totalFailed = results.reduce((sum, r) => sum + r.commandsFailed, 0);\n\n hookLogger.info(`Batch hook execution completed`, {\n hookTypes,\n totalHooks: results.length,\n totalCommands,\n totalFailed,\n success: totalSuccess,\n });\n\n return results;\n}\n\n/**\n * Validate hooks configuration\n *\n * Checks that all hook configurations are valid and provides warnings\n * for common issues.\n *\n * @param hooks - Hooks configuration to validate\n * @returns Validation result with any issues found\n */\nexport function validateHooksConfig(hooks: HooksConfig): {\n valid: boolean;\n issues: string[];\n warnings: string[];\n} {\n const issues: string[] = [];\n const warnings: string[] = [];\n\n const validHookTypes: HookType[] = ['START_RUN', 'START_ITERATION', 'END_ITERATION', 'END_RUN'];\n\n for (const [hookType, hook] of Object.entries(hooks)) {\n // Check if hook type is valid\n if (!validHookTypes.includes(hookType as HookType)) {\n warnings.push(`Unknown hook type: ${hookType}. Valid types are: ${validHookTypes.join(', ')}`);\n }\n\n // Check if hook has commands array\n if (!hook.commands) {\n issues.push(`Hook ${hookType} is missing 'commands' array`);\n continue;\n }\n\n if (!Array.isArray(hook.commands)) {\n issues.push(`Hook ${hookType} 'commands' must be an array`);\n continue;\n }\n\n // Check if commands are strings\n for (let i = 0; i < hook.commands.length; i++) {\n const command = hook.commands[i];\n if (typeof command !== 'string') {\n issues.push(`Hook ${hookType} command ${i} must be a string, got ${typeof command}`);\n } else if (command.trim() === '') {\n warnings.push(`Hook ${hookType} command ${i} is empty`);\n }\n }\n\n // Warn about potentially dangerous commands\n const dangerousPatterns = [\n /rm\\s+-rf\\s+\\//,\n /sudo\\s+rm/,\n /format\\s+c:/i,\n /del\\s+\\/s/i,\n ];\n\n for (const command of hook.commands) {\n if (typeof command === 'string') {\n for (const pattern of dangerousPatterns) {\n if (pattern.test(command)) {\n warnings.push(`Hook ${hookType} contains potentially dangerous command: ${command}`);\n }\n }\n }\n }\n }\n\n return {\n valid: issues.length === 0,\n issues,\n warnings,\n };\n}\n\n/**\n * Default export for convenience\n */\nexport default {\n executeHook,\n executeHooks,\n validateHooksConfig,\n};","/**\n * Advanced Log Formatting System for juno-task-ts\n *\n * Provides structured, colorized logging with Python Rich-style aesthetics.\n * Supports multiple log levels, contexts, and output formats.\n */\n\nimport chalk from 'chalk';\nimport { RichFormatter } from './rich-formatter.js';\n\n// ============================================================================\n// Log Level and Context Types\n// ============================================================================\n\nexport enum LogLevel {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n FATAL = 5\n}\n\nexport enum LogContext {\n CLI = 'CLI',\n MCP = 'MCP',\n ENGINE = 'ENGINE',\n SESSION = 'SESSION',\n TEMPLATE = 'TEMPLATE',\n CONFIG = 'CONFIG',\n PERFORMANCE = 'PERFORMANCE',\n SYSTEM = 'SYSTEM'\n}\n\nexport interface LogEntry {\n timestamp: Date;\n level: LogLevel;\n context: LogContext;\n message: string;\n data?: any;\n metadata?: Record<string, any>;\n duration?: number;\n requestId?: string;\n sessionId?: string;\n}\n\nexport interface LoggerOptions {\n level: LogLevel;\n showTimestamp: boolean;\n showContext: boolean;\n showLevel: boolean;\n colorize: boolean;\n format: 'simple' | 'detailed' | 'json' | 'rich';\n output: 'console' | 'file' | 'both';\n filename?: string;\n maxFileSize?: number; // MB\n maxFiles?: number;\n}\n\n// ============================================================================\n// Log Formatters\n// ============================================================================\n\nexport class LogFormatter {\n private richFormatter: RichFormatter;\n\n constructor() {\n this.richFormatter = new RichFormatter();\n }\n\n /**\n * Format log entry based on specified format\n */\n format(entry: LogEntry, options: LoggerOptions): string {\n switch (options.format) {\n case 'simple':\n return this.formatSimple(entry, options);\n case 'detailed':\n return this.formatDetailed(entry, options);\n case 'json':\n return this.formatJson(entry);\n case 'rich':\n return this.formatRich(entry, options);\n default:\n return this.formatSimple(entry, options);\n }\n }\n\n /**\n * Simple format: [LEVEL] Message\n */\n private formatSimple(entry: LogEntry, options: LoggerOptions): string {\n const parts: string[] = [];\n\n if (options.showLevel) {\n const levelStr = this.formatLevel(entry.level, options.colorize);\n parts.push(`[${levelStr}]`);\n }\n\n if (options.showContext) {\n const contextStr = options.colorize ?\n chalk.gray(`[${entry.context}]`) :\n `[${entry.context}]`;\n parts.push(contextStr);\n }\n\n parts.push(entry.message);\n\n if (entry.duration !== undefined) {\n const durationStr = options.colorize ?\n chalk.cyan(`(${entry.duration}ms)`) :\n `(${entry.duration}ms)`;\n parts.push(durationStr);\n }\n\n return parts.join(' ');\n }\n\n /**\n * Detailed format: [TIMESTAMP] [LEVEL] [CONTEXT] Message + Data\n */\n private formatDetailed(entry: LogEntry, options: LoggerOptions): string {\n const parts: string[] = [];\n\n if (options.showTimestamp) {\n const timeStr = entry.timestamp.toISOString();\n const formattedTime = options.colorize ?\n chalk.gray(timeStr) :\n timeStr;\n parts.push(`[${formattedTime}]`);\n }\n\n if (options.showLevel) {\n const levelStr = this.formatLevel(entry.level, options.colorize);\n parts.push(`[${levelStr}]`);\n }\n\n if (options.showContext) {\n const contextStr = options.colorize ?\n chalk.gray(`[${entry.context}]`) :\n `[${entry.context}]`;\n parts.push(contextStr);\n }\n\n if (entry.requestId) {\n const reqStr = options.colorize ?\n chalk.blue(`[${entry.requestId.slice(0, 8)}]`) :\n `[${entry.requestId.slice(0, 8)}]`;\n parts.push(reqStr);\n }\n\n parts.push(entry.message);\n\n if (entry.duration !== undefined) {\n const durationStr = options.colorize ?\n chalk.cyan(`(${entry.duration}ms)`) :\n `(${entry.duration}ms)`;\n parts.push(durationStr);\n }\n\n let result = parts.join(' ');\n\n // Add data if present\n if (entry.data) {\n const dataStr = typeof entry.data === 'string' ?\n entry.data :\n JSON.stringify(entry.data, null, 2);\n\n if (options.colorize) {\n result += '\\n' + chalk.gray(this.indent(dataStr, 2));\n } else {\n result += '\\n' + this.indent(dataStr, 2);\n }\n }\n\n return result;\n }\n\n /**\n * JSON format for structured logging\n */\n private formatJson(entry: LogEntry): string {\n return JSON.stringify({\n timestamp: entry.timestamp.toISOString(),\n level: LogLevel[entry.level],\n context: entry.context,\n message: entry.message,\n data: entry.data,\n metadata: entry.metadata,\n duration: entry.duration,\n requestId: entry.requestId,\n sessionId: entry.sessionId\n });\n }\n\n /**\n * Rich format with panels and styling\n */\n private formatRich(entry: LogEntry, options: LoggerOptions): string {\n const icon = this.getLevelIcon(entry.level);\n const color = this.getLevelColor(entry.level);\n\n let content = `${icon} ${entry.message}`;\n\n if (entry.duration !== undefined) {\n content += ` ${chalk.cyan(`(${entry.duration}ms)`)}`;\n }\n\n if (entry.data) {\n const dataStr = typeof entry.data === 'string' ?\n entry.data :\n JSON.stringify(entry.data, null, 2);\n content += '\\n\\n' + chalk.gray(dataStr);\n }\n\n const title = `${LogLevel[entry.level]} - ${entry.context}`;\n\n return this.richFormatter.panel(content, {\n title,\n border: 'rounded',\n style: this.getLevelPanelStyle(entry.level),\n padding: 1\n });\n }\n\n /**\n * Format log level with appropriate styling\n */\n private formatLevel(level: LogLevel, colorize: boolean): string {\n const levelName = LogLevel[level].padEnd(5);\n\n if (!colorize) return levelName;\n\n switch (level) {\n case LogLevel.TRACE:\n return chalk.gray(levelName);\n case LogLevel.DEBUG:\n return chalk.blue(levelName);\n case LogLevel.INFO:\n return chalk.green(levelName);\n case LogLevel.WARN:\n return chalk.yellow(levelName);\n case LogLevel.ERROR:\n return chalk.red(levelName);\n case LogLevel.FATAL:\n return chalk.redBright.bold(levelName);\n default:\n return levelName;\n }\n }\n\n /**\n * Get icon for log level\n */\n private getLevelIcon(level: LogLevel): string {\n switch (level) {\n case LogLevel.TRACE: return '🔍';\n case LogLevel.DEBUG: return '🐛';\n case LogLevel.INFO: return 'ℹ️';\n case LogLevel.WARN: return '⚠️';\n case LogLevel.ERROR: return '❌';\n case LogLevel.FATAL: return '💀';\n default: return '📝';\n }\n }\n\n /**\n * Get color for log level\n */\n private getLevelColor(level: LogLevel): string {\n switch (level) {\n case LogLevel.TRACE: return 'gray';\n case LogLevel.DEBUG: return 'blue';\n case LogLevel.INFO: return 'green';\n case LogLevel.WARN: return 'yellow';\n case LogLevel.ERROR: return 'red';\n case LogLevel.FATAL: return 'redBright';\n default: return 'white';\n }\n }\n\n /**\n * Get panel style for log level\n */\n private getLevelPanelStyle(level: LogLevel): string {\n switch (level) {\n case LogLevel.TRACE: return 'muted';\n case LogLevel.DEBUG: return 'info';\n case LogLevel.INFO: return 'success';\n case LogLevel.WARN: return 'warning';\n case LogLevel.ERROR: return 'error';\n case LogLevel.FATAL: return 'critical';\n default: return 'default';\n }\n }\n\n /**\n * Indent text by specified spaces\n */\n private indent(text: string, spaces: number): string {\n const prefix = ' '.repeat(spaces);\n return text.split('\\n').map(line => prefix + line).join('\\n');\n }\n}\n\n// ============================================================================\n// Advanced Logger Class\n// ============================================================================\n\nexport class AdvancedLogger {\n private options: LoggerOptions;\n private formatter: LogFormatter;\n private entries: LogEntry[] = [];\n private maxEntries: number = 1000;\n private timers: Map<string, number> = new Map();\n\n constructor(options: Partial<LoggerOptions> = {}) {\n this.options = {\n level: LogLevel.INFO,\n showTimestamp: true,\n showContext: true,\n showLevel: true,\n colorize: true,\n format: 'detailed',\n output: 'console',\n maxFileSize: 10, // MB\n maxFiles: 5,\n ...options\n };\n\n this.formatter = new LogFormatter();\n }\n\n /**\n * Log at TRACE level\n */\n trace(message: string, context: LogContext = LogContext.SYSTEM, data?: any, metadata?: Record<string, any>): void {\n this.log(LogLevel.TRACE, message, context, data, metadata);\n }\n\n /**\n * Log at DEBUG level\n */\n debug(message: string, context: LogContext = LogContext.SYSTEM, data?: any, metadata?: Record<string, any>): void {\n this.log(LogLevel.DEBUG, message, context, data, metadata);\n }\n\n /**\n * Log at INFO level\n */\n info(message: string, context: LogContext = LogContext.SYSTEM, data?: any, metadata?: Record<string, any>): void {\n this.log(LogLevel.INFO, message, context, data, metadata);\n }\n\n /**\n * Log at WARN level\n */\n warn(message: string, context: LogContext = LogContext.SYSTEM, data?: any, metadata?: Record<string, any>): void {\n this.log(LogLevel.WARN, message, context, data, metadata);\n }\n\n /**\n * Log at ERROR level\n */\n error(message: string, context: LogContext = LogContext.SYSTEM, data?: any, metadata?: Record<string, any>): void {\n this.log(LogLevel.ERROR, message, context, data, metadata);\n }\n\n /**\n * Log at FATAL level\n */\n fatal(message: string, context: LogContext = LogContext.SYSTEM, data?: any, metadata?: Record<string, any>): void {\n this.log(LogLevel.FATAL, message, context, data, metadata);\n }\n\n /**\n * Core logging method\n */\n private log(\n level: LogLevel,\n message: string,\n context: LogContext,\n data?: any,\n metadata?: Record<string, any>\n ): void {\n // Check if level should be logged\n if (level < this.options.level) return;\n\n const entry: LogEntry = {\n timestamp: new Date(),\n level,\n context,\n message,\n data,\n metadata\n };\n\n // Add to entries\n this.addEntry(entry);\n\n // Format and output\n const formatted = this.formatter.format(entry, this.options);\n this.output(formatted);\n }\n\n /**\n * Start a timer for performance logging\n */\n startTimer(key: string): void {\n this.timers.set(key, Date.now());\n }\n\n /**\n * End a timer and log the duration\n */\n endTimer(\n key: string,\n message: string,\n context: LogContext = LogContext.PERFORMANCE,\n level: LogLevel = LogLevel.INFO\n ): number {\n const startTime = this.timers.get(key);\n if (!startTime) {\n this.warn(`Timer \"${key}\" not found`, LogContext.SYSTEM);\n return 0;\n }\n\n const duration = Date.now() - startTime;\n this.timers.delete(key);\n\n // Log with duration\n if (level >= this.options.level) {\n const entry: LogEntry = {\n timestamp: new Date(),\n level,\n context,\n message,\n duration\n };\n\n this.addEntry(entry);\n const formatted = this.formatter.format(entry, this.options);\n this.output(formatted);\n }\n\n return duration;\n }\n\n /**\n * Log with specific request ID\n */\n logWithRequest(\n level: LogLevel,\n message: string,\n requestId: string,\n context: LogContext = LogContext.SYSTEM,\n data?: any\n ): void {\n if (level < this.options.level) return;\n\n const entry: LogEntry = {\n timestamp: new Date(),\n level,\n context,\n message,\n data,\n requestId\n };\n\n this.addEntry(entry);\n const formatted = this.formatter.format(entry, this.options);\n this.output(formatted);\n }\n\n /**\n * Log with specific session ID\n */\n logWithSession(\n level: LogLevel,\n message: string,\n sessionId: string,\n context: LogContext = LogContext.SESSION,\n data?: any\n ): void {\n if (level < this.options.level) return;\n\n const entry: LogEntry = {\n timestamp: new Date(),\n level,\n context,\n message,\n data,\n sessionId\n };\n\n this.addEntry(entry);\n const formatted = this.formatter.format(entry, this.options);\n this.output(formatted);\n }\n\n /**\n * Create a child logger with specific context\n */\n child(context: LogContext, metadata?: Record<string, any>): ContextLogger {\n return new ContextLogger(this, context, metadata);\n }\n\n /**\n * Change log level\n */\n setLevel(level: LogLevel): void {\n this.options.level = level;\n }\n\n /**\n * Change format\n */\n setFormat(format: 'simple' | 'detailed' | 'json' | 'rich'): void {\n this.options.format = format;\n }\n\n /**\n * Enable/disable colors\n */\n setColorize(colorize: boolean): void {\n this.options.colorize = colorize;\n }\n\n /**\n * Get recent log entries\n */\n getRecentEntries(count: number = 50): LogEntry[] {\n return this.entries.slice(-count);\n }\n\n /**\n * Get entries by level\n */\n getEntriesByLevel(level: LogLevel): LogEntry[] {\n return this.entries.filter(entry => entry.level === level);\n }\n\n /**\n * Get entries by context\n */\n getEntriesByContext(context: LogContext): LogEntry[] {\n return this.entries.filter(entry => entry.context === context);\n }\n\n /**\n * Clear all entries\n */\n clearEntries(): void {\n this.entries = [];\n }\n\n /**\n * Export entries as JSON\n */\n exportEntries(): string {\n return JSON.stringify(this.entries, null, 2);\n }\n\n /**\n * Add entry to collection\n */\n private addEntry(entry: LogEntry): void {\n this.entries.push(entry);\n\n // Maintain max entries\n if (this.entries.length > this.maxEntries) {\n this.entries = this.entries.slice(-this.maxEntries);\n }\n }\n\n /**\n * Output formatted log\n */\n private output(formatted: string): void {\n if (this.options.output === 'console' || this.options.output === 'both') {\n console.log(formatted);\n }\n\n if (this.options.output === 'file' || this.options.output === 'both') {\n this.writeToFile(formatted);\n }\n }\n\n /**\n * Write to file (placeholder - could implement file rotation)\n */\n private writeToFile(content: string): void {\n // File writing implementation would go here\n // Could use fs.appendFile with rotation logic\n }\n}\n\n// ============================================================================\n// Context Logger Class\n// ============================================================================\n\nexport class ContextLogger {\n constructor(\n private parent: AdvancedLogger,\n private context: LogContext,\n private metadata?: Record<string, any>\n ) {}\n\n trace(message: string, data?: any): void {\n this.parent.trace(message, this.context, data, this.metadata);\n }\n\n debug(message: string, data?: any): void {\n this.parent.debug(message, this.context, data, this.metadata);\n }\n\n info(message: string, data?: any): void {\n this.parent.info(message, this.context, data, this.metadata);\n }\n\n warn(message: string, data?: any): void {\n this.parent.warn(message, this.context, data, this.metadata);\n }\n\n error(message: string, data?: any): void {\n this.parent.error(message, this.context, data, this.metadata);\n }\n\n fatal(message: string, data?: any): void {\n this.parent.fatal(message, this.context, data, this.metadata);\n }\n\n startTimer(key: string): void {\n this.parent.startTimer(key);\n }\n\n endTimer(key: string, message: string, level: LogLevel = LogLevel.INFO): number {\n return this.parent.endTimer(key, message, this.context, level);\n }\n}\n\n// ============================================================================\n// Global Logger Instance\n// ============================================================================\n\nexport const logger = new AdvancedLogger({\n level: LogLevel.INFO,\n format: 'detailed',\n colorize: true,\n output: 'console'\n});\n\n// Export context-specific loggers\nexport const cliLogger = logger.child(LogContext.CLI);\nexport const mcpLogger = logger.child(LogContext.MCP);\nexport const engineLogger = logger.child(LogContext.ENGINE);\nexport const sessionLogger = logger.child(LogContext.SESSION);\nexport const templateLogger = logger.child(LogContext.TEMPLATE);\nexport const configLogger = logger.child(LogContext.CONFIG);\nexport const performanceLogger = logger.child(LogContext.PERFORMANCE);\n\nexport default AdvancedLogger;","/**\n * Rich Formatting System for juno-task-ts\n *\n * Enhanced terminal formatting to match Python Rich library aesthetics.\n * Provides tables, panels, trees, and sophisticated styling.\n */\n\nimport Table from 'cli-table3';\nimport chalk from 'chalk';\nimport stripAnsi from 'strip-ansi';\nimport supportsColor from 'supports-color';\n\n// ============================================================================\n// Core Interfaces\n// ============================================================================\n\nexport interface TableData {\n headers?: string[];\n rows: string[][];\n}\n\nexport interface TableOptions {\n title?: string;\n headers?: string[];\n borders?: 'ascii' | 'rounded' | 'double' | 'heavy' | 'minimal';\n style?: 'default' | 'minimal' | 'markdown' | 'grid';\n width?: number;\n columnWidths?: number[];\n align?: ('left' | 'center' | 'right')[];\n colors?: {\n headers?: string;\n border?: string;\n title?: string;\n };\n}\n\nexport interface PanelOptions {\n title?: string;\n border?: 'rounded' | 'square' | 'double' | 'heavy' | 'minimal';\n padding?: number;\n width?: number;\n style?: 'default' | 'info' | 'warning' | 'error' | 'success';\n align?: 'left' | 'center' | 'right';\n colors?: {\n border?: string;\n title?: string;\n content?: string;\n };\n}\n\nexport interface TreeData {\n name: string;\n children?: TreeData[];\n metadata?: Record<string, any>;\n icon?: string;\n style?: string;\n}\n\nexport interface TreeOptions {\n showFiles?: boolean;\n showMetadata?: boolean;\n maxDepth?: number;\n icons?: boolean;\n colors?: {\n directory?: string;\n file?: string;\n metadata?: string;\n };\n}\n\nexport interface ProgressBarOptions {\n width?: number;\n completed?: string;\n incomplete?: string;\n showPercentage?: boolean;\n showBar?: boolean;\n style?: 'bar' | 'blocks' | 'dots' | 'gradient';\n colors?: {\n completed?: string;\n incomplete?: string;\n percentage?: string;\n };\n}\n\n// ============================================================================\n// Rich Formatter Class\n// ============================================================================\n\nexport class RichFormatter {\n private colorSupport: boolean;\n private terminalWidth: number;\n\n constructor() {\n this.colorSupport = supportsColor.stdout ? true : false;\n this.terminalWidth = process.stdout.columns || 80;\n }\n\n /**\n * Create a rich table with styling and borders\n */\n table(data: TableData, options: TableOptions = {}): string {\n const table = new Table(this.getTableConfig(options));\n\n // Add headers if provided\n if (options.headers || data.headers) {\n const headers = options.headers || data.headers || [];\n if (options.colors?.headers && this.colorSupport) {\n const coloredHeaders = headers.map(header =>\n chalk.keyword(options.colors!.headers!)(header)\n );\n table.push(coloredHeaders);\n }\n }\n\n // Add data rows\n data.rows.forEach(row => {\n table.push(row);\n });\n\n let result = table.toString();\n\n // Add title if provided\n if (options.title) {\n const titleColor = options.colors?.title || 'blue';\n const coloredTitle = this.colorSupport\n ? chalk.keyword(titleColor).bold(options.title)\n : options.title;\n\n const titleLine = this.centerText(coloredTitle, this.getTableWidth(options));\n result = titleLine + '\\n' + result;\n }\n\n return result;\n }\n\n /**\n * Create a rich panel with borders and styling\n */\n panel(content: string, options: PanelOptions = {}): string {\n const {\n title,\n border = 'rounded',\n padding = 1,\n width = this.terminalWidth - 4,\n style = 'default',\n align = 'left'\n } = options;\n\n const borderChars = this.getBorderChars(border);\n const styleColors = this.getStyleColors(style);\n\n // Process content\n const lines = content.split('\\n');\n const contentWidth = width - (padding * 2) - 2; // -2 for left/right borders\n\n const processedLines = lines.flatMap(line => this.wrapText(line, contentWidth));\n\n // Build panel\n const panelLines: string[] = [];\n\n // Top border\n const topBorder = borderChars.topLeft +\n borderChars.horizontal.repeat(width - 2) +\n borderChars.topRight;\n panelLines.push(this.colorize(topBorder, styleColors.border));\n\n // Title (if provided)\n if (title) {\n const titleLine = borderChars.vertical +\n this.centerText(title, width - 2) +\n borderChars.vertical;\n panelLines.push(this.colorize(titleLine, styleColors.border));\n\n // Title separator\n const separator = borderChars.left +\n borderChars.horizontal.repeat(width - 2) +\n borderChars.right;\n panelLines.push(this.colorize(separator, styleColors.border));\n }\n\n // Padding (top)\n for (let i = 0; i < padding; i++) {\n const paddingLine = borderChars.vertical +\n ' '.repeat(width - 2) +\n borderChars.vertical;\n panelLines.push(this.colorize(paddingLine, styleColors.border));\n }\n\n // Content lines\n processedLines.forEach(line => {\n const alignedContent = this.alignText(line, contentWidth, align);\n const paddedContent = ' '.repeat(padding) + alignedContent + ' '.repeat(padding);\n const contentLine = borderChars.vertical +\n paddedContent +\n borderChars.vertical;\n\n const coloredContent = this.colorize(borderChars.vertical, styleColors.border) +\n this.colorize(paddedContent, styleColors.content) +\n this.colorize(borderChars.vertical, styleColors.border);\n\n panelLines.push(coloredContent);\n });\n\n // Padding (bottom)\n for (let i = 0; i < padding; i++) {\n const paddingLine = borderChars.vertical +\n ' '.repeat(width - 2) +\n borderChars.vertical;\n panelLines.push(this.colorize(paddingLine, styleColors.border));\n }\n\n // Bottom border\n const bottomBorder = borderChars.bottomLeft +\n borderChars.horizontal.repeat(width - 2) +\n borderChars.bottomRight;\n panelLines.push(this.colorize(bottomBorder, styleColors.border));\n\n return panelLines.join('\\n');\n }\n\n /**\n * Create a tree view display\n */\n tree(data: TreeData, options: TreeOptions = {}): string {\n const {\n showFiles = true,\n showMetadata = false,\n maxDepth = 10,\n icons = true,\n colors = {\n directory: 'blue',\n file: 'white',\n metadata: 'gray'\n }\n } = options;\n\n return this.renderTreeNode(data, 0, '', options, true);\n }\n\n /**\n * Create a progress bar\n */\n progressBar(progress: number, options: ProgressBarOptions = {}): string {\n const {\n width = 40,\n completed = '█',\n incomplete = '░',\n showPercentage = true,\n showBar = true,\n style = 'bar',\n colors = {\n completed: 'green',\n incomplete: 'gray',\n percentage: 'blue'\n }\n } = options;\n\n progress = Math.max(0, Math.min(100, progress));\n const completedWidth = Math.round((progress / 100) * width);\n const incompleteWidth = width - completedWidth;\n\n let bar = '';\n\n if (showBar) {\n const completedPart = this.colorize(completed.repeat(completedWidth), colors.completed);\n const incompletePart = this.colorize(incomplete.repeat(incompleteWidth), colors.incomplete);\n bar = completedPart + incompletePart;\n }\n\n if (showPercentage) {\n const percentage = this.colorize(`${progress.toFixed(1)}%`, colors.percentage);\n return showBar ? `${bar} ${percentage}` : percentage;\n }\n\n return bar;\n }\n\n /**\n * Format markup text with basic styling\n */\n markup(text: string): string {\n if (!this.colorSupport) {\n return text.replace(/\\[\\/?\\w+\\]/g, ''); // Remove markup tags\n }\n\n return text\n .replace(/\\[bold\\](.*?)\\[\\/bold\\]/g, (_, content) => chalk.bold(content))\n .replace(/\\[italic\\](.*?)\\[\\/italic\\]/g, (_, content) => chalk.italic(content))\n .replace(/\\[underline\\](.*?)\\[\\/underline\\]/g, (_, content) => chalk.underline(content))\n .replace(/\\[red\\](.*?)\\[\\/red\\]/g, (_, content) => chalk.red(content))\n .replace(/\\[green\\](.*?)\\[\\/green\\]/g, (_, content) => chalk.green(content))\n .replace(/\\[blue\\](.*?)\\[\\/blue\\]/g, (_, content) => chalk.blue(content))\n .replace(/\\[yellow\\](.*?)\\[\\/yellow\\]/g, (_, content) => chalk.yellow(content))\n .replace(/\\[cyan\\](.*?)\\[\\/cyan\\]/g, (_, content) => chalk.cyan(content))\n .replace(/\\[magenta\\](.*?)\\[\\/magenta\\]/g, (_, content) => chalk.magenta(content))\n .replace(/\\[dim\\](.*?)\\[\\/dim\\]/g, (_, content) => chalk.dim(content));\n }\n\n // ============================================================================\n // Private Helper Methods\n // ============================================================================\n\n private getTableConfig(options: TableOptions): any {\n const borders = this.getTableBorders(options.borders || 'rounded');\n\n return {\n chars: borders,\n style: {\n 'padding-left': 1,\n 'padding-right': 1,\n head: options.colors?.headers ? [options.colors.headers] : ['blue'],\n border: options.colors?.border ? [options.colors.border] : ['gray']\n },\n colWidths: options.columnWidths,\n colAligns: options.align,\n wordWrap: true\n };\n }\n\n private getTableBorders(style: string): any {\n switch (style) {\n case 'rounded':\n return {\n 'top': '─', 'top-mid': '┬', 'top-left': '╭', 'top-right': '╮',\n 'bottom': '─', 'bottom-mid': '┴', 'bottom-left': '╰', 'bottom-right': '╯',\n 'left': '│', 'left-mid': '├', 'mid': '─', 'mid-mid': '┼',\n 'right': '│', 'right-mid': '┤', 'middle': '│'\n };\n case 'double':\n return {\n 'top': '═', 'top-mid': '╦', 'top-left': '╔', 'top-right': '╗',\n 'bottom': '═', 'bottom-mid': '╩', 'bottom-left': '╚', 'bottom-right': '╝',\n 'left': '║', 'left-mid': '╠', 'mid': '═', 'mid-mid': '╬',\n 'right': '║', 'right-mid': '╣', 'middle': '║'\n };\n case 'heavy':\n return {\n 'top': '━', 'top-mid': '┳', 'top-left': '┏', 'top-right': '┓',\n 'bottom': '━', 'bottom-mid': '┻', 'bottom-left': '┗', 'bottom-right': '┛',\n 'left': '┃', 'left-mid': '┣', 'mid': '━', 'mid-mid': '╋',\n 'right': '┃', 'right-mid': '┫', 'middle': '┃'\n };\n case 'minimal':\n return {\n 'top': '', 'top-mid': '', 'top-left': '', 'top-right': '',\n 'bottom': '', 'bottom-mid': '', 'bottom-left': '', 'bottom-right': '',\n 'left': '', 'left-mid': '', 'mid': '', 'mid-mid': '',\n 'right': '', 'right-mid': '', 'middle': ' '\n };\n default: // ascii\n return {\n 'top': '-', 'top-mid': '+', 'top-left': '+', 'top-right': '+',\n 'bottom': '-', 'bottom-mid': '+', 'bottom-left': '+', 'bottom-right': '+',\n 'left': '|', 'left-mid': '+', 'mid': '-', 'mid-mid': '+',\n 'right': '|', 'right-mid': '+', 'middle': '|'\n };\n }\n }\n\n private getBorderChars(style: string): any {\n switch (style) {\n case 'rounded':\n return {\n topLeft: '╭', topRight: '╮', bottomLeft: '╰', bottomRight: '╯',\n horizontal: '─', vertical: '│', left: '├', right: '┤'\n };\n case 'double':\n return {\n topLeft: '╔', topRight: '╗', bottomLeft: '╚', bottomRight: '╝',\n horizontal: '═', vertical: '║', left: '╠', right: '╣'\n };\n case 'heavy':\n return {\n topLeft: '┏', topRight: '┓', bottomLeft: '┗', bottomRight: '┛',\n horizontal: '━', vertical: '┃', left: '┣', right: '┫'\n };\n case 'minimal':\n return {\n topLeft: ' ', topRight: ' ', bottomLeft: ' ', bottomRight: ' ',\n horizontal: ' ', vertical: ' ', left: ' ', right: ' '\n };\n default: // square\n return {\n topLeft: '┌', topRight: '┐', bottomLeft: '└', bottomRight: '┘',\n horizontal: '─', vertical: '│', left: '├', right: '┤'\n };\n }\n }\n\n private getStyleColors(style: string): any {\n switch (style) {\n case 'info':\n return { border: 'blue', content: 'white' };\n case 'warning':\n return { border: 'yellow', content: 'yellow' };\n case 'error':\n return { border: 'red', content: 'red' };\n case 'success':\n return { border: 'green', content: 'green' };\n default:\n return { border: 'gray', content: 'white' };\n }\n }\n\n private colorize(text: string, color?: string): string {\n if (!this.colorSupport || !color) return text;\n return (chalk as any).keyword(color)(text);\n }\n\n private centerText(text: string, width: number): string {\n const plainText = stripAnsi(text);\n const padding = Math.max(0, width - plainText.length);\n const leftPadding = Math.floor(padding / 2);\n const rightPadding = padding - leftPadding;\n\n return ' '.repeat(leftPadding) + text + ' '.repeat(rightPadding);\n }\n\n private alignText(text: string, width: number, align: string): string {\n const plainText = stripAnsi(text);\n const padding = Math.max(0, width - plainText.length);\n\n switch (align) {\n case 'center':\n return this.centerText(text, width);\n case 'right':\n return ' '.repeat(padding) + text;\n default: // left\n return text + ' '.repeat(padding);\n }\n }\n\n private wrapText(text: string, width: number): string[] {\n if (stripAnsi(text).length <= width) return [text];\n\n const words = text.split(' ');\n const lines: string[] = [];\n let currentLine = '';\n\n for (const word of words) {\n const testLine = currentLine ? `${currentLine} ${word}` : word;\n if (stripAnsi(testLine).length <= width) {\n currentLine = testLine;\n } else {\n if (currentLine) lines.push(currentLine);\n currentLine = word;\n }\n }\n\n if (currentLine) lines.push(currentLine);\n return lines;\n }\n\n private getTableWidth(options: TableOptions): number {\n return options.width || this.terminalWidth;\n }\n\n private renderTreeNode(\n node: TreeData,\n depth: number,\n prefix: string,\n options: TreeOptions,\n isLast: boolean = false\n ): string {\n if (depth > (options.maxDepth || 10)) return '';\n\n const { icons = true, colors = {} } = options;\n const lines: string[] = [];\n\n // Current node\n const connector = isLast ? '└── ' : '├── ';\n const icon = icons && node.icon ? `${node.icon} ` : '';\n const nameColor = node.children ? colors.directory : colors.file;\n const coloredName = this.colorize(node.name, nameColor);\n\n lines.push(prefix + connector + icon + coloredName);\n\n // Metadata\n if (options.showMetadata && node.metadata) {\n const metadataStr = Object.entries(node.metadata)\n .map(([key, value]) => `${key}: ${value}`)\n .join(', ');\n const metadataLine = prefix + (isLast ? ' ' : '│ ') +\n this.colorize(`(${metadataStr})`, colors.metadata);\n lines.push(metadataLine);\n }\n\n // Children\n if (node.children && node.children.length > 0) {\n const childPrefix = prefix + (isLast ? ' ' : '│ ');\n node.children.forEach((child, index) => {\n const isLastChild = index === node.children!.length - 1;\n lines.push(this.renderTreeNode(child, depth + 1, childPrefix, options, isLastChild));\n });\n }\n\n return lines.join('\\n');\n }\n}\n\nexport default RichFormatter;","import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n","export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\n\t// OSC sequences only: ESC ] ... ST (non-greedy until the first ST)\n\tconst osc = `(?:\\\\u001B\\\\][\\\\s\\\\S]*?${ST})`;\n\n\t// CSI and related: ESC/C1, optional intermediates, optional params (supports ; and :) then final byte\n\tconst csi = '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:\\\\d{1,4}(?:[;:]\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]';\n\n\tconst pattern = `${osc}|${csi}`;\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n","/**\n * Core session management module for juno-task-ts\n *\n * Provides comprehensive session lifecycle management, persistence, and statistics\n * for AI subagent execution sessions. Supports session creation, tracking, archival,\n * and recovery with file-based persistence and JSON serialization.\n *\n * @module core/session\n * @version 1.0.0\n */\n\nimport { EventEmitter } from 'node:events';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs';\nimport { promises as fsPromises } from 'node:fs';\nimport { v4 as uuidv4 } from 'uuid';\nimport type {\n JunoTaskConfig,\n SessionStatus,\n SubagentType,\n} from '../types/index';\n\n/**\n * Session metadata interface for tracking session properties\n */\nexport interface SessionInfo {\n /** Unique session identifier (UUID format) */\n id: string;\n /** Human-readable session name/title */\n name?: string;\n /** Current session status */\n status: SessionStatus;\n /** Subagent type used for this session */\n subagent: SubagentType;\n /** Session creation timestamp */\n createdAt: Date;\n /** Last activity timestamp */\n updatedAt: Date;\n /** Session completion timestamp */\n completedAt?: Date;\n /** Working directory when session was created */\n workingDirectory: string;\n /** Session configuration snapshot */\n config: Partial<JunoTaskConfig>;\n /** Session tags for categorization */\n tags: string[];\n /** Custom metadata */\n metadata: Record<string, any>;\n}\n\n/**\n * Execution context captured at session start\n */\nexport interface SessionContext {\n /** Working directory path */\n workingDirectory: string;\n /** Environment variables snapshot */\n environment: Record<string, string>;\n /** Configuration at session start */\n config: JunoTaskConfig;\n /** Git repository information (if available) */\n gitInfo?: {\n branch: string;\n commit: string;\n isDirty: boolean;\n };\n /** Process information */\n processInfo: {\n pid: number;\n nodeVersion: string;\n platform: string;\n arch: string;\n };\n}\n\n/**\n * Tool call statistics for session tracking\n */\nexport interface ToolCallStats {\n /** Tool name */\n name: string;\n /** Number of calls */\n count: number;\n /** Total execution time in milliseconds */\n totalTime: number;\n /** Average execution time in milliseconds */\n averageTime: number;\n /** Success count */\n successCount: number;\n /** Error count */\n errorCount: number;\n /** Last call timestamp */\n lastCall: Date;\n}\n\n/**\n * Session statistics interface for tracking execution metrics\n */\nexport interface SessionStatistics {\n /** Total session duration in milliseconds */\n duration: number;\n /** Number of iterations completed */\n iterations: number;\n /** Number of tool calls made */\n toolCalls: number;\n /** Tool call statistics by tool name */\n toolStats: Record<string, ToolCallStats>;\n /** Success rate (0-1) */\n successRate: number;\n /** Error count */\n errorCount: number;\n /** Warning count */\n warningCount: number;\n /** Memory usage statistics */\n memoryUsage?: {\n peak: number;\n average: number;\n current: number;\n };\n /** Performance metrics */\n performance: {\n avgIterationTime: number;\n avgToolCallTime: number;\n totalThinkingTime: number;\n };\n}\n\n/**\n * Session data interface for complete session state\n */\nexport interface Session {\n /** Session metadata */\n info: SessionInfo;\n /** Execution context */\n context: SessionContext;\n /** Session statistics */\n statistics: SessionStatistics;\n /** Conversation history */\n history: SessionHistoryEntry[];\n /** Session result data */\n result?: {\n success: boolean;\n output?: string;\n error?: string;\n finalState?: any;\n };\n}\n\n/**\n * Session history entry for conversation tracking\n */\nexport interface SessionHistoryEntry {\n /** Entry ID */\n id: string;\n /** Entry timestamp */\n timestamp: Date;\n /** Entry type */\n type: 'prompt' | 'response' | 'tool_call' | 'error' | 'system';\n /** Entry content */\n content: string;\n /** Additional data */\n data?: any;\n /** Duration for this entry */\n duration?: number;\n /** Associated iteration number */\n iteration?: number;\n}\n\n/**\n * Session storage interface for persistence layer abstraction\n */\nexport interface SessionStorage {\n /**\n * Save session data to storage\n * @param session - Session data to save\n */\n saveSession(session: Session): Promise<void>;\n\n /**\n * Load session data from storage\n * @param sessionId - Session ID to load\n * @returns Session data or null if not found\n */\n loadSession(sessionId: string): Promise<Session | null>;\n\n /**\n * List all sessions with optional filtering\n * @param filter - Optional filter criteria\n * @returns Array of session info objects\n */\n listSessions(filter?: SessionListFilter): Promise<SessionInfo[]>;\n\n /**\n * Remove session from storage\n * @param sessionId - Session ID to remove\n */\n removeSession(sessionId: string): Promise<void>;\n\n /**\n * Check if session exists in storage\n * @param sessionId - Session ID to check\n */\n sessionExists(sessionId: string): Promise<boolean>;\n\n /**\n * Archive old sessions\n * @param options - Archive options\n */\n archiveSessions(options: ArchiveOptions): Promise<string[]>;\n\n /**\n * Clean up storage (remove empty files, etc.)\n * @param options - Cleanup options\n */\n cleanup(options: CleanupOptions): Promise<void>;\n}\n\n/**\n * Session list filter criteria\n */\nexport interface SessionListFilter {\n /** Filter by status */\n status?: SessionStatus[];\n /** Filter by subagent */\n subagent?: SubagentType[];\n /** Filter by date range */\n dateRange?: {\n start?: Date;\n end?: Date;\n };\n /** Filter by tags */\n tags?: string[];\n /** Limit number of results */\n limit?: number;\n /** Skip number of results */\n offset?: number;\n /** Sort order */\n sortBy?: 'createdAt' | 'updatedAt' | 'name';\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n}\n\n/**\n * Archive options for session archival\n */\nexport interface ArchiveOptions {\n /** Archive sessions older than this many days */\n olderThanDays?: number;\n /** Archive sessions with specific status */\n status?: SessionStatus[];\n /** Include session data in archive */\n includeData?: boolean;\n /** Archive directory path */\n archiveDir?: string;\n}\n\n/**\n * Cleanup options for storage maintenance\n */\nexport interface CleanupOptions {\n /** Remove empty session files */\n removeEmpty?: boolean;\n /** Remove sessions older than days */\n removeOlderThanDays?: number;\n /** Remove sessions with specific status */\n removeStatus?: SessionStatus[];\n /** Dry run mode (don't actually delete) */\n dryRun?: boolean;\n}\n\n/**\n * Session event types for event emission\n */\nexport type SessionEventType =\n | 'session_created'\n | 'session_updated'\n | 'session_completed'\n | 'session_cancelled'\n | 'session_error'\n | 'iteration_started'\n | 'iteration_completed'\n | 'tool_call_started'\n | 'tool_call_completed'\n | 'cleanup_completed'\n | 'archive_completed';\n\n/**\n * Session event data interface\n */\nexport interface SessionEvent {\n type: SessionEventType;\n sessionId: string;\n timestamp: Date;\n data?: any;\n}\n\n/**\n * File-based session storage implementation\n * Stores sessions as JSON files in a directory structure\n */\nexport class FileSessionStorage implements SessionStorage {\n private readonly baseDir: string;\n private readonly sessionsDir: string;\n private readonly archiveDir: string;\n\n /**\n * Create a new file-based session storage\n * @param baseDir - Base directory for session storage\n */\n constructor(baseDir: string) {\n this.baseDir = path.resolve(baseDir);\n this.sessionsDir = path.join(this.baseDir, 'sessions');\n this.archiveDir = path.join(this.baseDir, 'archive');\n }\n\n /**\n * Initialize storage directories\n */\n async initialize(): Promise<void> {\n await fsPromises.mkdir(this.sessionsDir, { recursive: true });\n await fsPromises.mkdir(this.archiveDir, { recursive: true });\n }\n\n /**\n * Get session file path\n * @param sessionId - Session ID\n * @returns Full path to session file\n */\n private getSessionPath(sessionId: string): string {\n return path.join(this.sessionsDir, `${sessionId}.json`);\n }\n\n /**\n * Save session data to storage\n */\n async saveSession(session: Session): Promise<void> {\n await this.initialize();\n const sessionPath = this.getSessionPath(session.info.id);\n\n // Create a serializable copy\n const serializable = {\n ...session,\n info: {\n ...session.info,\n createdAt: session.info.createdAt.toISOString(),\n updatedAt: session.info.updatedAt.toISOString(),\n completedAt: session.info.completedAt?.toISOString(),\n },\n history: session.history.map(entry => ({\n ...entry,\n timestamp: entry.timestamp.toISOString(),\n })),\n };\n\n await fsPromises.writeFile(\n sessionPath,\n JSON.stringify(serializable, null, 2),\n 'utf-8'\n );\n }\n\n /**\n * Load session data from storage\n */\n async loadSession(sessionId: string): Promise<Session | null> {\n const sessionPath = this.getSessionPath(sessionId);\n\n try {\n const data = await fsPromises.readFile(sessionPath, 'utf-8');\n const parsed = JSON.parse(data);\n\n // Deserialize dates\n return {\n ...parsed,\n info: {\n ...parsed.info,\n createdAt: new Date(parsed.info.createdAt),\n updatedAt: new Date(parsed.info.updatedAt),\n completedAt: parsed.info.completedAt ? new Date(parsed.info.completedAt) : undefined,\n },\n history: parsed.history.map((entry: any) => ({\n ...entry,\n timestamp: new Date(entry.timestamp),\n })),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw new Error(`Failed to load session ${sessionId}: ${error}`);\n }\n }\n\n /**\n * List all sessions with optional filtering\n */\n async listSessions(filter?: SessionListFilter): Promise<SessionInfo[]> {\n await this.initialize();\n\n try {\n const files = await fsPromises.readdir(this.sessionsDir);\n const sessionFiles = files.filter(file => file.endsWith('.json'));\n\n const sessions: SessionInfo[] = [];\n\n for (const file of sessionFiles) {\n try {\n const sessionId = path.basename(file, '.json');\n const session = await this.loadSession(sessionId);\n if (session) {\n sessions.push(session.info);\n }\n } catch (error) {\n // Skip corrupted session files\n console.warn(`Failed to load session from ${file}: ${error}`);\n }\n }\n\n // Apply filters\n let filtered = sessions;\n\n if (filter) {\n if (filter.status) {\n filtered = filtered.filter(s => filter.status!.includes(s.status));\n }\n\n if (filter.subagent) {\n filtered = filtered.filter(s => filter.subagent!.includes(s.subagent));\n }\n\n if (filter.dateRange) {\n if (filter.dateRange.start) {\n filtered = filtered.filter(s => s.createdAt >= filter.dateRange!.start!);\n }\n if (filter.dateRange.end) {\n filtered = filtered.filter(s => s.createdAt <= filter.dateRange!.end!);\n }\n }\n\n if (filter.tags && filter.tags.length > 0) {\n filtered = filtered.filter(s =>\n filter.tags!.some(tag => s.tags.includes(tag))\n );\n }\n\n // Sort\n const sortBy = filter.sortBy || 'updatedAt';\n const sortOrder = filter.sortOrder || 'desc';\n\n filtered.sort((a, b) => {\n const aVal = a[sortBy];\n const bVal = b[sortBy];\n\n if (aVal === undefined && bVal === undefined) return 0;\n if (aVal === undefined) return 1;\n if (bVal === undefined) return -1;\n\n if (aVal < bVal) return sortOrder === 'asc' ? -1 : 1;\n if (aVal > bVal) return sortOrder === 'asc' ? 1 : -1;\n return 0;\n });\n\n // Apply limit and offset\n if (filter.offset) {\n filtered = filtered.slice(filter.offset);\n }\n if (filter.limit) {\n filtered = filtered.slice(0, filter.limit);\n }\n }\n\n return filtered;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return [];\n }\n throw error;\n }\n }\n\n /**\n * Remove session from storage\n */\n async removeSession(sessionId: string): Promise<void> {\n const sessionPath = this.getSessionPath(sessionId);\n\n try {\n await fsPromises.unlink(sessionPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw new Error(`Failed to remove session ${sessionId}: ${error}`);\n }\n }\n }\n\n /**\n * Check if session exists in storage\n */\n async sessionExists(sessionId: string): Promise<boolean> {\n const sessionPath = this.getSessionPath(sessionId);\n\n try {\n await fsPromises.access(sessionPath, fs.constants.F_OK);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Archive old sessions\n */\n async archiveSessions(options: ArchiveOptions): Promise<string[]> {\n await this.initialize();\n\n const filter: SessionListFilter = {};\n\n if (options.olderThanDays) {\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - options.olderThanDays);\n filter.dateRange = { end: cutoffDate };\n }\n\n if (options.status) {\n filter.status = options.status;\n }\n\n const sessionsToArchive = await this.listSessions(filter);\n const archivedIds: string[] = [];\n\n for (const sessionInfo of sessionsToArchive) {\n try {\n const session = await this.loadSession(sessionInfo.id);\n if (!session) continue;\n\n // Create archive file\n const archiveFileName = `${sessionInfo.id}_${sessionInfo.createdAt.toISOString().split('T')[0]}.json`;\n const archivePath = path.join(this.archiveDir, archiveFileName);\n\n if (options.includeData) {\n await fsPromises.writeFile(\n archivePath,\n JSON.stringify(session, null, 2),\n 'utf-8'\n );\n } else {\n // Archive only metadata\n await fsPromises.writeFile(\n archivePath,\n JSON.stringify({ info: session.info, context: session.context }, null, 2),\n 'utf-8'\n );\n }\n\n // Remove from active sessions\n await this.removeSession(sessionInfo.id);\n archivedIds.push(sessionInfo.id);\n } catch (error) {\n console.warn(`Failed to archive session ${sessionInfo.id}: ${error}`);\n }\n }\n\n return archivedIds;\n }\n\n /**\n * Clean up storage\n */\n async cleanup(options: CleanupOptions): Promise<void> {\n await this.initialize();\n\n const sessions = await this.listSessions();\n\n for (const sessionInfo of sessions) {\n let shouldRemove = false;\n\n if (options.removeOlderThanDays) {\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - options.removeOlderThanDays);\n if (sessionInfo.createdAt < cutoffDate) {\n shouldRemove = true;\n }\n }\n\n if (options.removeStatus && options.removeStatus.includes(sessionInfo.status)) {\n shouldRemove = true;\n }\n\n if (options.removeEmpty) {\n try {\n const session = await this.loadSession(sessionInfo.id);\n if (session && session.history.length === 0 && !session.result) {\n shouldRemove = true;\n }\n } catch {\n // If we can't load it, consider it for removal\n shouldRemove = true;\n }\n }\n\n if (shouldRemove && !options.dryRun) {\n await this.removeSession(sessionInfo.id);\n }\n }\n }\n}\n\n/**\n * Session manager class for comprehensive session lifecycle management\n * Provides high-level API for session operations with event emission\n */\nexport class SessionManager extends EventEmitter {\n private storage: SessionStorage;\n private activeSessions: Map<string, Session> = new Map();\n\n /**\n * Create a new session manager\n * @param storage - Session storage implementation\n */\n constructor(storage: SessionStorage) {\n super();\n this.storage = storage;\n }\n\n /**\n * Create a new session\n * @param options - Session creation options\n * @returns Created session data\n */\n async createSession(options: {\n name?: string;\n subagent: SubagentType;\n config: JunoTaskConfig;\n tags?: string[];\n metadata?: Record<string, any>;\n }): Promise<Session> {\n const sessionId = uuidv4();\n const now = new Date();\n\n // Capture execution context\n const context: SessionContext = {\n workingDirectory: options.config.workingDirectory,\n environment: { ...process.env } as Record<string, string>,\n config: { ...options.config },\n processInfo: {\n pid: process.pid,\n nodeVersion: process.version,\n platform: process.platform,\n arch: process.arch,\n },\n };\n\n // Initialize session\n const session: Session = {\n info: {\n id: sessionId,\n ...(options.name !== undefined && { name: options.name }),\n status: 'running',\n subagent: options.subagent,\n createdAt: now,\n updatedAt: now,\n workingDirectory: options.config.workingDirectory,\n config: { ...options.config },\n tags: options.tags || [],\n metadata: options.metadata || {},\n },\n context,\n statistics: {\n duration: 0,\n iterations: 0,\n toolCalls: 0,\n toolStats: {},\n successRate: 0,\n errorCount: 0,\n warningCount: 0,\n performance: {\n avgIterationTime: 0,\n avgToolCallTime: 0,\n totalThinkingTime: 0,\n },\n },\n history: [],\n };\n\n // Store in active sessions and save to storage\n this.activeSessions.set(sessionId, session);\n await this.storage.saveSession(session);\n\n // Emit event\n this.emit('session_created', {\n type: 'session_created',\n sessionId,\n timestamp: now,\n data: { session: session.info },\n } as SessionEvent);\n\n return session;\n }\n\n /**\n * Update session data\n * @param sessionId - Session ID to update\n * @param updates - Updates to apply\n */\n async updateSession(sessionId: string, updates: {\n status?: SessionStatus;\n name?: string;\n tags?: string[];\n metadata?: Record<string, any>;\n statistics?: Partial<SessionStatistics>;\n result?: Session['result'];\n }): Promise<void> {\n let session = this.activeSessions.get(sessionId);\n\n if (!session) {\n const loadedSession = await this.storage.loadSession(sessionId);\n session = loadedSession || undefined;\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n }\n\n // Apply updates\n if (updates.status) session.info.status = updates.status;\n if (updates.name) session.info.name = updates.name;\n if (updates.tags) session.info.tags = updates.tags;\n if (updates.metadata) {\n session.info.metadata = { ...session.info.metadata, ...updates.metadata };\n }\n if (updates.statistics) {\n session.statistics = { ...session.statistics, ...updates.statistics };\n }\n if (updates.result) {\n session.result = updates.result;\n }\n\n session.info.updatedAt = new Date();\n\n // Update active session and save\n this.activeSessions.set(sessionId, session);\n await this.storage.saveSession(session);\n\n // Emit event\n this.emit('session_updated', {\n type: 'session_updated',\n sessionId,\n timestamp: new Date(),\n data: { updates },\n } as SessionEvent);\n }\n\n /**\n * Complete a session\n * @param sessionId - Session ID to complete\n * @param result - Final session result\n */\n async completeSession(sessionId: string, result: {\n success: boolean;\n output?: string;\n error?: string;\n finalState?: any;\n }): Promise<void> {\n const now = new Date();\n\n await this.updateSession(sessionId, {\n status: result.success ? 'completed' : 'failed',\n result,\n });\n\n const session = await this.getSession(sessionId);\n if (session) {\n session.info.completedAt = now;\n session.statistics.duration = now.getTime() - session.info.createdAt.getTime();\n\n await this.storage.saveSession(session);\n\n // Remove from active sessions\n this.activeSessions.delete(sessionId);\n }\n\n // Emit event\n this.emit('session_completed', {\n type: 'session_completed',\n sessionId,\n timestamp: now,\n data: { result },\n } as SessionEvent);\n }\n\n /**\n * Cancel a session\n * @param sessionId - Session ID to cancel\n */\n async cancelSession(sessionId: string): Promise<void> {\n await this.updateSession(sessionId, {\n status: 'cancelled',\n });\n\n // Remove from active sessions\n this.activeSessions.delete(sessionId);\n\n // Emit event\n this.emit('session_cancelled', {\n type: 'session_cancelled',\n sessionId,\n timestamp: new Date(),\n } as SessionEvent);\n }\n\n /**\n * Get session by ID\n * @param sessionId - Session ID to retrieve\n * @returns Session data or null if not found\n */\n async getSession(sessionId: string): Promise<Session | null> {\n // Check active sessions first\n const activeSession = this.activeSessions.get(sessionId);\n if (activeSession) {\n return activeSession;\n }\n\n // Load from storage\n return await this.storage.loadSession(sessionId);\n }\n\n /**\n * List sessions with optional filtering\n * @param filter - Optional filter criteria\n * @returns Array of session info objects\n */\n async listSessions(filter?: SessionListFilter): Promise<SessionInfo[]> {\n return await this.storage.listSessions(filter);\n }\n\n /**\n * Search sessions by criteria\n * @param criteria - Search criteria\n * @returns Array of matching session info objects\n */\n async searchSessions(criteria: {\n query?: string;\n tags?: string[];\n status?: SessionStatus[];\n dateRange?: { start?: Date; end?: Date };\n }): Promise<SessionInfo[]> {\n const filter: SessionListFilter = {};\n if (criteria.status) filter.status = criteria.status;\n if (criteria.tags) filter.tags = criteria.tags;\n if (criteria.dateRange) filter.dateRange = criteria.dateRange;\n\n const sessions = await this.listSessions(filter);\n\n if (criteria.query) {\n const query = criteria.query.toLowerCase();\n return sessions.filter(session =>\n session.name?.toLowerCase().includes(query) ||\n session.id.toLowerCase().includes(query) ||\n session.tags.some(tag => tag.toLowerCase().includes(query))\n );\n }\n\n return sessions;\n }\n\n /**\n * Remove session\n * @param sessionId - Session ID to remove\n */\n async removeSession(sessionId: string): Promise<void> {\n await this.storage.removeSession(sessionId);\n this.activeSessions.delete(sessionId);\n }\n\n /**\n * Clean up old sessions\n * @param options - Cleanup options\n */\n async cleanupSessions(options: CleanupOptions): Promise<void> {\n await this.storage.cleanup(options);\n\n this.emit('cleanup_completed', {\n type: 'cleanup_completed',\n sessionId: 'all',\n timestamp: new Date(),\n data: { options },\n } as SessionEvent);\n }\n\n /**\n * Archive sessions\n * @param options - Archive options\n * @returns Array of archived session IDs\n */\n async archiveSessions(options: ArchiveOptions): Promise<string[]> {\n const archivedIds = await this.storage.archiveSessions(options);\n\n // Remove archived sessions from active sessions\n for (const sessionId of archivedIds) {\n this.activeSessions.delete(sessionId);\n }\n\n this.emit('archive_completed', {\n type: 'archive_completed',\n sessionId: 'multiple',\n timestamp: new Date(),\n data: { archivedIds, options },\n } as SessionEvent);\n\n return archivedIds;\n }\n\n /**\n * Add history entry to session\n * @param sessionId - Session ID\n * @param entry - History entry to add\n */\n async addHistoryEntry(sessionId: string, entry: Omit<SessionHistoryEntry, 'id' | 'timestamp'>): Promise<void> {\n const session = await this.getSession(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n const historyEntry: SessionHistoryEntry = {\n id: uuidv4(),\n timestamp: new Date(),\n ...entry,\n };\n\n session.history.push(historyEntry);\n await this.storage.saveSession(session);\n }\n\n /**\n * Update session statistics\n * @param sessionId - Session ID\n * @param stats - Statistics to update\n */\n async updateStatistics(sessionId: string, stats: Partial<SessionStatistics>): Promise<void> {\n await this.updateSession(sessionId, { statistics: stats });\n }\n\n /**\n * Record tool call in session\n * @param sessionId - Session ID\n * @param toolCall - Tool call information\n */\n async recordToolCall(sessionId: string, toolCall: {\n name: string;\n duration: number;\n success: boolean;\n }): Promise<void> {\n const session = await this.getSession(sessionId);\n if (!session) return;\n\n // Update tool statistics\n const existing = session.statistics.toolStats[toolCall.name] || {\n name: toolCall.name,\n count: 0,\n totalTime: 0,\n averageTime: 0,\n successCount: 0,\n errorCount: 0,\n lastCall: new Date(),\n };\n\n existing.count++;\n existing.totalTime += toolCall.duration;\n existing.averageTime = existing.totalTime / existing.count;\n existing.lastCall = new Date();\n\n if (toolCall.success) {\n existing.successCount++;\n } else {\n existing.errorCount++;\n }\n\n session.statistics.toolStats[toolCall.name] = existing;\n session.statistics.toolCalls++;\n\n await this.storage.saveSession(session);\n }\n\n /**\n * Get session context for prompt generation\n * @param sessionId - Session ID\n * @param options - Context generation options\n * @returns Formatted context string\n */\n async getSessionContext(sessionId: string, options: {\n includeHistory?: boolean;\n includeStats?: boolean;\n maxHistoryEntries?: number;\n } = {}): Promise<string> {\n const session = await this.getSession(sessionId);\n if (!session) {\n return `Session ${sessionId}: Not found`;\n }\n\n const contextLines = [\n `Session ${sessionId} Context:`,\n `Status: ${session.info.status}`,\n `Subagent: ${session.info.subagent}`,\n `Created: ${session.info.createdAt.toISOString()}`,\n `Working Directory: ${session.context.workingDirectory}`,\n ];\n\n if (session.info.tags.length > 0) {\n contextLines.push(`Tags: ${session.info.tags.join(', ')}`);\n }\n\n if (options.includeStats) {\n contextLines.push('', 'Statistics:');\n contextLines.push(` Iterations: ${session.statistics.iterations}`);\n contextLines.push(` Tool Calls: ${session.statistics.toolCalls}`);\n contextLines.push(` Duration: ${session.statistics.duration}ms`);\n contextLines.push(` Success Rate: ${(session.statistics.successRate * 100).toFixed(1)}%`);\n }\n\n if (options.includeHistory && session.history && session.history.length > 0) {\n contextLines.push('', 'Recent History:');\n const maxEntries = options.maxHistoryEntries || 5;\n const recentEntries = session.history.slice(-maxEntries);\n\n for (const entry of recentEntries) {\n const time = entry.timestamp?.toISOString().split('T')[1].split('.')[0] || 'unknown';\n contextLines.push(` [${time}] ${entry.type}: ${entry.content.substring(0, 100)}...`);\n }\n }\n\n return contextLines.join('\\n');\n }\n\n /**\n * Get comprehensive session summary\n * @param sessionId - Session ID\n * @returns Session summary object\n */\n async getSessionSummary(sessionId: string): Promise<{\n info: SessionInfo;\n statistics: SessionStatistics;\n summary: {\n totalDuration: string;\n iterationsPerMinute: number;\n toolCallsPerIteration: number;\n mostUsedTool: string | null;\n errorRate: number;\n };\n } | null> {\n const session = await this.getSession(sessionId);\n if (!session) return null;\n\n const durationMinutes = session.statistics.duration / (1000 * 60);\n const iterationsPerMinute = durationMinutes > 0 ? session.statistics.iterations / durationMinutes : 0;\n const toolCallsPerIteration = session.statistics.iterations > 0 ? session.statistics.toolCalls / session.statistics.iterations : 0;\n\n let mostUsedTool: string | null = null;\n let maxCalls = 0;\n for (const [toolName, stats] of Object.entries(session.statistics.toolStats)) {\n if (stats.count > maxCalls) {\n maxCalls = stats.count;\n mostUsedTool = toolName;\n }\n }\n\n const totalCalls = session.statistics.toolCalls;\n const errorRate = totalCalls > 0 ? session.statistics.errorCount / totalCalls : 0;\n\n return {\n info: session.info,\n statistics: session.statistics,\n summary: {\n totalDuration: this.formatDuration(session.statistics.duration),\n iterationsPerMinute: Number(iterationsPerMinute.toFixed(2)),\n toolCallsPerIteration: Number(toolCallsPerIteration.toFixed(2)),\n mostUsedTool,\n errorRate: Number(errorRate.toFixed(3)),\n },\n };\n }\n\n /**\n * Format duration in human-readable format\n * @param milliseconds - Duration in milliseconds\n * @returns Formatted duration string\n */\n private formatDuration(milliseconds: number): string {\n const seconds = Math.floor(milliseconds / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n if (hours > 0) {\n return `${hours}h ${minutes % 60}m ${seconds % 60}s`;\n } else if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n } else {\n return `${seconds}s`;\n }\n }\n}\n\n/**\n * Create a session manager with file storage\n * Convenience function for creating a session manager with file-based storage\n *\n * @param config - Juno task configuration\n * @returns Configured session manager instance\n *\n * @example\n * ```typescript\n * const sessionManager = await createSessionManager(config);\n * const session = await sessionManager.createSession({\n * name: 'My Task',\n * subagent: 'claude',\n * config: config,\n * tags: ['development', 'feature'],\n * });\n * ```\n */\nexport async function createSessionManager(config: JunoTaskConfig): Promise<SessionManager> {\n const storage = new FileSessionStorage(config.sessionDirectory);\n await storage.initialize();\n return new SessionManager(storage);\n}\n\n/**\n * Session utilities for common operations\n */\n// Simple counter for ID uniqueness\nlet sessionIdCounter = 0;\n\nexport const SessionUtils = {\n /**\n * Generate session ID compatible with Python implementation\n * Uses timestamp-based format for compatibility\n *\n * @returns Timestamp-based session ID\n */\n generateTimestampId(): string {\n const now = new Date();\n // Use timestamp without milliseconds to ensure we have room for counter\n const timestamp = now.toISOString().replace(/[-:.TZ]/g, '').slice(0, 12); // YYYYMMDDHHMM\n // Add a simple incrementing counter for uniqueness\n sessionIdCounter = (sessionIdCounter + 1) % 1000;\n const suffix = sessionIdCounter.toString().padStart(3, '0');\n return timestamp + suffix; // 12 + 3 = 15 digits\n },\n\n /**\n * Parse session timestamp from ID\n * @param sessionId - Session ID to parse\n * @returns Date object or null if invalid\n */\n parseSessionTimestamp(sessionId: string): Date | null {\n try {\n // Try UUID format first\n if (sessionId.includes('-')) {\n return null; // UUIDs don't contain timestamps\n }\n\n // Try timestamp format (YYYYMMDDTHHMMSS)\n if (sessionId.length >= 15) {\n const year = parseInt(sessionId.slice(0, 4));\n const month = parseInt(sessionId.slice(4, 6)) - 1; // JS months are 0-based\n const day = parseInt(sessionId.slice(6, 8));\n const hour = parseInt(sessionId.slice(9, 11));\n const minute = parseInt(sessionId.slice(11, 13));\n const second = parseInt(sessionId.slice(13, 15));\n\n return new Date(year, month, day, hour, minute, second);\n }\n\n return null;\n } catch {\n return null;\n }\n },\n\n /**\n * Validate session ID format\n * @param sessionId - Session ID to validate\n * @returns True if valid format\n */\n isValidSessionId(sessionId: string): boolean {\n // UUID format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\n\n // Timestamp format: YYYYMMDDTHHMMSS or similar\n const timestampRegex = /^[0-9]{8}T[0-9]{6}$/;\n\n return uuidRegex.test(sessionId) || timestampRegex.test(sessionId);\n },\n\n /**\n * Calculate session statistics from history\n * @param history - Session history entries\n * @returns Calculated statistics\n */\n calculateStatistics(history: SessionHistoryEntry[]): Partial<SessionStatistics> {\n const stats: Partial<SessionStatistics> = {\n toolCalls: 0,\n errorCount: 0,\n warningCount: 0,\n toolStats: {},\n };\n\n for (const entry of history) {\n if (entry.type === 'tool_call') {\n stats.toolCalls = (stats.toolCalls || 0) + 1;\n } else if (entry.type === 'error') {\n stats.errorCount = (stats.errorCount || 0) + 1;\n }\n }\n\n const totalEntries = history.length;\n stats.successRate = totalEntries > 0 ? 1 - ((stats.errorCount || 0) / totalEntries) : 0;\n\n return stats;\n },\n};\n\n// Types are already exported above via export interface/export type declarations","/**\n * Core metrics and analytics module for juno-task-ts\n *\n * Provides comprehensive metrics collection, performance tracking, statistics\n * calculation, and analytics reporting for AI subagent execution sessions.\n * Supports real-time monitoring, historical analysis, and performance optimization.\n *\n * @module core/metrics\n * @version 1.0.0\n */\n\nimport { EventEmitter } from 'node:events';\nimport { cpus, totalmem, freemem } from 'node:os';\nimport { performance, PerformanceObserver } from 'node:perf_hooks';\nimport { promises as fsPromises } from 'node:fs';\nimport * as path from 'node:path';\nimport { v4 as uuidv4 } from 'uuid';\nimport type {\n JunoTaskConfig,\n SessionStatus,\n SubagentType,\n LogLevel,\n} from '../types/index';\n\n/**\n * Performance timing information for operations\n */\nexport interface PerformanceTiming {\n /** Operation start timestamp (high-resolution) */\n startTime: number;\n /** Operation end timestamp (high-resolution) */\n endTime: number;\n /** Operation duration in milliseconds */\n duration: number;\n /** Memory usage before operation (bytes) */\n memoryBefore: number;\n /** Memory usage after operation (bytes) */\n memoryAfter: number;\n /** Memory delta during operation (bytes) */\n memoryDelta: number;\n}\n\n/**\n * Tool call execution metrics\n */\nexport interface ToolCallMetrics {\n /** Tool name */\n name: string;\n /** Unique call identifier */\n callId: string;\n /** Call timestamp */\n timestamp: Date;\n /** Execution duration in milliseconds */\n duration: number;\n /** Whether the call was successful */\n success: boolean;\n /** Error message if failed */\n error?: string;\n /** Tool parameters (sanitized) */\n parameters?: Record<string, any>;\n /** Tool result preview */\n resultPreview?: string;\n /** Associated session ID */\n sessionId: string;\n /** Associated iteration number */\n iteration: number;\n /** Subagent that made the call */\n subagent: SubagentType;\n /** Network latency if applicable (ms) */\n networkLatency?: number;\n /** Rate limit information */\n rateLimitInfo?: {\n remaining: number;\n resetTime: Date;\n waitTime?: number;\n };\n}\n\n/**\n * Session execution metrics\n */\nexport interface SessionMetrics {\n /** Session identifier */\n sessionId: string;\n /** Session start timestamp */\n startTime: Date;\n /** Session end timestamp */\n endTime?: Date;\n /** Total session duration in milliseconds */\n duration: number;\n /** Current session status */\n status: SessionStatus;\n /** Number of iterations completed */\n iterations: number;\n /** Total number of tool calls */\n toolCalls: number;\n /** Number of successful operations */\n successCount: number;\n /** Number of failed operations */\n errorCount: number;\n /** Number of warnings */\n warningCount: number;\n /** Success rate (0-1) */\n successRate: number;\n /** Average iteration duration (ms) */\n avgIterationDuration: number;\n /** Average tool call duration (ms) */\n avgToolCallDuration: number;\n /** Total thinking/processing time (ms) */\n totalThinkingTime: number;\n /** Peak memory usage (bytes) */\n peakMemoryUsage: number;\n /** Average memory usage (bytes) */\n avgMemoryUsage: number;\n /** Current memory usage (bytes) */\n currentMemoryUsage: number;\n /** Subagent used */\n subagent: SubagentType;\n /** Model used */\n model?: string;\n /** Working directory */\n workingDirectory: string;\n}\n\n/**\n * System performance metrics\n */\nexport interface SystemMetrics {\n /** Timestamp when metrics were captured */\n timestamp: Date;\n /** Application startup time (ms) */\n startupTime: number;\n /** Configuration loading time (ms) */\n configLoadTime: number;\n /** Template generation time (ms) */\n templateGenerationTime: number;\n /** CLI command response time (ms) */\n cliResponseTime: number;\n /** CPU usage percentage (0-100) */\n cpuUsage: number;\n /** Memory usage information */\n memoryUsage: {\n total: number;\n free: number;\n used: number;\n percentage: number;\n heapUsed: number;\n heapTotal: number;\n external: number;\n };\n /** Network metrics */\n networkMetrics: {\n totalRequests: number;\n successfulRequests: number;\n failedRequests: number;\n avgResponseTime: number;\n totalBytesTransferred: number;\n };\n /** File system metrics */\n fileSystemMetrics: {\n totalOperations: number;\n readOperations: number;\n writeOperations: number;\n avgOperationTime: number;\n };\n}\n\n/**\n * Tool call statistics aggregated over time\n */\nexport interface ToolCallStatistics {\n /** Tool name */\n name: string;\n /** Total number of calls */\n totalCalls: number;\n /** Number of successful calls */\n successfulCalls: number;\n /** Number of failed calls */\n failedCalls: number;\n /** Success rate (0-1) */\n successRate: number;\n /** Minimum execution time (ms) */\n minDuration: number;\n /** Maximum execution time (ms) */\n maxDuration: number;\n /** Average execution time (ms) */\n avgDuration: number;\n /** 95th percentile execution time (ms) */\n p95Duration: number;\n /** 99th percentile execution time (ms) */\n p99Duration: number;\n /** Total execution time (ms) */\n totalDuration: number;\n /** First call timestamp */\n firstCall: Date;\n /** Last call timestamp */\n lastCall: Date;\n /** Most common error messages */\n commonErrors: Array<{ error: string; count: number }>;\n /** Usage patterns over time */\n usagePattern: Array<{ hour: number; calls: number }>;\n}\n\n/**\n * Performance optimization recommendations\n */\nexport interface PerformanceRecommendation {\n /** Recommendation ID */\n id: string;\n /** Recommendation type */\n type: 'performance' | 'reliability' | 'efficiency' | 'cost';\n /** Severity level */\n severity: 'low' | 'medium' | 'high' | 'critical';\n /** Title of the recommendation */\n title: string;\n /** Detailed description */\n description: string;\n /** Potential impact */\n impact: string;\n /** Suggested action */\n action: string;\n /** Metrics that triggered this recommendation */\n triggeringMetrics: Record<string, number>;\n /** Timestamp when recommendation was generated */\n timestamp: Date;\n}\n\n/**\n * Analytics report containing comprehensive insights\n */\nexport interface AnalyticsReport {\n /** Report generation timestamp */\n timestamp: Date;\n /** Time range covered by the report */\n timeRange: {\n start: Date;\n end: Date;\n };\n /** Overall summary statistics */\n summary: {\n totalSessions: number;\n totalIterations: number;\n totalToolCalls: number;\n avgSessionDuration: number;\n overallSuccessRate: number;\n totalErrors: number;\n };\n /** Tool usage statistics */\n toolStatistics: Record<string, ToolCallStatistics>;\n /** Session statistics by subagent */\n sessionStatsBySubagent: Record<SubagentType, {\n count: number;\n avgDuration: number;\n successRate: number;\n avgIterations: number;\n }>;\n /** Performance trends */\n performanceTrends: {\n iterationDurationTrend: Array<{ timestamp: Date; avgDuration: number }>;\n successRateTrend: Array<{ timestamp: Date; successRate: number }>;\n errorRateTrend: Array<{ timestamp: Date; errorRate: number }>;\n };\n /** System performance metrics */\n systemPerformance: SystemMetrics;\n /** Performance recommendations */\n recommendations: PerformanceRecommendation[];\n /** Resource usage patterns */\n resourceUsage: {\n peakMemory: number;\n avgMemory: number;\n cpuUtilization: number;\n networkUtilization: number;\n };\n}\n\n/**\n * Metrics export format options\n */\nexport type MetricsExportFormat = 'json' | 'csv' | 'yaml';\n\n/**\n * Metrics export options\n */\nexport interface MetricsExportOptions {\n /** Export format */\n format: MetricsExportFormat;\n /** Output file path */\n outputPath: string;\n /** Time range to export */\n timeRange?: {\n start: Date;\n end: Date;\n };\n /** Include raw tool call data */\n includeRawData?: boolean;\n /** Include system metrics */\n includeSystemMetrics?: boolean;\n /** Compress output */\n compress?: boolean;\n}\n\n/**\n * Performance tracker for monitoring execution performance\n */\nexport class PerformanceTracker {\n private activeTimings: Map<string, PerformanceTiming> = new Map();\n private completedTimings: PerformanceTiming[] = [];\n private observer: PerformanceObserver;\n\n constructor() {\n // Set up performance observer for automatic timing collection\n this.observer = new PerformanceObserver((list) => {\n for (const entry of list.getEntries()) {\n if (entry.entryType === 'measure') {\n this.handlePerformanceEntry(entry);\n }\n }\n });\n this.observer.observe({ entryTypes: ['measure'] });\n }\n\n /**\n * Start timing an operation\n * @param operationId - Unique identifier for the operation\n * @returns Performance timing object\n */\n startTiming(operationId: string): PerformanceTiming {\n const startTime = performance.now();\n const memoryBefore = this.getCurrentMemoryUsage();\n\n const timing: PerformanceTiming = {\n startTime,\n endTime: 0,\n duration: 0,\n memoryBefore,\n memoryAfter: 0,\n memoryDelta: 0,\n };\n\n this.activeTimings.set(operationId, timing);\n performance.mark(`${operationId}-start`);\n\n return timing;\n }\n\n /**\n * End timing an operation\n * @param operationId - Operation identifier\n * @returns Completed timing object or null if not found\n */\n endTiming(operationId: string): PerformanceTiming | null {\n const timing = this.activeTimings.get(operationId);\n if (!timing) {\n return null;\n }\n\n const endTime = performance.now();\n const memoryAfter = this.getCurrentMemoryUsage();\n\n timing.endTime = endTime;\n timing.duration = endTime - timing.startTime;\n timing.memoryAfter = memoryAfter;\n timing.memoryDelta = memoryAfter - timing.memoryBefore;\n\n performance.mark(`${operationId}-end`);\n performance.measure(operationId, `${operationId}-start`, `${operationId}-end`);\n\n this.activeTimings.delete(operationId);\n this.completedTimings.push(timing);\n\n return timing;\n }\n\n /**\n * Get current memory usage\n * @returns Memory usage in bytes\n */\n private getCurrentMemoryUsage(): number {\n return process.memoryUsage().heapUsed;\n }\n\n /**\n * Handle performance entries from observer\n * @param entry - Performance entry\n */\n private handlePerformanceEntry(entry: PerformanceEntry): void {\n // Additional processing of performance entries if needed\n // This can be extended for more detailed performance analysis\n }\n\n /**\n * Get performance statistics\n * @returns Performance statistics\n */\n getStatistics(): {\n totalOperations: number;\n avgDuration: number;\n minDuration: number;\n maxDuration: number;\n p95Duration: number;\n p99Duration: number;\n avgMemoryDelta: number;\n } {\n if (this.completedTimings.length === 0) {\n return {\n totalOperations: 0,\n avgDuration: 0,\n minDuration: 0,\n maxDuration: 0,\n p95Duration: 0,\n p99Duration: 0,\n avgMemoryDelta: 0,\n };\n }\n\n const durations = this.completedTimings.map(t => t.duration).sort((a, b) => a - b);\n const memoryDeltas = this.completedTimings.map(t => t.memoryDelta);\n\n return {\n totalOperations: this.completedTimings.length,\n avgDuration: durations.reduce((sum, d) => sum + d, 0) / durations.length,\n minDuration: durations[0],\n maxDuration: durations[durations.length - 1],\n p95Duration: durations[Math.floor(durations.length * 0.95)],\n p99Duration: durations[Math.floor(durations.length * 0.99)],\n avgMemoryDelta: memoryDeltas.reduce((sum, d) => sum + d, 0) / memoryDeltas.length,\n };\n }\n\n /**\n * Clear all timing data\n */\n clear(): void {\n this.activeTimings.clear();\n this.completedTimings = [];\n performance.clearMarks();\n performance.clearMeasures();\n }\n\n /**\n * Cleanup and disconnect observer\n */\n dispose(): void {\n this.observer.disconnect();\n this.clear();\n }\n}\n\n/**\n * Statistics calculator for metrics analysis\n */\nexport class StatisticsCalculator {\n /**\n * Calculate percentiles for a dataset\n * @param values - Array of numeric values\n * @param percentiles - Array of percentiles to calculate (0-100)\n * @returns Object mapping percentiles to values\n */\n static calculatePercentiles(values: number[], percentiles: number[]): Record<string, number> {\n if (values.length === 0) {\n return {};\n }\n\n const sorted = [...values].sort((a, b) => a - b);\n const result: Record<string, number> = {};\n\n for (const p of percentiles) {\n const index = (p / 100) * (sorted.length - 1);\n const lower = Math.floor(index);\n const upper = Math.ceil(index);\n const weight = index - lower;\n\n if (upper >= sorted.length) {\n result[`p${p}`] = sorted[sorted.length - 1];\n } else {\n result[`p${p}`] = sorted[lower] * (1 - weight) + sorted[upper] * weight;\n }\n }\n\n return result;\n }\n\n /**\n * Calculate tool call statistics from metrics\n * @param toolCalls - Array of tool call metrics\n * @returns Tool call statistics by tool name\n */\n static calculateToolStatistics(toolCalls: ToolCallMetrics[]): Record<string, ToolCallStatistics> {\n const statsByTool: Record<string, ToolCallStatistics> = {};\n\n for (const call of toolCalls) {\n if (!statsByTool[call.name]) {\n statsByTool[call.name] = {\n name: call.name,\n totalCalls: 0,\n successfulCalls: 0,\n failedCalls: 0,\n successRate: 0,\n minDuration: Infinity,\n maxDuration: 0,\n avgDuration: 0,\n p95Duration: 0,\n p99Duration: 0,\n totalDuration: 0,\n firstCall: call.timestamp,\n lastCall: call.timestamp,\n commonErrors: [],\n usagePattern: Array.from({ length: 24 }, (_, i) => ({ hour: i, calls: 0 })),\n };\n }\n\n const stats = statsByTool[call.name];\n stats.totalCalls++;\n stats.totalDuration += call.duration;\n\n if (call.success) {\n stats.successfulCalls++;\n } else {\n stats.failedCalls++;\n if (call.error) {\n const existingError = stats.commonErrors.find(e => e.error === call.error);\n if (existingError) {\n existingError.count++;\n } else {\n stats.commonErrors.push({ error: call.error, count: 1 });\n }\n }\n }\n\n stats.minDuration = Math.min(stats.minDuration, call.duration);\n stats.maxDuration = Math.max(stats.maxDuration, call.duration);\n stats.firstCall = call.timestamp < stats.firstCall ? call.timestamp : stats.firstCall;\n stats.lastCall = call.timestamp > stats.lastCall ? call.timestamp : stats.lastCall;\n\n // Update usage pattern\n const hour = call.timestamp.getHours();\n stats.usagePattern[hour].calls++;\n }\n\n // Calculate derived statistics\n for (const stats of Object.values(statsByTool)) {\n stats.successRate = stats.totalCalls > 0 ? stats.successfulCalls / stats.totalCalls : 0;\n stats.avgDuration = stats.totalCalls > 0 ? stats.totalDuration / stats.totalCalls : 0;\n\n // Calculate percentiles\n const durations = toolCalls\n .filter(call => call.name === stats.name)\n .map(call => call.duration);\n\n const percentiles = this.calculatePercentiles(durations, [95, 99]);\n stats.p95Duration = percentiles.p95 || 0;\n stats.p99Duration = percentiles.p99 || 0;\n\n // Sort common errors by frequency\n stats.commonErrors.sort((a, b) => b.count - a.count);\n stats.commonErrors = stats.commonErrors.slice(0, 5); // Keep top 5\n }\n\n return statsByTool;\n }\n\n /**\n * Generate performance recommendations based on metrics\n * @param sessionMetrics - Array of session metrics\n * @param toolStatistics - Tool call statistics\n * @param systemMetrics - System metrics\n * @returns Array of performance recommendations\n */\n static generateRecommendations(\n sessionMetrics: SessionMetrics[],\n toolStatistics: Record<string, ToolCallStatistics>,\n systemMetrics: SystemMetrics\n ): PerformanceRecommendation[] {\n const recommendations: PerformanceRecommendation[] = [];\n\n // Check for slow tool calls\n for (const [toolName, stats] of Object.entries(toolStatistics)) {\n if (stats.avgDuration > 5000) { // 5+ seconds average\n recommendations.push({\n id: uuidv4(),\n type: 'performance',\n severity: stats.avgDuration > 10000 ? 'high' : 'medium',\n title: `Slow ${toolName} tool calls detected`,\n description: `The ${toolName} tool has an average execution time of ${(stats.avgDuration / 1000).toFixed(1)} seconds, which may impact overall performance.`,\n impact: `Each call to ${toolName} adds significant latency to iterations`,\n action: `Consider optimizing ${toolName} parameters, implementing caching, or using alternative approaches for this tool`,\n triggeringMetrics: {\n avgDuration: stats.avgDuration,\n totalCalls: stats.totalCalls,\n },\n timestamp: new Date(),\n });\n }\n\n // Check for high failure rates\n if (stats.totalCalls > 10 && stats.successRate < 0.8) {\n recommendations.push({\n id: uuidv4(),\n type: 'reliability',\n severity: stats.successRate < 0.5 ? 'critical' : 'high',\n title: `High failure rate for ${toolName} tool`,\n description: `The ${toolName} tool has a ${(stats.successRate * 100).toFixed(1)}% success rate, indicating reliability issues.`,\n impact: `Frequent failures may cause iteration retries and extended execution times`,\n action: `Review ${toolName} error patterns and improve error handling or tool configuration`,\n triggeringMetrics: {\n successRate: stats.successRate,\n failedCalls: stats.failedCalls,\n totalCalls: stats.totalCalls,\n },\n timestamp: new Date(),\n });\n }\n }\n\n // Check memory usage\n if (systemMetrics.memoryUsage.percentage > 90) {\n recommendations.push({\n id: uuidv4(),\n type: 'performance',\n severity: 'critical',\n title: 'High memory usage detected',\n description: `System memory usage is at ${systemMetrics.memoryUsage.percentage.toFixed(1)}%, which may cause performance degradation.`,\n impact: 'High memory usage can lead to swapping, slower performance, and potential system instability',\n action: 'Consider increasing system memory, optimizing memory usage patterns, or implementing memory cleanup strategies',\n triggeringMetrics: {\n memoryPercentage: systemMetrics.memoryUsage.percentage,\n memoryUsed: systemMetrics.memoryUsage.used,\n },\n timestamp: new Date(),\n });\n }\n\n // Check session patterns\n const avgSessionDuration = sessionMetrics.length > 0\n ? sessionMetrics.reduce((sum, s) => sum + s.duration, 0) / sessionMetrics.length\n : 0;\n\n if (avgSessionDuration > 300000) { // 5+ minutes average\n recommendations.push({\n id: uuidv4(),\n type: 'efficiency',\n severity: 'medium',\n title: 'Long session durations detected',\n description: `Average session duration is ${(avgSessionDuration / 60000).toFixed(1)} minutes, which may indicate inefficient task execution.`,\n impact: 'Long sessions may indicate complex tasks or inefficient execution patterns',\n action: 'Review task complexity, consider breaking down large tasks, or optimize subagent configurations',\n triggeringMetrics: {\n avgSessionDuration,\n totalSessions: sessionMetrics.length,\n },\n timestamp: new Date(),\n });\n }\n\n return recommendations;\n }\n}\n\n/**\n * Comprehensive metrics collector for juno-task-ts\n */\nexport class MetricsCollector extends EventEmitter {\n private performanceTracker: PerformanceTracker;\n private toolCallMetrics: ToolCallMetrics[] = [];\n private sessionMetrics: Map<string, SessionMetrics> = new Map();\n private systemMetrics: SystemMetrics;\n private isCollecting: boolean = false;\n private startTime: number;\n\n constructor() {\n super();\n this.performanceTracker = new PerformanceTracker();\n this.startTime = performance.now();\n this.systemMetrics = this.initializeSystemMetrics();\n }\n\n /**\n * Initialize system metrics\n * @returns Initial system metrics\n */\n private initializeSystemMetrics(): SystemMetrics {\n const memoryUsage = process.memoryUsage();\n const totalMem = totalmem();\n const freeMem = freemem();\n const usedMem = totalMem - freeMem;\n\n return {\n timestamp: new Date(),\n startupTime: 0, // Will be set when collection starts\n configLoadTime: 0,\n templateGenerationTime: 0,\n cliResponseTime: 0,\n cpuUsage: 0,\n memoryUsage: {\n total: totalMem,\n free: freeMem,\n used: usedMem,\n percentage: (usedMem / totalMem) * 100,\n heapUsed: memoryUsage.heapUsed,\n heapTotal: memoryUsage.heapTotal,\n external: memoryUsage.external,\n },\n networkMetrics: {\n totalRequests: 0,\n successfulRequests: 0,\n failedRequests: 0,\n avgResponseTime: 0,\n totalBytesTransferred: 0,\n },\n fileSystemMetrics: {\n totalOperations: 0,\n readOperations: 0,\n writeOperations: 0,\n avgOperationTime: 0,\n },\n };\n }\n\n /**\n * Start metrics collection\n */\n startCollection(): void {\n if (this.isCollecting) {\n return;\n }\n\n this.isCollecting = true;\n this.systemMetrics.startupTime = performance.now() - this.startTime;\n\n // Set up periodic system metrics collection\n this.startSystemMetricsCollection();\n\n this.emit('collection_started', { timestamp: new Date() });\n }\n\n /**\n * Stop metrics collection\n */\n stopCollection(): void {\n if (!this.isCollecting) {\n return;\n }\n\n this.isCollecting = false;\n this.emit('collection_stopped', { timestamp: new Date() });\n }\n\n /**\n * Start system metrics collection interval\n */\n private startSystemMetricsCollection(): void {\n const collectSystemMetrics = () => {\n if (!this.isCollecting) {\n return;\n }\n\n this.updateSystemMetrics();\n\n // Collect every 30 seconds\n setTimeout(collectSystemMetrics, 30000);\n };\n\n // Start collection after initial delay\n setTimeout(collectSystemMetrics, 1000);\n }\n\n /**\n * Update system metrics\n */\n private updateSystemMetrics(): void {\n const memoryUsage = process.memoryUsage();\n const totalMem = totalmem();\n const freeMem = freemem();\n const usedMem = totalMem - freeMem;\n\n this.systemMetrics = {\n ...this.systemMetrics,\n timestamp: new Date(),\n memoryUsage: {\n total: totalMem,\n free: freeMem,\n used: usedMem,\n percentage: (usedMem / totalMem) * 100,\n heapUsed: memoryUsage.heapUsed,\n heapTotal: memoryUsage.heapTotal,\n external: memoryUsage.external,\n },\n };\n\n this.emit('system_metrics_updated', this.systemMetrics);\n }\n\n /**\n * Record tool call metrics\n * @param metrics - Tool call metrics to record\n */\n recordToolCall(metrics: Omit<ToolCallMetrics, 'callId' | 'timestamp'>): void {\n const toolCallMetrics: ToolCallMetrics = {\n ...metrics,\n callId: uuidv4(),\n timestamp: new Date(),\n };\n\n this.toolCallMetrics.push(toolCallMetrics);\n\n // Update network metrics if this was a network call\n if (toolCallMetrics.networkLatency !== undefined) {\n this.systemMetrics.networkMetrics.totalRequests++;\n if (toolCallMetrics.success) {\n this.systemMetrics.networkMetrics.successfulRequests++;\n } else {\n this.systemMetrics.networkMetrics.failedRequests++;\n }\n }\n\n this.emit('tool_call_recorded', toolCallMetrics);\n }\n\n /**\n * Start session metrics tracking\n * @param sessionId - Session identifier\n * @param subagent - Subagent type\n * @param workingDirectory - Working directory\n * @param model - Model name (optional)\n */\n startSession(sessionId: string, subagent: SubagentType, workingDirectory: string, model?: string): void {\n const sessionMetrics: SessionMetrics = {\n sessionId,\n startTime: new Date(),\n duration: 0,\n status: 'running',\n iterations: 0,\n toolCalls: 0,\n successCount: 0,\n errorCount: 0,\n warningCount: 0,\n successRate: 0,\n avgIterationDuration: 0,\n avgToolCallDuration: 0,\n totalThinkingTime: 0,\n peakMemoryUsage: process.memoryUsage().heapUsed,\n avgMemoryUsage: process.memoryUsage().heapUsed,\n currentMemoryUsage: process.memoryUsage().heapUsed,\n subagent,\n model,\n workingDirectory,\n };\n\n this.sessionMetrics.set(sessionId, sessionMetrics);\n this.emit('session_started', sessionMetrics);\n }\n\n /**\n * Update session metrics\n * @param sessionId - Session identifier\n * @param updates - Metrics updates\n */\n updateSession(sessionId: string, updates: Partial<SessionMetrics>): void {\n const session = this.sessionMetrics.get(sessionId);\n if (!session) {\n return;\n }\n\n Object.assign(session, updates);\n\n // Update derived metrics\n if (session.endTime) {\n session.duration = session.endTime.getTime() - session.startTime.getTime();\n }\n\n // Update memory usage\n const currentMemory = process.memoryUsage().heapUsed;\n session.currentMemoryUsage = currentMemory;\n session.peakMemoryUsage = Math.max(session.peakMemoryUsage, currentMemory);\n\n this.emit('session_updated', session);\n }\n\n /**\n * End session metrics tracking\n * @param sessionId - Session identifier\n * @param status - Final session status\n */\n endSession(sessionId: string, status: SessionStatus): void {\n const session = this.sessionMetrics.get(sessionId);\n if (!session) {\n return;\n }\n\n session.endTime = new Date();\n session.status = status;\n session.duration = session.endTime.getTime() - session.startTime.getTime();\n\n // Calculate session-specific tool call metrics\n const sessionToolCalls = this.toolCallMetrics.filter(tc => tc.sessionId === sessionId);\n session.toolCalls = sessionToolCalls.length;\n\n if (sessionToolCalls.length > 0) {\n session.avgToolCallDuration = sessionToolCalls.reduce((sum, tc) => sum + tc.duration, 0) / sessionToolCalls.length;\n session.successCount = sessionToolCalls.filter(tc => tc.success).length;\n session.errorCount = sessionToolCalls.filter(tc => !tc.success).length;\n session.successRate = session.successCount / sessionToolCalls.length;\n }\n\n this.emit('session_ended', session);\n }\n\n /**\n * Record performance timing\n * @param operationName - Name of the operation\n * @param duration - Duration in milliseconds\n * @param metadata - Additional metadata\n */\n recordPerformanceTiming(operationName: string, duration: number, metadata?: Record<string, any>): void {\n // Update system metrics based on operation type\n switch (operationName) {\n case 'config_load':\n this.systemMetrics.configLoadTime = duration;\n break;\n case 'template_generation':\n this.systemMetrics.templateGenerationTime = duration;\n break;\n case 'cli_response':\n this.systemMetrics.cliResponseTime = duration;\n break;\n }\n\n this.emit('performance_recorded', {\n operationName,\n duration,\n metadata,\n timestamp: new Date(),\n });\n }\n\n /**\n * Get comprehensive analytics report\n * @param timeRange - Optional time range for the report\n * @returns Analytics report\n */\n getAnalyticsReport(timeRange?: { start: Date; end: Date }): AnalyticsReport {\n let filteredToolCalls = this.toolCallMetrics;\n let filteredSessions = Array.from(this.sessionMetrics.values());\n\n // Apply time range filter if provided\n if (timeRange) {\n filteredToolCalls = this.toolCallMetrics.filter(\n tc => tc.timestamp >= timeRange.start && tc.timestamp <= timeRange.end\n );\n filteredSessions = filteredSessions.filter(\n s => s.startTime >= timeRange.start && s.startTime <= timeRange.end\n );\n }\n\n // Calculate tool statistics\n const toolStatistics = StatisticsCalculator.calculateToolStatistics(filteredToolCalls);\n\n // Calculate session statistics by subagent\n const sessionStatsBySubagent: Record<SubagentType, any> = {} as any;\n for (const session of filteredSessions) {\n if (!sessionStatsBySubagent[session.subagent]) {\n sessionStatsBySubagent[session.subagent] = {\n count: 0,\n totalDuration: 0,\n totalIterations: 0,\n successfulSessions: 0,\n };\n }\n\n const stats = sessionStatsBySubagent[session.subagent];\n stats.count++;\n stats.totalDuration += session.duration;\n stats.totalIterations += session.iterations;\n if (session.status === 'completed') {\n stats.successfulSessions++;\n }\n }\n\n // Calculate derived statistics\n for (const stats of Object.values(sessionStatsBySubagent)) {\n stats.avgDuration = stats.count > 0 ? stats.totalDuration / stats.count : 0;\n stats.avgIterations = stats.count > 0 ? stats.totalIterations / stats.count : 0;\n stats.successRate = stats.count > 0 ? stats.successfulSessions / stats.count : 0;\n delete stats.totalDuration;\n delete stats.totalIterations;\n delete stats.successfulSessions;\n }\n\n // Generate performance trends (simplified for now)\n const performanceTrends = {\n iterationDurationTrend: [],\n successRateTrend: [],\n errorRateTrend: [],\n };\n\n // Generate recommendations\n const recommendations = StatisticsCalculator.generateRecommendations(\n filteredSessions,\n toolStatistics,\n this.systemMetrics\n );\n\n return {\n timestamp: new Date(),\n timeRange: timeRange || {\n start: new Date(0),\n end: new Date(),\n },\n summary: {\n totalSessions: filteredSessions.length,\n totalIterations: filteredSessions.reduce((sum, s) => sum + s.iterations, 0),\n totalToolCalls: filteredToolCalls.length,\n avgSessionDuration: filteredSessions.length > 0\n ? filteredSessions.reduce((sum, s) => sum + s.duration, 0) / filteredSessions.length\n : 0,\n overallSuccessRate: filteredToolCalls.length > 0\n ? filteredToolCalls.filter(tc => tc.success).length / filteredToolCalls.length\n : 0,\n totalErrors: filteredToolCalls.filter(tc => !tc.success).length,\n },\n toolStatistics,\n sessionStatsBySubagent,\n performanceTrends,\n systemPerformance: this.systemMetrics,\n recommendations,\n resourceUsage: {\n peakMemory: Math.max(...filteredSessions.map(s => s.peakMemoryUsage)),\n avgMemory: filteredSessions.length > 0\n ? filteredSessions.reduce((sum, s) => sum + s.avgMemoryUsage, 0) / filteredSessions.length\n : 0,\n cpuUtilization: this.systemMetrics.cpuUsage,\n networkUtilization: this.systemMetrics.networkMetrics.totalRequests,\n },\n };\n }\n\n /**\n * Get tool call statistics\n * @returns Tool call statistics by tool name\n */\n getToolStatistics(): Record<string, ToolCallStatistics> {\n return StatisticsCalculator.calculateToolStatistics(this.toolCallMetrics);\n }\n\n /**\n * Get session metrics by ID\n * @param sessionId - Session identifier\n * @returns Session metrics or undefined\n */\n getSessionMetrics(sessionId: string): SessionMetrics | undefined {\n return this.sessionMetrics.get(sessionId);\n }\n\n /**\n * Get all session metrics\n * @returns Array of all session metrics\n */\n getAllSessionMetrics(): SessionMetrics[] {\n return Array.from(this.sessionMetrics.values());\n }\n\n /**\n * Get current system metrics\n * @returns Current system metrics\n */\n getSystemMetrics(): SystemMetrics {\n this.updateSystemMetrics();\n return this.systemMetrics;\n }\n\n /**\n * Clear all metrics data\n */\n clearMetrics(): void {\n this.toolCallMetrics = [];\n this.sessionMetrics.clear();\n this.performanceTracker.clear();\n this.systemMetrics = this.initializeSystemMetrics();\n this.emit('metrics_cleared', { timestamp: new Date() });\n }\n\n /**\n * Dispose of the metrics collector\n */\n dispose(): void {\n this.stopCollection();\n this.performanceTracker.dispose();\n this.removeAllListeners();\n }\n}\n\n/**\n * Metrics reporter for formatted output and exports\n */\nexport class MetricsReporter {\n private metricsCollector: MetricsCollector;\n\n constructor(metricsCollector: MetricsCollector) {\n this.metricsCollector = metricsCollector;\n }\n\n /**\n * Generate a formatted verbose statistics report\n * @param sessionId - Optional specific session ID\n * @returns Formatted statistics string\n */\n generateVerboseReport(sessionId?: string): string {\n const report: string[] = [];\n\n if (sessionId) {\n const sessionMetrics = this.metricsCollector.getSessionMetrics(sessionId);\n if (sessionMetrics) {\n report.push(this.formatSessionReport(sessionMetrics));\n }\n } else {\n const analyticsReport = this.metricsCollector.getAnalyticsReport();\n report.push(this.formatAnalyticsReport(analyticsReport));\n }\n\n return report.join('\\n');\n }\n\n /**\n * Format session-specific report\n * @param session - Session metrics\n * @returns Formatted session report\n */\n private formatSessionReport(session: SessionMetrics): string {\n const lines = [\n '═══════════════════════════════════════════════════════════════════════════════',\n ' SESSION PERFORMANCE REPORT ',\n '═══════════════════════════════════════════════════════════════════════════════',\n '',\n `Session ID: ${session.sessionId}`,\n `Subagent: ${session.subagent}${session.model ? ` (${session.model})` : ''}`,\n `Status: ${session.status.toUpperCase()}`,\n `Duration: ${this.formatDuration(session.duration)}`,\n `Working Directory: ${session.workingDirectory}`,\n '',\n '─── EXECUTION METRICS ─────────────────────────────────────────────────────────',\n `Iterations: ${session.iterations}`,\n `Tool Calls: ${session.toolCalls}`,\n `Success Rate: ${(session.successRate * 100).toFixed(1)}%`,\n `Avg Iteration Duration: ${this.formatDuration(session.avgIterationDuration)}`,\n `Avg Tool Call Duration: ${this.formatDuration(session.avgToolCallDuration)}`,\n '',\n '─── MEMORY USAGE ──────────────────────────────────────────────────────────────',\n `Peak Memory: ${this.formatBytes(session.peakMemoryUsage)}`,\n `Average Memory: ${this.formatBytes(session.avgMemoryUsage)}`,\n `Current Memory: ${this.formatBytes(session.currentMemoryUsage)}`,\n '',\n '─── ERROR ANALYSIS ───────────────────────────────────────────────────────────',\n `Total Errors: ${session.errorCount}`,\n `Total Warnings: ${session.warningCount}`,\n `Error Rate: ${session.toolCalls > 0 ? ((session.errorCount / session.toolCalls) * 100).toFixed(1) : 0}%`,\n ];\n\n return lines.join('\\n');\n }\n\n /**\n * Format comprehensive analytics report\n * @param analytics - Analytics report\n * @returns Formatted analytics report\n */\n private formatAnalyticsReport(analytics: AnalyticsReport): string {\n const lines = [\n '═══════════════════════════════════════════════════════════════════════════════',\n ' COMPREHENSIVE ANALYTICS REPORT ',\n '═══════════════════════════════════════════════════════════════════════════════',\n '',\n `Report Generated: ${analytics.timestamp.toISOString()}`,\n `Time Range: ${analytics.timeRange.start.toISOString()} to ${analytics.timeRange.end.toISOString()}`,\n '',\n '─── SUMMARY STATISTICS ────────────────────────────────────────────────────────',\n `Total Sessions: ${analytics.summary.totalSessions}`,\n `Total Iterations: ${analytics.summary.totalIterations}`,\n `Total Tool Calls: ${analytics.summary.totalToolCalls}`,\n `Average Session Duration: ${this.formatDuration(analytics.summary.avgSessionDuration)}`,\n `Overall Success Rate: ${(analytics.summary.overallSuccessRate * 100).toFixed(1)}%`,\n `Total Errors: ${analytics.summary.totalErrors}`,\n '',\n '─── TOOL USAGE STATISTICS ─────────────────────────────────────────────────────',\n ];\n\n // Add tool statistics\n const sortedTools = Object.values(analytics.toolStatistics)\n .sort((a, b) => b.totalCalls - a.totalCalls);\n\n for (const tool of sortedTools.slice(0, 10)) { // Top 10 tools\n lines.push(\n `${tool.name}:`,\n ` Calls: ${tool.totalCalls} | Success Rate: ${(tool.successRate * 100).toFixed(1)}%`,\n ` Avg Duration: ${this.formatDuration(tool.avgDuration)} | P95: ${this.formatDuration(tool.p95Duration)}`,\n ''\n );\n }\n\n lines.push(\n '─── SYSTEM PERFORMANCE ────────────────────────────────────────────────────────',\n `Memory Usage: ${analytics.systemPerformance.memoryUsage.percentage.toFixed(1)}% (${this.formatBytes(analytics.systemPerformance.memoryUsage.used)})`,\n `CPU Usage: ${analytics.systemPerformance.cpuUsage.toFixed(1)}%`,\n `Network Requests: ${analytics.systemPerformance.networkMetrics.totalRequests}`,\n `File System Operations: ${analytics.systemPerformance.fileSystemMetrics.totalOperations}`,\n ''\n );\n\n // Add recommendations\n if (analytics.recommendations.length > 0) {\n lines.push('─── PERFORMANCE RECOMMENDATIONS ───────────────────────────────────────────────');\n for (const rec of analytics.recommendations) {\n lines.push(\n `[${rec.severity.toUpperCase()}] ${rec.title}`,\n ` ${rec.description}`,\n ` Action: ${rec.action}`,\n ''\n );\n }\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Export metrics to file\n * @param options - Export options\n */\n async exportMetrics(options: MetricsExportOptions): Promise<void> {\n const analyticsReport = this.metricsCollector.getAnalyticsReport(options.timeRange);\n\n let exportData: string;\n\n switch (options.format) {\n case 'json':\n exportData = JSON.stringify(analyticsReport, null, 2);\n break;\n\n case 'csv':\n exportData = this.convertToCSV(analyticsReport);\n break;\n\n case 'yaml':\n // Would require yaml library\n throw new Error('YAML export not yet implemented');\n\n default:\n throw new Error(`Unsupported export format: ${options.format}`);\n }\n\n // Ensure directory exists\n await fsPromises.mkdir(path.dirname(options.outputPath), { recursive: true });\n\n // Write file\n await fsPromises.writeFile(options.outputPath, exportData, 'utf-8');\n }\n\n /**\n * Convert analytics report to CSV format\n * @param report - Analytics report\n * @returns CSV string\n */\n private convertToCSV(report: AnalyticsReport): string {\n const lines = [];\n\n // Tool statistics CSV\n lines.push('Tool Name,Total Calls,Success Rate,Avg Duration,P95 Duration,P99 Duration');\n for (const [name, stats] of Object.entries(report.toolStatistics)) {\n lines.push(\n `${name},${stats.totalCalls},${stats.successRate},${stats.avgDuration},${stats.p95Duration},${stats.p99Duration}`\n );\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format duration in human-readable format\n * @param milliseconds - Duration in milliseconds\n * @returns Formatted duration string\n */\n private formatDuration(milliseconds: number): string {\n if (milliseconds < 1000) {\n return `${milliseconds.toFixed(0)}ms`;\n } else if (milliseconds < 60000) {\n return `${(milliseconds / 1000).toFixed(1)}s`;\n } else if (milliseconds < 3600000) {\n const minutes = Math.floor(milliseconds / 60000);\n const seconds = Math.floor((milliseconds % 60000) / 1000);\n return `${minutes}m ${seconds}s`;\n } else {\n const hours = Math.floor(milliseconds / 3600000);\n const minutes = Math.floor((milliseconds % 3600000) / 60000);\n return `${hours}h ${minutes}m`;\n }\n }\n\n /**\n * Format bytes in human-readable format\n * @param bytes - Number of bytes\n * @returns Formatted bytes string\n */\n private formatBytes(bytes: number): string {\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(1)} ${units[unitIndex]}`;\n }\n}\n\n/**\n * Create a metrics collector instance\n * Convenience function for creating a metrics collector\n *\n * @returns Configured metrics collector instance\n *\n * @example\n * ```typescript\n * const metricsCollector = createMetricsCollector();\n * metricsCollector.startCollection();\n *\n * // Record session\n * metricsCollector.startSession('session1', 'claude', '/path/to/project');\n *\n * // Record tool call\n * metricsCollector.recordToolCall({\n * name: 'file_read',\n * duration: 150,\n * success: true,\n * sessionId: 'session1',\n * iteration: 1,\n * subagent: 'claude'\n * });\n * ```\n */\nexport function createMetricsCollector(): MetricsCollector {\n return new MetricsCollector();\n}\n\n/**\n * Create a metrics reporter instance\n * Convenience function for creating a metrics reporter\n *\n * @param metricsCollector - Metrics collector instance\n * @returns Configured metrics reporter instance\n */\nexport function createMetricsReporter(metricsCollector: MetricsCollector): MetricsReporter {\n return new MetricsReporter(metricsCollector);\n}\n\n// Export all types and interfaces for external use\nexport type {\n PerformanceTiming,\n ToolCallMetrics,\n SessionMetrics,\n SystemMetrics,\n ToolCallStatistics,\n PerformanceRecommendation,\n AnalyticsReport,\n MetricsExportFormat,\n MetricsExportOptions,\n};","/**\n * Validation Utilities Module for juno-task-ts\n *\n * Provides comprehensive validation utilities using Zod schemas for the juno-task-ts CLI tool.\n * This module includes core validation functions, Zod schemas, type guards, input sanitization,\n * validation error handling, and configuration validation.\n *\n * @module utils/validation\n */\n\nimport { z } from 'zod';\nimport * as path from 'node:path';\nimport { promises as fsPromises } from 'node:fs';\nimport type {\n SubagentType,\n SessionStatus,\n LogLevel,\n JunoTaskConfig\n} from '../types/index';\nimport { JunoTaskConfigSchema, validateConfig as coreValidateConfig } from '../core/config';\nimport { SUBAGENT_ALIASES } from '../cli/types';\n\n// ============================================================================\n// Custom Error Classes\n// ============================================================================\n\n/**\n * Validation error with detailed error messages and context\n */\nexport class ValidationError extends Error {\n constructor(\n message: string,\n public field?: string,\n public value?: unknown,\n public suggestions?: string[]\n ) {\n super(message);\n this.name = 'ValidationError';\n }\n}\n\n// ============================================================================\n// Zod Schemas\n// ============================================================================\n\n/**\n * Schema for validating subagent types with alias support\n */\nexport const SubagentSchema = z.string()\n .transform((value) => {\n // Check if it's a direct match first\n if (['claude', 'cursor', 'codex', 'gemini'].includes(value)) {\n return value as SubagentType;\n }\n\n // Check aliases\n const normalized = SUBAGENT_ALIASES[value];\n if (normalized) {\n return normalized;\n }\n\n throw new z.ZodError([{\n code: z.ZodIssueCode.invalid_enum_value,\n options: ['claude', 'cursor', 'codex', 'gemini'],\n received: value,\n path: [],\n message: `Invalid subagent: ${value}. Valid options: claude, cursor, codex, gemini`\n }]);\n })\n .refine((value): value is SubagentType =>\n ['claude', 'cursor', 'codex', 'gemini'].includes(value), {\n message: 'Invalid subagent type'\n });\n\n/**\n * Schema for validating log levels\n */\nexport const LogLevelSchema = z.enum(['error', 'warn', 'info', 'debug', 'trace'], {\n errorMap: (_issue, ctx) => ({\n message: `Invalid log level: ${ctx.data}. Valid options: error, warn, info, debug, trace`\n })\n});\n\n/**\n * Schema for validating session status\n */\nexport const SessionStatusSchema = z.enum(['running', 'completed', 'failed', 'cancelled'], {\n errorMap: (_issue, ctx) => ({\n message: `Invalid session status: ${ctx.data}. Valid options: running, completed, failed, cancelled`\n })\n});\n\n/**\n * Schema for validating iteration counts\n */\nexport const IterationsSchema = z.number()\n .int('Iterations must be an integer')\n .refine(\n (value) => value === -1 || value > 0,\n 'Iterations must be a positive integer or -1 for infinite'\n )\n .transform((value) => value === -1 ? Infinity : value);\n\n/**\n * Schema for validating file paths with existence checks\n */\nexport const FilePathSchema = z.string()\n .min(1, 'File path cannot be empty')\n .transform((value) => path.resolve(value))\n .refine(async (filePath) => {\n try {\n const stats = await fsPromises.stat(filePath);\n return stats.isFile();\n } catch {\n return false;\n }\n }, 'File does not exist or is not accessible');\n\n/**\n * Schema for validating directory paths with existence checks\n */\nexport const DirectoryPathSchema = z.string()\n .min(1, 'Directory path cannot be empty')\n .transform((value) => path.resolve(value))\n .refine(async (dirPath) => {\n try {\n const stats = await fsPromises.stat(dirPath);\n return stats.isDirectory();\n } catch {\n return false;\n }\n }, 'Directory does not exist or is not accessible');\n\n/**\n * Schema for validating Git URLs\n */\nexport const GitUrlSchema = z.string()\n .min(1, 'Git URL cannot be empty')\n .refine((url) => {\n // Support various Git URL formats\n const patterns = [\n /^https?:\\/\\/.+\\.git$/,\n /^git@.+:.+\\.git$/,\n /^ssh:\\/\\/git@.+\\/.+\\.git$/,\n /^https?:\\/\\/github\\.com\\/.+\\/.+$/,\n /^https?:\\/\\/gitlab\\.com\\/.+\\/.+$/,\n /^https?:\\/\\/bitbucket\\.org\\/.+\\/.+$/\n ];\n\n return patterns.some(pattern => pattern.test(url));\n }, 'Invalid Git URL format');\n\n/**\n * Schema for validating session IDs\n */\nexport const SessionIdSchema = z.string()\n .regex(\n /^[a-zA-Z0-9_-]{8,}$/,\n 'Session ID must be at least 8 characters and contain only alphanumeric characters, underscores, and hyphens'\n );\n\n/**\n * Schema for validating model names (subagent-specific)\n */\nexport const ModelSchema = z.string()\n .min(1, 'Model name cannot be empty')\n .refine((model) => {\n // Basic validation - specific models would be validated by subagents\n return /^[a-zA-Z0-9._-]+$/.test(model);\n }, 'Model name contains invalid characters');\n\n/**\n * Schema for CLI options validation\n */\nexport const CLIOptionsSchema = z.object({\n subagent: SubagentSchema.optional(),\n prompt: z.string().optional(),\n cwd: z.string().optional(),\n maxIterations: IterationsSchema.optional(),\n model: ModelSchema.optional(),\n interactive: z.boolean().optional(),\n verbose: z.boolean().optional(),\n quiet: z.boolean().optional(),\n logLevel: LogLevelSchema.optional(),\n logFile: z.string().optional(),\n config: z.string().optional(),\n noColor: z.boolean().optional()\n}).strict();\n\n/**\n * Schema for runtime configuration validation\n */\nexport const ConfigValidationSchema = JunoTaskConfigSchema;\n\n// ============================================================================\n// Core Validation Functions\n// ============================================================================\n\n/**\n * Validate and normalize subagent names including aliases\n *\n * @param subagent - The subagent name to validate\n * @returns Normalized subagent name\n * @throws ValidationError if invalid\n *\n * @example\n * ```typescript\n * const subagent = validateSubagent('claude-code'); // Returns 'claude'\n * const subagent2 = validateSubagent('gemini'); // Returns 'gemini'\n * ```\n */\nexport function validateSubagent(subagent: string): SubagentType {\n try {\n return SubagentSchema.parse(subagent);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const suggestions = [\n 'Valid subagents: claude, cursor, codex, gemini',\n 'Valid aliases: claude-code, claude_code, gemini-cli, cursor-agent'\n ];\n throw new ValidationError(\n error.errors[0]?.message || 'Invalid subagent',\n 'subagent',\n subagent,\n suggestions\n );\n }\n throw error;\n }\n}\n\n/**\n * Validate model names for specific subagents\n *\n * @param model - The model name to validate\n * @param subagent - The subagent the model is for (optional, for context)\n * @returns Validated model name\n * @throws ValidationError if invalid\n */\nexport function validateModel(model: string, subagent?: SubagentType): string {\n try {\n const validated = ModelSchema.parse(model);\n\n // Additional subagent-specific validation could be added here\n if (subagent === 'claude' && !model.includes('claude') && !model.includes('sonnet') && !model.includes('haiku')) {\n console.warn(`Warning: Model '${model}' may not be valid for Claude subagent`);\n }\n\n return validated;\n } catch (error) {\n if (error instanceof z.ZodError) {\n const suggestions = [\n 'Model names should contain only alphanumeric characters, dots, underscores, and hyphens',\n 'Check the subagent documentation for valid model names'\n ];\n throw new ValidationError(\n error.errors[0]?.message || 'Invalid model name',\n 'model',\n model,\n suggestions\n );\n }\n throw error;\n }\n}\n\n/**\n * Validate iteration counts (positive integers or -1 for infinite)\n *\n * @param iterations - The iteration count to validate\n * @returns Validated iteration count (Infinity for -1)\n * @throws ValidationError if invalid\n */\nexport function validateIterations(iterations: number): number {\n try {\n return IterationsSchema.parse(iterations);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const suggestions = [\n 'Use a positive integer (1, 2, 3, etc.)',\n 'Use -1 for unlimited iterations'\n ];\n throw new ValidationError(\n error.errors[0]?.message || 'Invalid iteration count',\n 'iterations',\n iterations,\n suggestions\n );\n }\n throw error;\n }\n}\n\n/**\n * Validate log level strings\n *\n * @param logLevel - The log level to validate\n * @returns Validated log level\n * @throws ValidationError if invalid\n */\nexport function validateLogLevel(logLevel: string): LogLevel {\n try {\n return LogLevelSchema.parse(logLevel);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const suggestions = [\n 'Valid log levels: error, warn, info, debug, trace',\n 'Use \"info\" for normal operation, \"debug\" for troubleshooting'\n ];\n throw new ValidationError(\n error.errors[0]?.message || 'Invalid log level',\n 'logLevel',\n logLevel,\n suggestions\n );\n }\n throw error;\n }\n}\n\n/**\n * Validate file and directory paths with existence checks\n *\n * @param filePath - The path to validate\n * @param type - Whether to check for 'file' or 'directory'\n * @returns Promise resolving to validated absolute path\n * @throws ValidationError if invalid or not accessible\n */\nexport async function validatePaths(\n filePath: string,\n type: 'file' | 'directory' = 'file'\n): Promise<string> {\n try {\n if (type === 'file') {\n return await FilePathSchema.parseAsync(filePath);\n } else {\n return await DirectoryPathSchema.parseAsync(filePath);\n }\n } catch (error) {\n if (error instanceof z.ZodError) {\n const suggestions = [\n 'Check that the path exists and is accessible',\n 'Use absolute paths to avoid ambiguity',\n `Ensure the path points to a ${type}`\n ];\n throw new ValidationError(\n error.errors[0]?.message || `Invalid ${type} path`,\n 'path',\n filePath,\n suggestions\n );\n }\n throw error;\n }\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard for SubagentType\n *\n * @param value - Value to check\n * @returns True if value is a valid SubagentType\n */\nexport function isValidSubagent(value: unknown): value is SubagentType {\n return typeof value === 'string' &&\n ['claude', 'cursor', 'codex', 'gemini'].includes(value);\n}\n\n/**\n * Type guard for SessionStatus\n *\n * @param value - Value to check\n * @returns True if value is a valid SessionStatus\n */\nexport function isValidSessionStatus(value: unknown): value is SessionStatus {\n return typeof value === 'string' &&\n ['running', 'completed', 'failed', 'cancelled'].includes(value);\n}\n\n/**\n * Type guard for LogLevel\n *\n * @param value - Value to check\n * @returns True if value is a valid LogLevel\n */\nexport function isValidLogLevel(value: unknown): value is LogLevel {\n return typeof value === 'string' &&\n ['error', 'warn', 'info', 'debug', 'trace'].includes(value);\n}\n\n/**\n * File/directory existence validation\n *\n * @param filePath - Path to check\n * @param type - Type of path to check for\n * @returns Promise resolving to true if path exists and is of correct type\n */\nexport async function isValidPath(\n filePath: string,\n type: 'file' | 'directory' = 'file'\n): Promise<boolean> {\n try {\n const resolvedPath = path.resolve(filePath);\n const stats = await fsPromises.stat(resolvedPath);\n return type === 'file' ? stats.isFile() : stats.isDirectory();\n } catch {\n return false;\n }\n}\n\n// ============================================================================\n// Input Sanitization Functions\n// ============================================================================\n\n/**\n * Clean user input for prompts\n *\n * @param text - Raw prompt text\n * @returns Sanitized prompt text\n */\nexport function sanitizePromptText(text: string): string {\n if (typeof text !== 'string') {\n throw new ValidationError('Prompt text must be a string', 'prompt', text);\n }\n\n // Remove potentially dangerous characters but preserve formatting\n return text\n .replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F]/g, '') // Remove control characters except \\n, \\r, \\t\n .replace(/\\r\\n/g, '\\n') // Normalize line endings\n .trim();\n}\n\n/**\n * Normalize and validate file paths\n *\n * @param filePath - Raw file path\n * @returns Sanitized absolute file path\n */\nexport function sanitizeFilePath(filePath: string): string {\n if (typeof filePath !== 'string') {\n throw new ValidationError('File path must be a string', 'filePath', filePath);\n }\n\n // Remove dangerous characters and normalize\n const cleaned = filePath\n .replace(/[\\x00-\\x1F\\x7F]/g, '') // Remove control characters\n .replace(/[<>:\"|?*]/g, '') // Remove invalid filename characters\n .trim();\n\n if (!cleaned) {\n throw new ValidationError('File path cannot be empty after sanitization', 'filePath', filePath);\n }\n\n return path.resolve(cleaned);\n}\n\n/**\n * Validate and normalize git repository URLs\n *\n * @param url - Raw git URL\n * @returns Sanitized git URL\n */\nexport function sanitizeGitUrl(url: string): string {\n if (typeof url !== 'string') {\n throw new ValidationError('Git URL must be a string', 'gitUrl', url);\n }\n\n const cleaned = url.trim();\n\n try {\n GitUrlSchema.parse(cleaned);\n return cleaned;\n } catch (error) {\n if (error instanceof z.ZodError) {\n const suggestions = [\n 'Use HTTPS format: https://github.com/user/repo.git',\n 'Use SSH format: git@github.com:user/repo.git',\n 'Ensure the URL ends with .git for most Git providers'\n ];\n throw new ValidationError(\n 'Invalid Git URL format',\n 'gitUrl',\n url,\n suggestions\n );\n }\n throw error;\n }\n}\n\n/**\n * Validate session ID format\n *\n * @param sessionId - Raw session ID\n * @returns Sanitized session ID\n */\nexport function sanitizeSessionId(sessionId: string): string {\n if (typeof sessionId !== 'string') {\n throw new ValidationError('Session ID must be a string', 'sessionId', sessionId);\n }\n\n try {\n return SessionIdSchema.parse(sessionId.trim());\n } catch (error) {\n if (error instanceof z.ZodError) {\n const suggestions = [\n 'Session IDs must be at least 8 characters long',\n 'Use only letters, numbers, underscores, and hyphens',\n 'Generate a new session ID if needed'\n ];\n throw new ValidationError(\n error.errors[0]?.message || 'Invalid session ID format',\n 'sessionId',\n sessionId,\n suggestions\n );\n }\n throw error;\n }\n}\n\n// ============================================================================\n// Validation Error Handling\n// ============================================================================\n\n/**\n * Format validation error for user-friendly display\n *\n * @param error - ValidationError to format\n * @returns Formatted error message\n */\nexport function formatValidationError(error: ValidationError): string {\n let message = error.message;\n\n if (error.field && error.value !== undefined) {\n message += `\\nField: ${error.field}`;\n message += `\\nValue: ${JSON.stringify(error.value)}`;\n }\n\n if (error.suggestions && error.suggestions.length > 0) {\n message += '\\n\\nSuggestions:';\n error.suggestions.forEach((suggestion, index) => {\n message += `\\n ${index + 1}. ${suggestion}`;\n });\n }\n\n return message;\n}\n\n/**\n * Validation with default value fallback\n *\n * @param validator - Validation function\n * @param value - Value to validate\n * @param defaultValue - Default value if validation fails\n * @param silent - Whether to suppress validation errors\n * @returns Validated value or default\n */\nexport function validateWithFallback<T>(\n validator: (value: unknown) => T,\n value: unknown,\n defaultValue: T,\n silent: boolean = false\n): T {\n try {\n return validator(value);\n } catch (error) {\n if (!silent && error instanceof ValidationError) {\n console.warn(`Validation warning: ${error.message}. Using default value.`);\n }\n return defaultValue;\n }\n}\n\n// ============================================================================\n// Configuration Validation\n// ============================================================================\n\n/**\n * Complete configuration validation\n * Re-exports the core config validation with enhanced error handling\n *\n * @param config - Configuration object to validate\n * @returns Validated configuration\n * @throws ValidationError if validation fails\n */\nexport function validateConfig(config: unknown): JunoTaskConfig {\n try {\n return coreValidateConfig(config);\n } catch (error) {\n if (error instanceof Error) {\n const suggestions = [\n 'Check the configuration file syntax',\n 'Ensure all required fields are present',\n 'Verify data types match the expected format',\n 'Use the default configuration as a template'\n ];\n\n throw new ValidationError(\n `Configuration validation failed: ${error.message}`,\n 'config',\n config,\n suggestions\n );\n }\n throw error;\n }\n}\n\n/**\n * Environment variable validation\n *\n * @param envVars - Environment variables object\n * @returns Validated environment configuration\n */\nexport function validateEnvironmentVars(\n envVars: Record<string, string | undefined>\n): Partial<JunoTaskConfig> {\n const config: Partial<JunoTaskConfig> = {};\n const errors: string[] = [];\n\n // Validate each environment variable\n Object.entries(envVars).forEach(([key, value]) => {\n if (!key.startsWith('JUNO_TASK_') || value === undefined) {\n return;\n }\n\n try {\n switch (key) {\n case 'JUNO_TASK_DEFAULT_SUBAGENT':\n config.defaultSubagent = validateSubagent(value);\n break;\n case 'JUNO_TASK_LOG_LEVEL':\n config.logLevel = validateLogLevel(value);\n break;\n case 'JUNO_TASK_DEFAULT_MAX_ITERATIONS':\n config.defaultMaxIterations = validateIterations(parseInt(value, 10));\n break;\n case 'JUNO_TASK_VERBOSE':\n config.verbose = value.toLowerCase() === 'true';\n break;\n case 'JUNO_TASK_QUIET':\n config.quiet = value.toLowerCase() === 'true';\n break;\n case 'JUNO_TASK_INTERACTIVE':\n config.interactive = value.toLowerCase() === 'true';\n break;\n case 'JUNO_TASK_HEADLESS_MODE':\n config.headlessMode = value.toLowerCase() === 'true';\n break;\n // Add more environment variable validations as needed\n }\n } catch (error) {\n if (error instanceof ValidationError) {\n errors.push(`${key}: ${error.message}`);\n }\n }\n });\n\n if (errors.length > 0) {\n throw new ValidationError(\n `Environment variable validation failed:\\n${errors.join('\\n')}`,\n 'environment',\n envVars,\n ['Check environment variable values', 'Refer to documentation for valid values']\n );\n }\n\n return config;\n}\n\n/**\n * CLI option validation\n *\n * @param options - CLI options object\n * @returns Validated CLI options\n */\nexport function validateCommandOptions(options: Record<string, unknown>): Record<string, unknown> {\n try {\n return CLIOptionsSchema.parse(options);\n } catch (error) {\n if (error instanceof z.ZodError) {\n const errors = error.errors.map(err => {\n const path = err.path.length > 0 ? err.path.join('.') : 'option';\n return `--${path}: ${err.message}`;\n });\n\n const suggestions = [\n 'Check command line option syntax',\n 'Use --help to see valid options',\n 'Verify option values match expected types'\n ];\n\n throw new ValidationError(\n `CLI option validation failed:\\n${errors.join('\\n')}`,\n 'options',\n options,\n suggestions\n );\n }\n throw error;\n }\n}\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Check if a value is defined and not null\n *\n * @param value - Value to check\n * @returns True if value is defined and not null\n */\nexport function isDefined<T>(value: T | undefined | null): value is T {\n return value !== undefined && value !== null;\n}\n\n/**\n * Validate and parse JSON string safely\n *\n * @param jsonString - JSON string to parse\n * @returns Parsed object\n * @throws ValidationError if parsing fails\n */\nexport function validateJson(jsonString: string): unknown {\n try {\n return JSON.parse(jsonString);\n } catch (error) {\n throw new ValidationError(\n 'Invalid JSON format',\n 'json',\n jsonString,\n ['Check for syntax errors', 'Validate quotes and brackets', 'Use a JSON validator']\n );\n }\n}\n\n/**\n * Validate array contains only unique values\n *\n * @param array - Array to validate\n * @param field - Field name for error context\n * @returns Validated array\n */\nexport function validateUniqueArray<T>(array: T[], field: string = 'array'): T[] {\n const seen = new Set();\n const duplicates: T[] = [];\n\n for (const item of array) {\n if (seen.has(item)) {\n duplicates.push(item);\n } else {\n seen.add(item);\n }\n }\n\n if (duplicates.length > 0) {\n throw new ValidationError(\n `Duplicate values found in ${field}`,\n field,\n duplicates,\n ['Remove duplicate entries', 'Ensure all values are unique']\n );\n }\n\n return array;\n}\n\n/**\n * Validate that a number is within a specified range\n *\n * @param value - Number to validate\n * @param min - Minimum value (inclusive)\n * @param max - Maximum value (inclusive)\n * @param field - Field name for error context\n * @returns Validated number\n */\nexport function validateNumberRange(\n value: number,\n min: number,\n max: number,\n field: string = 'value'\n): number {\n if (value < min || value > max) {\n throw new ValidationError(\n `${field} must be between ${min} and ${max}`,\n field,\n value,\n [`Use a value between ${min} and ${max}`, `Current value: ${value}`]\n );\n }\n\n return value;\n}\n\n/**\n * Validate string length\n *\n * @param value - String to validate\n * @param minLength - Minimum length\n * @param maxLength - Maximum length\n * @param field - Field name for error context\n * @returns Validated string\n */\nexport function validateStringLength(\n value: string,\n minLength: number,\n maxLength: number,\n field: string = 'value'\n): string {\n if (value.length < minLength || value.length > maxLength) {\n throw new ValidationError(\n `${field} must be between ${minLength} and ${maxLength} characters`,\n field,\n value,\n [\n `Current length: ${value.length}`,\n `Required length: ${minLength}-${maxLength} characters`\n ]\n );\n }\n\n return value;\n}\n\n// ============================================================================\n// Additional Type Exports\n// ============================================================================\n\nexport type {\n SubagentType,\n SessionStatus,\n LogLevel,\n JunoTaskConfig\n} from '../types/index';","/**\n * CLI Types Module for juno-task-ts\n *\n * Comprehensive TypeScript interfaces and types for the CLI framework,\n * supporting all commands, options, error handling, and help systems.\n */\n\nimport { Command } from 'commander';\nimport { SubagentType, SessionStatus, LogLevel, JunoTaskConfig } from '../types/index';\n\n// ============================================================================\n// Command Structure Types\n// ============================================================================\n\n/**\n * Interface for CLI command definitions\n */\nexport interface CLICommand {\n /** Command name used in CLI */\n name: string;\n /** Human-readable description of the command */\n description: string;\n /** Command aliases (short forms) */\n aliases?: string[];\n /** Command arguments specification */\n arguments?: CommandArgument[];\n /** Command options specification */\n options: CommandOption[];\n /** Command handler function */\n handler: CommandHandler;\n /** Usage examples for help system */\n examples?: CommandExample[];\n /** Subcommands for grouped commands */\n subcommands?: CLICommand[];\n}\n\n/**\n * Interface for command arguments\n */\nexport interface CommandArgument {\n /** Argument name (with optional/required indicators) */\n name: string;\n /** Argument description */\n description: string;\n /** Whether argument is required */\n required?: boolean;\n /** Valid choices for argument */\n choices?: string[];\n /** Default value if not provided */\n defaultValue?: any;\n}\n\n/**\n * Interface for command options\n */\nexport interface CommandOption {\n /** Option flags (short and long forms) */\n flags: string;\n /** Option description */\n description: string;\n /** Default value */\n defaultValue?: any;\n /** Whether option is required */\n required?: boolean;\n /** Valid choices for option value */\n choices?: string[];\n /** Options that conflict with this one */\n conflicts?: string[];\n /** Options that this option implies */\n implies?: string[];\n /** Environment variable that can set this option */\n env?: string;\n}\n\n/**\n * Interface for usage examples\n */\nexport interface CommandExample {\n /** Full command example */\n command: string;\n /** Description of what the example does */\n description: string;\n}\n\n/**\n * Command handler function signature\n */\nexport type CommandHandler = (\n args: any,\n options: any,\n command: Command\n) => Promise<void>;\n\n// ============================================================================\n// CLI Options Types\n// ============================================================================\n\n/**\n * Global CLI options available to all commands\n */\nexport interface GlobalCLIOptions {\n /** Enable verbose output with detailed progress */\n verbose?: boolean;\n /** Disable rich formatting, use plain text */\n quiet?: boolean;\n /** Configuration file path (.json, .toml, pyproject.toml) */\n config?: string;\n /** Log file path (auto-generated if not specified) */\n logFile?: string;\n /** Disable colored output */\n noColor?: boolean;\n /** Log level for output */\n logLevel?: LogLevel;\n /** Enable concurrent feedback collection during execution */\n enableFeedback?: boolean;\n}\n\n/**\n * Main execution command options\n */\nexport interface MainCommandOptions extends GlobalCLIOptions {\n /** Subagent to use (required) */\n subagent: SubagentType;\n /** Prompt input (file path or inline text) */\n prompt?: string;\n /** Working directory */\n cwd?: string;\n /** Maximum iterations (-1 for unlimited) */\n maxIterations?: number;\n /** Model to use (subagent-specific) */\n model?: string;\n /** Interactive mode for typing prompts */\n interactive?: boolean;\n /** Launch TUI prompt editor */\n interactivePrompt?: boolean;\n}\n\n/**\n * Init command options\n */\nexport interface InitCommandOptions extends GlobalCLIOptions {\n /** Target directory */\n directory?: string;\n /** Force overwrite existing files */\n force?: boolean;\n /** Main task description */\n task?: string;\n /** Preferred subagent */\n subagent?: SubagentType;\n /** Repository URL */\n gitUrl?: string;\n /** Launch interactive TUI for guided setup */\n interactive?: boolean;\n /** Template variant to use */\n template?: string;\n /** Custom template variables */\n variables?: Record<string, string>;\n}\n\n/**\n * Start command options\n */\nexport interface StartCommandOptions extends GlobalCLIOptions {\n /** Subagent to use (optional override of config default) */\n subagent?: SubagentType;\n /** Maximum iterations */\n maxIterations?: number;\n /** Model to use */\n model?: string;\n /** Project directory */\n directory?: string;\n /** Display performance metrics summary after execution */\n showMetrics?: boolean;\n /** Show interactive performance dashboard after execution */\n showDashboard?: boolean;\n /** Display performance trends from historical data */\n showTrends?: boolean;\n /** Save performance metrics to file */\n saveMetrics?: boolean | string;\n /** Custom path for metrics file */\n metricsFile?: string;\n /** Enable concurrent feedback collection during execution */\n enableFeedback?: boolean;\n}\n\n/**\n * Feedback command options\n */\nexport interface FeedbackCommandOptions extends GlobalCLIOptions {\n /** Custom USER_FEEDBACK.md file path */\n file?: string;\n /** Interactive multiline input */\n interactive?: boolean;\n /** Issue description */\n issue?: string;\n /** Test criteria or success factors */\n test?: string;\n /** Test criteria alias */\n testCriteria?: string;\n}\n\n/**\n * Session list command options\n */\nexport interface SessionListOptions extends GlobalCLIOptions {\n /** Maximum sessions to show */\n limit?: number;\n /** Filter by subagent */\n subagent?: SubagentType;\n /** Filter by status */\n status?: SessionStatus[];\n}\n\n/**\n * Session info command options\n */\nexport interface SessionInfoOptions extends GlobalCLIOptions {\n /** Show detailed information */\n verbose?: boolean;\n}\n\n/**\n * Session remove command options\n */\nexport interface SessionRemoveOptions extends GlobalCLIOptions {\n /** Skip confirmation prompt */\n force?: boolean;\n}\n\n/**\n * Session clean command options\n */\nexport interface SessionCleanOptions extends GlobalCLIOptions {\n /** Remove sessions older than N days */\n days?: number;\n /** Remove only empty log files */\n empty?: boolean;\n /** Skip confirmation prompt */\n force?: boolean;\n}\n\n/**\n * Setup-git command options\n */\nexport interface SetupGitOptions extends GlobalCLIOptions {\n /** Show current upstream URL configuration */\n show?: boolean;\n /** Remove upstream URL configuration */\n remove?: boolean;\n}\n\n/**\n * Test command options\n */\nexport interface TestCommandOptions extends GlobalCLIOptions {\n /** Test type to generate/run */\n type?: 'unit' | 'integration' | 'e2e' | 'performance' | 'all';\n /** AI subagent for test generation */\n subagent?: SubagentType;\n /** AI intelligence level */\n intelligence?: 'basic' | 'smart' | 'comprehensive';\n /** Generate tests using AI */\n generate?: boolean;\n /** Execute tests */\n run?: boolean;\n /** Generate coverage report */\n coverage?: boolean | string;\n /** Analyze test quality and coverage */\n analyze?: boolean;\n /** Analysis quality level */\n quality?: 'basic' | 'thorough' | 'exhaustive';\n /** Generate improvement suggestions */\n suggestions?: boolean;\n /** Generate test report */\n report?: boolean | string;\n /** Report format */\n format?: 'json' | 'html' | 'markdown' | 'console';\n /** Test template to use */\n template?: string;\n /** Testing framework */\n framework?: 'vitest' | 'jest' | 'mocha' | 'custom';\n /** Watch mode for continuous testing */\n watch?: boolean;\n /** Test reporters (comma-separated) */\n reporters?: string[];\n}\n\n// ============================================================================\n// Parsed Arguments Types\n// ============================================================================\n\n/**\n * Parsed command line arguments\n */\nexport interface ParsedArgs {\n /** Command name */\n command: string;\n /** Subcommand name (if applicable) */\n subcommand?: string;\n /** Positional arguments */\n args: string[];\n /** Parsed options */\n options: Record<string, any>;\n /** Unknown options (for validation) */\n unknown: string[];\n}\n\n/**\n * Option validation result\n */\nexport interface OptionValidationResult {\n /** Whether validation passed */\n valid: boolean;\n /** Validation error messages */\n errors: string[];\n /** Validation warnings */\n warnings: string[];\n /** Normalized/coerced option values */\n normalizedOptions: Record<string, any>;\n}\n\n// ============================================================================\n// Help System Types\n// ============================================================================\n\n/**\n * Help content structure\n */\nexport interface HelpContent {\n /** Command name */\n command: string;\n /** Command description */\n description: string;\n /** Usage syntax */\n usage: string;\n /** Available options */\n options: HelpOption[];\n /** Available subcommands */\n subcommands?: HelpSubcommand[];\n /** Usage examples */\n examples: CommandExample[];\n /** Additional notes */\n notes?: string[];\n}\n\n/**\n * Help option representation\n */\nexport interface HelpOption {\n /** Option flags */\n flags: string;\n /** Option description */\n description: string;\n /** Default value (if any) */\n defaultValue?: any;\n /** Valid choices (if any) */\n choices?: string[];\n}\n\n/**\n * Help subcommand representation\n */\nexport interface HelpSubcommand {\n /** Subcommand name */\n name: string;\n /** Subcommand description */\n description: string;\n /** Subcommand aliases */\n aliases?: string[];\n}\n\n/**\n * Shell completion types\n */\nexport type ShellType = 'bash' | 'zsh' | 'fish';\n\n/**\n * Shell completion configuration\n */\nexport interface CompletionConfig {\n /** Shell type */\n shell: ShellType;\n /** Command name for completion */\n commandName: string;\n /** Available commands for completion */\n commands: string[];\n /** Available options for completion */\n options: string[];\n /** Custom completion handlers */\n customHandlers?: Record<string, CompletionHandler>;\n}\n\n/**\n * Completion handler function\n */\nexport type CompletionHandler = (\n partial: string,\n context: CompletionContext\n) => string[];\n\n/**\n * Completion context\n */\nexport interface CompletionContext {\n /** Current command being completed */\n command?: string;\n /** Current subcommand being completed */\n subcommand?: string;\n /** Previous arguments */\n previousArgs: string[];\n /** Current word being completed */\n currentWord: string;\n}\n\n// ============================================================================\n// Error Types\n// ============================================================================\n\n/**\n * Base CLI error class\n */\nexport abstract class CLIError extends Error {\n /** Error code for programmatic handling */\n abstract code: string;\n /** Whether error should show help */\n showHelp: boolean = false;\n /** Suggested solutions */\n suggestions: string[] = [];\n\n constructor(message: string, showHelp: boolean = false) {\n super(message);\n this.name = this.constructor.name;\n this.showHelp = showHelp;\n }\n}\n\n/**\n * Validation error (user input issues)\n */\nexport class ValidationError extends CLIError {\n code = 'VALIDATION_ERROR';\n\n constructor(message: string, suggestions: string[] = []) {\n super(message, true);\n this.suggestions = suggestions;\n }\n}\n\n/**\n * Configuration error (config file/setup issues)\n */\nexport class ConfigurationError extends CLIError {\n code = 'CONFIGURATION_ERROR';\n\n constructor(message: string, suggestions: string[] = []) {\n super(message, false);\n this.suggestions = suggestions;\n }\n}\n\n/**\n * Command not found error\n */\nexport class CommandNotFoundError extends CLIError {\n code = 'COMMAND_NOT_FOUND';\n\n constructor(command: string, availableCommands: string[] = []) {\n super(`Unknown command: ${command}`);\n this.showHelp = true;\n\n if (availableCommands.length > 0) {\n this.suggestions = [\n `Available commands: ${availableCommands.join(', ')}`,\n `Use 'juno-task --help' for usage information`\n ];\n }\n }\n}\n\n/**\n * MCP-related error\n */\nexport class MCPError extends CLIError {\n code = 'MCP_ERROR';\n\n constructor(message: string, operation?: string) {\n super(operation ? `MCP ${operation}: ${message}` : message);\n this.suggestions = [\n 'Check MCP server configuration',\n 'Verify MCP server is running',\n 'Use --verbose for detailed error information'\n ];\n }\n}\n\n/**\n * File system error\n */\nexport class FileSystemError extends CLIError {\n code = 'FILESYSTEM_ERROR';\n\n constructor(message: string, path?: string) {\n super(path ? `${message}: ${path}` : message);\n this.suggestions = [\n 'Check file/directory permissions',\n 'Verify path exists and is accessible',\n 'Use absolute paths to avoid ambiguity'\n ];\n }\n}\n\n/**\n * Session error\n */\nexport class SessionError extends CLIError {\n code = 'SESSION_ERROR';\n\n constructor(message: string) {\n super(message);\n this.suggestions = [\n 'Check session directory permissions',\n 'Verify sufficient disk space',\n 'Use juno-task session clean to remove old sessions'\n ];\n }\n}\n\n/**\n * Template error\n */\nexport class TemplateError extends CLIError {\n code = 'TEMPLATE_ERROR';\n\n constructor(message: string) {\n super(message);\n this.suggestions = [\n 'Verify template syntax',\n 'Check required template variables',\n 'Use --template to specify different template'\n ];\n }\n}\n\n// ============================================================================\n// Environment Variables\n// ============================================================================\n\n/**\n * Environment variable mappings for CLI options\n */\nexport const ENVIRONMENT_MAPPINGS = {\n // Core options\n JUNO_TASK_SUBAGENT: 'subagent',\n JUNO_TASK_PROMPT: 'prompt',\n JUNO_TASK_CWD: 'cwd',\n JUNO_TASK_MAX_ITERATIONS: 'maxIterations',\n JUNO_TASK_MODEL: 'model',\n JUNO_TASK_LOG_FILE: 'logFile',\n JUNO_TASK_VERBOSE: 'verbose',\n JUNO_TASK_QUIET: 'quiet',\n JUNO_TASK_INTERACTIVE: 'interactive',\n JUNO_TASK_CONFIG: 'config',\n\n // MCP options\n JUNO_TASK_MCP_SERVER_PATH: 'mcpServerPath',\n JUNO_TASK_MCP_TIMEOUT: 'mcpTimeout',\n JUNO_TASK_MCP_RETRIES: 'mcpRetries',\n\n // Session options\n JUNO_TASK_SESSION_DIR: 'sessionDir',\n JUNO_TASK_LOG_LEVEL: 'logLevel',\n\n // Template options\n JUNO_TASK_TEMPLATE: 'template',\n JUNO_TASK_FORCE: 'force',\n\n // Git options\n JUNO_TASK_GIT_URL: 'gitUrl',\n\n // UI options\n JUNO_TASK_NO_COLOR: 'noColor',\n JUNO_TASK_HEADLESS: 'headless',\n\n // Feedback options\n JUNO_TASK_ENABLE_FEEDBACK: 'enableFeedback',\n JUNO_INTERACTIVE_FEEDBACK_MODE: 'enableFeedback' // Alias for enableFeedback\n} as const;\n\n/**\n * Type for environment variable keys\n */\nexport type EnvironmentVariable = keyof typeof ENVIRONMENT_MAPPINGS;\n\n/**\n * Type for CLI option keys\n */\nexport type CLIOptionKey = typeof ENVIRONMENT_MAPPINGS[EnvironmentVariable];\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\n/**\n * CLI configuration structure\n */\nexport interface CLIConfig extends JunoTaskConfig {\n /** Command completion settings */\n completion: {\n enabled: boolean;\n installedShells: ShellType[];\n };\n\n /** Help system settings */\n help: {\n showExamples: boolean;\n showEnvironmentVars: boolean;\n colorOutput: boolean;\n };\n\n /** Error handling settings */\n errorHandling: {\n showStackTrace: boolean;\n suggestSolutions: boolean;\n exitOnError: boolean;\n };\n}\n\n/**\n * Initialization data for project setup\n */\nexport interface InitializationData {\n /** Main task description */\n task: string;\n /** Preferred subagent */\n subagent: SubagentType;\n /** Repository URL (optional) */\n gitUrl?: string;\n /** Template variables */\n variables: Record<string, string>;\n /** Template variant */\n template: string;\n /** Additional metadata */\n metadata?: {\n author?: string;\n description?: string;\n tags?: string[];\n };\n}\n\n/**\n * Template generation result\n */\nexport interface TemplateGenerationResult {\n /** Generated file name */\n fileName: string;\n /** Generated file path */\n filePath: string;\n /** Whether file was created or updated */\n action: 'created' | 'updated' | 'skipped';\n /** File size in bytes */\n size: number;\n}\n\n/**\n * Command execution result\n */\nexport interface CommandExecutionResult {\n /** Whether command succeeded */\n success: boolean;\n /** Exit code */\n exitCode: number;\n /** Execution time in milliseconds */\n duration: number;\n /** Output messages */\n output: string[];\n /** Error messages */\n errors: string[];\n}\n\n// ============================================================================\n// Utility Types\n// ============================================================================\n\n/**\n * Make specific properties required\n */\nexport type WithRequired<T, K extends keyof T> = T & Required<Pick<T, K>>;\n\n/**\n * Make specific properties optional\n */\nexport type WithOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\n/**\n * Extract option types from command options interface\n */\nexport type ExtractOptions<T> = T extends { options: infer O } ? O : never;\n\n/**\n * Union of all command option types\n */\nexport type AllCommandOptions =\n | MainCommandOptions\n | InitCommandOptions\n | StartCommandOptions\n | FeedbackCommandOptions\n | SessionListOptions\n | SessionInfoOptions\n | SessionRemoveOptions\n | SessionCleanOptions\n | SetupGitOptions\n | TestCommandOptions;\n\n/**\n * Union of all CLI error types\n */\nexport type AllCLIErrors =\n | ValidationError\n | ConfigurationError\n | CommandNotFoundError\n | MCPError\n | FileSystemError\n | SessionError\n | TemplateError;\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\n/**\n * Type guard for CLI errors\n */\nexport function isCLIError(error: unknown): error is CLIError {\n return error instanceof CLIError;\n}\n\n/**\n * Type guard for validation errors\n */\nexport function isValidationError(error: unknown): error is ValidationError {\n return error instanceof ValidationError;\n}\n\n/**\n * Type guard for configuration errors\n */\nexport function isConfigurationError(error: unknown): error is ConfigurationError {\n return error instanceof ConfigurationError;\n}\n\n/**\n * Type guard for MCP errors\n */\nexport function isMCPError(error: unknown): error is MCPError {\n return error instanceof MCPError;\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Default CLI configuration values\n */\nexport const DEFAULT_CLI_CONFIG: Partial<CLIConfig> = {\n completion: {\n enabled: true,\n installedShells: []\n },\n help: {\n showExamples: true,\n showEnvironmentVars: true,\n colorOutput: true\n },\n errorHandling: {\n showStackTrace: false,\n suggestSolutions: true,\n exitOnError: true\n }\n};\n\n/**\n * Supported subagent aliases\n */\nexport const SUBAGENT_ALIASES: Record<string, SubagentType> = {\n 'claude-code': 'claude',\n 'claude_code': 'claude',\n 'gemini-cli': 'gemini',\n 'cursor-agent': 'cursor'\n};\n\n/**\n * Command categories for help organization\n */\nexport const COMMAND_CATEGORIES = {\n EXECUTION: ['juno-task', 'start'],\n PROJECT: ['init', 'setup-git'],\n TESTING: ['test'],\n SESSION: ['session'],\n FEEDBACK: ['feedback']\n} as const;\n\n/**\n * Exit codes for different error types\n */\nexport const EXIT_CODES = {\n SUCCESS: 0,\n VALIDATION_ERROR: 1,\n CONFIGURATION_ERROR: 2,\n COMMAND_NOT_FOUND: 3,\n MCP_ERROR: 4,\n FILESYSTEM_ERROR: 5,\n SESSION_ERROR: 6,\n TEMPLATE_ERROR: 7,\n UNEXPECTED_ERROR: 99\n} as const;\n\nexport type ExitCode = typeof EXIT_CODES[keyof typeof EXIT_CODES];","/**\n * Core type definitions for juno-task-ts\n */\n\n// Subagent types\nexport type SubagentType = 'claude' | 'cursor' | 'codex' | 'gemini';\n\n// Session status\nexport type SessionStatus = 'running' | 'completed' | 'failed' | 'cancelled';\n\n// Log levels\nexport type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\n// Hook types\nexport type HookType = 'START_RUN' | 'START_ITERATION' | 'END_ITERATION' | 'END_RUN';\n\n// Hook configuration\nexport interface Hook {\n commands: string[];\n}\n\n// Hooks configuration mapping\nexport type Hooks = Record<HookType, Hook>;\n\n// Progress event types\nexport type ProgressEventType = 'tool_start' | 'tool_result' | 'thinking' | 'error' | 'info';\n\n// Base configuration interface\nexport interface JunoTaskConfig {\n // Core settings\n defaultSubagent: SubagentType;\n defaultMaxIterations: number;\n defaultModel?: string;\n\n // Logging settings\n logLevel: LogLevel;\n logFile?: string;\n verbose: boolean;\n quiet: boolean;\n\n // MCP settings\n mcpTimeout: number;\n mcpRetries: number;\n mcpServerPath?: string;\n\n // TUI settings\n interactive: boolean;\n headlessMode: boolean;\n\n // Paths\n workingDirectory: string;\n sessionDirectory: string;\n\n // Hooks configuration\n hooks?: Hooks;\n}\n\n// Re-export metrics types for convenience\nexport type {\n PerformanceTiming,\n ToolCallMetrics,\n SessionMetrics,\n SystemMetrics,\n ToolCallStatistics,\n PerformanceRecommendation,\n AnalyticsReport,\n MetricsExportFormat,\n MetricsExportOptions,\n} from '../core/metrics';\n\n// Global declarations for build-time constants\ndeclare global {\n const __VERSION__: string;\n const __DEV__: boolean;\n}","/**\n * TUI Module Entry Point for juno-task-ts\n *\n * Main exports for the Terminal User Interface system built on Ink + React.\n * Provides all components, apps, hooks, and utilities for TUI functionality.\n */\n\n// ============================================================================\n// Core Types and Interfaces\n// ============================================================================\n\nexport * from './types.js';\n\n// ============================================================================\n// Base Components\n// ============================================================================\n\nexport { Input, Validators } from './components/Input.js';\nexport {\n Spinner,\n LoadingSpinner,\n ProgressSpinner,\n TimedSpinner,\n CustomSpinner,\n SpinnerPresets\n} from './components/Spinner.js';\nexport {\n ProgressBar,\n StepProgressBar,\n IndeterminateProgressBar,\n CircularProgress,\n FileProgressBar,\n useProgressAnimation\n} from './components/ProgressBar.js';\nexport {\n Dialog,\n ConfirmDialog,\n AlertDialog,\n ChoiceDialog,\n ErrorDialog,\n ProgressDialog\n} from './components/Dialog.js';\nexport {\n Select,\n SingleSelect,\n MultiSelect,\n SearchableSelect,\n BooleanSelect,\n QuickSelect\n} from './components/Select.js';\n\n// ============================================================================\n// TUI Applications\n// ============================================================================\n\nexport {\n TUIApp,\n TUIScreen,\n TUIScreenManager,\n TUILayout,\n useTUIContext\n} from './apps/TUIApp.js';\nexport {\n PromptEditor,\n SimplePromptEditor\n} from './apps/PromptEditor.js';\n\n// ============================================================================\n// Custom Hooks\n// ============================================================================\n\n// Note: useTUIContext is already exported from TUIApp.js\nexport {\n useKeyboard,\n useGlobalShortcuts,\n useNavigationKeys,\n useTextEditingKeys,\n useFormKeys,\n useAppShortcuts,\n createKeySequence,\n parseKeyBinding\n} from './hooks/useKeyboard.js';\nexport {\n useTUIState,\n useFormState,\n useListState\n} from './hooks/useTUIState.js';\n\n// ============================================================================\n// Rendering and Utilities\n// ============================================================================\n\nexport {\n TUIRenderer,\n tuiRenderer,\n renderTUI,\n renderAndWait,\n showTUIAlert,\n isTUIAvailable,\n safeTUIRender,\n registerCleanupHandlers,\n initializeTUIRenderer\n} from './utils/renderer.js';\nexport {\n headlessPromptEditor,\n headlessConfirmation,\n headlessSelection,\n headlessAlert,\n getTUICapabilities,\n enhanceForTerminal,\n safeConsoleOutput,\n createHeadlessProgress,\n getEnvironmentType\n} from './utils/headless.js';\n\n// ============================================================================\n// High-Level TUI Functions for CLI Integration\n// ============================================================================\n\n/**\n * Launch the TUI prompt editor for interactive prompt creation\n */\nexport async function launchPromptEditor(options: {\n initialValue?: string;\n title?: string;\n maxLength?: number;\n}): Promise<string | null> {\n const { isTUIAvailable } = await import('./utils/renderer.js');\n const { headlessPromptEditor } = await import('./utils/headless.js');\n\n // Use headless fallback if TUI is not supported\n if (!isTUIAvailable()) {\n return headlessPromptEditor(options);\n }\n\n try {\n const { initializeTUIRenderer, renderAndWait } = await import('./utils/renderer.js');\n const { PromptEditor } = await import('./apps/PromptEditor.js');\n const React = await import('react');\n\n const { initialValue = '', title = 'Prompt Editor', maxLength = 10000 } = options;\n\n return new Promise((resolve) => {\n const handleSubmit = (prompt: string) => {\n resolve(prompt);\n };\n\n const handleCancel = () => {\n resolve(null);\n };\n\n const editorComponent = React.createElement(PromptEditor, {\n initialValue,\n onSubmit: handleSubmit,\n onCancel: handleCancel,\n maxLength,\n showHelp: true,\n enableSyntaxHighlighting: true\n });\n\n // Initialize renderer and render editor\n const renderer = initializeTUIRenderer();\n renderAndWait(editorComponent).catch((error) => {\n console.error('Failed to render prompt editor:', error);\n resolve(null);\n });\n });\n } catch (error) {\n console.warn('TUI failed, falling back to headless mode:', error);\n return headlessPromptEditor(options);\n }\n}\n\n/**\n * Launch a simple prompt input dialog\n */\nexport async function launchSimplePrompt(options: {\n message?: string;\n placeholder?: string;\n initialValue?: string;\n}): Promise<string | null> {\n const { renderAndWait } = await import('./utils/renderer.js');\n const { SimplePromptEditor } = await import('./apps/PromptEditor.js');\n const React = await import('react');\n\n const { placeholder = 'Enter your prompt...', initialValue = '' } = options;\n\n return new Promise((resolve) => {\n const handleSubmit = (prompt: string) => {\n resolve(prompt);\n };\n\n const handleCancel = () => {\n resolve(null);\n };\n\n const editorComponent = React.createElement(SimplePromptEditor, {\n initialValue,\n onSubmit: handleSubmit,\n onCancel: handleCancel,\n placeholder\n });\n\n renderAndWait(editorComponent).catch((error) => {\n console.error('Failed to render simple prompt:', error);\n resolve(null);\n });\n });\n}\n\n/**\n * Show a confirmation dialog\n */\nexport async function showConfirmation(options: {\n title?: string;\n message: string;\n confirmLabel?: string;\n cancelLabel?: string;\n}): Promise<boolean> {\n const { renderAndWait } = await import('./utils/renderer.js');\n const { ConfirmDialog } = await import('./components/Dialog.js');\n const React = await import('react');\n\n const {\n title = 'Confirm',\n message,\n confirmLabel = 'Yes',\n cancelLabel = 'No'\n } = options;\n\n return new Promise((resolve) => {\n const handleConfirm = () => resolve(true);\n const handleCancel = () => resolve(false);\n\n const dialogComponent = React.createElement(ConfirmDialog, {\n title,\n message,\n isVisible: true,\n onConfirm: handleConfirm,\n onCancel: handleCancel,\n confirmLabel,\n cancelLabel\n });\n\n renderAndWait(dialogComponent).catch((error) => {\n console.error('Failed to render confirmation dialog:', error);\n resolve(false);\n });\n });\n}\n\n/**\n * Show an alert dialog\n */\nexport async function showAlert(options: {\n title?: string;\n message: string;\n type?: 'info' | 'success' | 'warning' | 'error';\n}): Promise<void> {\n const { renderAndWait } = await import('./utils/renderer.js');\n const { AlertDialog } = await import('./components/Dialog.js');\n const React = await import('react');\n\n const { title, message, type = 'info' } = options;\n\n return new Promise((resolve) => {\n const handleClose = () => resolve();\n\n const dialogComponent = React.createElement(AlertDialog, {\n title,\n message,\n isVisible: true,\n onClose: handleClose,\n type\n });\n\n renderAndWait(dialogComponent).catch((error) => {\n console.error('Failed to render alert dialog:', error);\n resolve();\n });\n });\n}\n\n/**\n * Show a selection dialog\n */\nexport async function showSelection<T = string>(options: {\n title?: string;\n message: string;\n choices: Array<{ label: string; value: T; description?: string }>;\n multiple?: boolean;\n searchable?: boolean;\n}): Promise<T | T[] | null> {\n const { renderAndWait } = await import('./utils/renderer.js');\n const { TUIApp } = await import('./apps/TUIApp.js');\n const { Select } = await import('./components/Select.js');\n const React = await import('react');\n\n const {\n title = 'Select Option',\n message,\n choices,\n multiple = false,\n searchable = false\n } = options;\n\n return new Promise((resolve) => {\n const handleSelection = (value: T | T[]) => {\n resolve(value);\n };\n\n const handleCancel = () => {\n resolve(null);\n };\n\n const selectComponent = React.createElement(\n TUIApp,\n { title, exitOnEscape: true, onExit: handleCancel },\n React.createElement('div', {},\n React.createElement('text', {}, message),\n React.createElement(Select, {\n options: choices,\n onChange: handleSelection,\n multiple,\n searchable,\n autoFocus: true\n })\n )\n );\n\n renderAndWait(selectComponent).catch((error) => {\n console.error('Failed to render selection dialog:', error);\n resolve(null);\n });\n });\n}\n\n/**\n * Check if TUI is available in current environment\n */\nexport function isTUISupported(): boolean {\n return typeof process !== 'undefined' &&\n process.stdout &&\n Boolean(process.stdout.isTTY) &&\n !process.env.CI &&\n process.env.TERM !== 'dumb';\n}\n\n/**\n * Safe TUI execution with automatic fallback\n */\nexport async function safeTUIExecution<T>(\n tuiFunction: () => Promise<T>,\n fallbackFunction: () => Promise<T>\n): Promise<T> {\n if (!isTUISupported()) {\n return fallbackFunction();\n }\n\n try {\n return await tuiFunction();\n } catch (error) {\n console.warn('TUI execution failed, falling back to CLI mode:', error);\n return fallbackFunction();\n }\n}\n\n// ============================================================================\n// Default Export\n// ============================================================================\n\n// Note: Default export removed to fix module loading issues\n// All exports are available as named exports","/**\n * Spinner Component for juno-task-ts TUI\n *\n * Animated loading spinner component with multiple styles and customizable\n * frames. Supports both predefined and custom spinner animations.\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { Box, Text } from 'ink';\nimport chalk from 'chalk';\nimport type { SpinnerProps, SpinnerType } from '../types.js';\nimport { SPINNER_FRAMES } from '../types.js';\nimport { useTUIContext } from '../apps/TUIApp.js';\n\n/**\n * Animated spinner component for loading states\n */\nexport const Spinner: React.FC<SpinnerProps> = ({\n label,\n type = 'dots',\n frames: customFrames,\n interval = 100,\n disabled = false,\n testId\n}) => {\n const { theme, isHeadless } = useTUIContext();\n const [currentFrameIndex, setCurrentFrameIndex] = useState(0);\n\n // Get spinner frames based on type or custom frames\n const frames = customFrames || SPINNER_FRAMES[type] || SPINNER_FRAMES.dots;\n\n // Animate spinner frames\n useEffect(() => {\n if (disabled || isHeadless) return;\n\n const timer = setInterval(() => {\n setCurrentFrameIndex((prevIndex) => (prevIndex + 1) % frames.length);\n }, interval);\n\n return () => clearInterval(timer);\n }, [frames.length, interval, disabled, isHeadless]);\n\n // Headless mode fallback\n if (isHeadless) {\n return (\n <Box>\n <Text color={theme.muted}>Loading{label ? `: ${label}` : '...'}</Text>\n </Box>\n );\n }\n\n // Disabled state\n if (disabled) {\n return (\n <Box data-testid={testId}>\n {label && (\n <Text color={theme.muted}>{label}</Text>\n )}\n </Box>\n );\n }\n\n const currentFrame = frames[currentFrameIndex];\n\n return (\n <Box data-testid={testId}>\n <Text color={theme.primary}>{currentFrame}</Text>\n {label && (\n <Text color={theme.text}> {label}</Text>\n )}\n </Box>\n );\n};\n\n/**\n * Spinner with progress text that cycles through dots\n */\nexport const LoadingSpinner: React.FC<{\n label?: string;\n type?: SpinnerType;\n showDots?: boolean;\n testId?: string;\n}> = ({\n label = 'Loading',\n type = 'dots',\n showDots = true,\n testId\n}) => {\n const { theme, isHeadless } = useTUIContext();\n const [dotCount, setDotCount] = useState(1);\n\n useEffect(() => {\n if (!showDots || isHeadless) return;\n\n const timer = setInterval(() => {\n setDotCount((count) => (count % 3) + 1);\n }, 500);\n\n return () => clearInterval(timer);\n }, [showDots, isHeadless]);\n\n if (isHeadless) {\n return <Text color={theme.muted}>{label}...</Text>;\n }\n\n return (\n <Box data-testid={testId}>\n <Spinner type={type} />\n <Text color={theme.text}> {label}</Text>\n {showDots && (\n <Text color={theme.primary}>{'.'.repeat(dotCount)}</Text>\n )}\n </Box>\n );\n};\n\n/**\n * Multi-step progress spinner\n */\nexport const ProgressSpinner: React.FC<{\n steps: string[];\n currentStep: number;\n type?: SpinnerType;\n showStepNumber?: boolean;\n testId?: string;\n}> = ({\n steps,\n currentStep,\n type = 'dots',\n showStepNumber = true,\n testId\n}) => {\n const { theme, isHeadless } = useTUIContext();\n\n if (isHeadless) {\n const currentStepText = steps[currentStep] || 'Processing...';\n const stepInfo = showStepNumber ? `(${currentStep + 1}/${steps.length})` : '';\n return (\n <Text color={theme.muted}>\n {currentStepText} {stepInfo}\n </Text>\n );\n }\n\n const currentStepText = steps[currentStep] || 'Processing...';\n const isComplete = currentStep >= steps.length;\n\n return (\n <Box flexDirection=\"column\" data-testid={testId}>\n <Box>\n {!isComplete && <Spinner type={type} />}\n {isComplete && <Text color={theme.success}>✓</Text>}\n <Text color={theme.text}> {currentStepText}</Text>\n {showStepNumber && (\n <Text color={theme.muted}> ({Math.min(currentStep + 1, steps.length)}/{steps.length})</Text>\n )}\n </Box>\n\n {/* Show previous steps */}\n {currentStep > 0 && (\n <Box flexDirection=\"column\" marginTop={1}>\n {steps.slice(0, currentStep).map((step, index) => (\n <Box key={index}>\n <Text color={theme.success}>✓</Text>\n <Text color={theme.muted}> {step}</Text>\n </Box>\n ))}\n </Box>\n )}\n </Box>\n );\n};\n\n/**\n * Spinner with elapsed time\n */\nexport const TimedSpinner: React.FC<{\n label?: string;\n type?: SpinnerType;\n startTime?: Date;\n showElapsed?: boolean;\n testId?: string;\n}> = ({\n label = 'Processing',\n type = 'dots',\n startTime = new Date(),\n showElapsed = true,\n testId\n}) => {\n const { theme, isHeadless } = useTUIContext();\n const [elapsed, setElapsed] = useState(0);\n\n useEffect(() => {\n if (!showElapsed) return;\n\n const timer = setInterval(() => {\n setElapsed(Date.now() - startTime.getTime());\n }, 1000);\n\n return () => clearInterval(timer);\n }, [startTime, showElapsed]);\n\n const formatElapsed = (ms: number): string => {\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n\n if (minutes > 0) {\n return `${minutes}m ${seconds % 60}s`;\n }\n return `${seconds}s`;\n };\n\n if (isHeadless) {\n const elapsedText = showElapsed ? ` (${formatElapsed(elapsed)})` : '';\n return (\n <Text color={theme.muted}>\n {label}...{elapsedText}\n </Text>\n );\n }\n\n return (\n <Box data-testid={testId}>\n <Spinner type={type} />\n <Text color={theme.text}> {label}</Text>\n {showElapsed && (\n <Text color={theme.muted}> ({formatElapsed(elapsed)})</Text>\n )}\n </Box>\n );\n};\n\n/**\n * Custom frame spinner with specific animation sequence\n */\nexport const CustomSpinner: React.FC<{\n frames: string[];\n interval?: number;\n label?: string;\n color?: string;\n testId?: string;\n}> = ({\n frames,\n interval = 100,\n label,\n color,\n testId\n}) => {\n const { theme, isHeadless } = useTUIContext();\n const [currentFrameIndex, setCurrentFrameIndex] = useState(0);\n\n useEffect(() => {\n if (isHeadless || frames.length === 0) return;\n\n const timer = setInterval(() => {\n setCurrentFrameIndex((prevIndex) => (prevIndex + 1) % frames.length);\n }, interval);\n\n return () => clearInterval(timer);\n }, [frames.length, interval, isHeadless]);\n\n if (isHeadless) {\n return (\n <Text color={theme.muted}>\n {label || 'Loading...'}\n </Text>\n );\n }\n\n if (frames.length === 0) {\n return (\n <Text color={theme.error}>\n Invalid spinner frames\n </Text>\n );\n }\n\n const currentFrame = frames[currentFrameIndex];\n const frameColor = color || theme.primary;\n\n return (\n <Box data-testid={testId}>\n <Text color={frameColor}>{currentFrame}</Text>\n {label && (\n <Text color={theme.text}> {label}</Text>\n )}\n </Box>\n );\n};\n\n// ============================================================================\n// Predefined Spinner Configurations\n// ============================================================================\n\n/**\n * Common spinner presets\n */\nexport const SpinnerPresets = {\n /** Simple dots spinner */\n simple: { type: 'dots' as SpinnerType, interval: 120 },\n\n /** Fast pulse spinner */\n fast: { type: 'pulse' as SpinnerType, interval: 200 },\n\n /** Slow loading spinner */\n slow: { type: 'arc' as SpinnerType, interval: 300 },\n\n /** Bouncing spinner */\n bounce: { type: 'bounce' as SpinnerType, interval: 150 },\n\n /** Arrow spinner for direction indication */\n arrow: { type: 'arrow' as SpinnerType, interval: 100 },\n\n /** Line spinner for terminal compatibility */\n line: { type: 'line' as SpinnerType, interval: 200 },\n\n /** Custom clock spinner */\n clock: {\n frames: ['🕐', '🕑', '🕒', '🕓', '🕔', '🕕', '🕖', '🕗', '🕘', '🕙', '🕚', '🕛'],\n interval: 500\n },\n\n /** Custom earth spinner */\n earth: {\n frames: ['🌍', '🌎', '🌏'],\n interval: 800\n },\n\n /** Custom moon phases */\n moon: {\n frames: ['🌑', '🌒', '🌓', '🌔', '🌕', '🌖', '🌗', '🌘'],\n interval: 400\n }\n};\n\nexport default Spinner;","/**\n * ProgressBar Component for juno-task-ts TUI\n *\n * Visual progress indicator with customizable styling, labels, and\n * percentage display. Supports both determinate and indeterminate modes.\n */\n\nimport React from 'react';\nimport { Box, Text } from 'ink';\nimport chalk from 'chalk';\nimport type { ProgressBarProps } from '../types.js';\nimport { PROGRESS_CHARS } from '../types.js';\nimport { useTUIContext } from '../apps/TUIApp.js';\n\n/**\n * Progress bar component for showing completion status\n */\nexport const ProgressBar: React.FC<ProgressBarProps> = ({\n value,\n max = 100,\n label,\n showPercentage = true,\n width = 40,\n chars = PROGRESS_CHARS,\n disabled = false,\n testId\n}) => {\n const { theme, isHeadless } = useTUIContext();\n\n // Normalize value to 0-100 percentage\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n const completedWidth = Math.floor((percentage / 100) * width);\n const remainingWidth = width - completedWidth;\n\n // Create progress bar visual\n const progressBar = chars.complete.repeat(completedWidth) + chars.incomplete.repeat(remainingWidth);\n\n // Format percentage display\n const percentageText = `${Math.round(percentage)}%`;\n\n // Headless mode fallback\n if (isHeadless) {\n return (\n <Box flexDirection=\"column\">\n {label && <Text>{label}</Text>}\n <Text>\n Progress: {percentageText} ({value}/{max})\n </Text>\n </Box>\n );\n }\n\n // Disabled state\n if (disabled) {\n return (\n <Box flexDirection=\"column\" data-testid={testId}>\n {label && (\n <Text color={theme.muted}>{label}</Text>\n )}\n <Box>\n <Text color={theme.muted}>{chars.incomplete.repeat(width)}</Text>\n {showPercentage && (\n <Text color={theme.muted}> {percentageText}</Text>\n )}\n </Box>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" data-testid={testId}>\n {/* Label */}\n {label && (\n <Box marginBottom={1}>\n <Text color={theme.text}>{label}</Text>\n </Box>\n )}\n\n {/* Progress bar */}\n <Box>\n <Text>\n <Text color={theme.success}>{chars.complete.repeat(completedWidth)}</Text>\n <Text color={theme.muted}>{chars.incomplete.repeat(remainingWidth)}</Text>\n </Text>\n {showPercentage && (\n <Text color={theme.text}> {percentageText}</Text>\n )}\n </Box>\n </Box>\n );\n};\n\n/**\n * Multi-step progress bar showing discrete steps\n */\nexport const StepProgressBar: React.FC<{\n steps: string[];\n currentStep: number;\n showLabels?: boolean;\n showStepNumbers?: boolean;\n testId?: string;\n}> = ({\n steps,\n currentStep,\n showLabels = true,\n showStepNumbers = false,\n testId\n}) => {\n const { theme, isHeadless } = useTUIContext();\n\n if (isHeadless) {\n return (\n <Box flexDirection=\"column\">\n <Text>Progress: Step {currentStep + 1} of {steps.length}</Text>\n {showLabels && steps[currentStep] && (\n <Text>Current: {steps[currentStep]}</Text>\n )}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" data-testid={testId}>\n {/* Step indicators */}\n <Box>\n {steps.map((step, index) => {\n const isCompleted = index < currentStep;\n const isCurrent = index === currentStep;\n const isPending = index > currentStep;\n\n let stepChar = '';\n let stepColor = theme.muted;\n\n if (isCompleted) {\n stepChar = '●';\n stepColor = theme.success;\n } else if (isCurrent) {\n stepChar = '◐';\n stepColor = theme.primary;\n } else {\n stepChar = '○';\n stepColor = theme.muted;\n }\n\n return (\n <Box key={index}>\n <Text color={stepColor}>{stepChar}</Text>\n {index < steps.length - 1 && (\n <Text color={theme.muted}>─</Text>\n )}\n </Box>\n );\n })}\n </Box>\n\n {/* Step labels */}\n {showLabels && (\n <Box marginTop={1}>\n <Text color={theme.text}>\n {showStepNumbers && `${currentStep + 1}. `}\n {steps[currentStep] || 'Complete'}\n </Text>\n </Box>\n )}\n\n {/* Progress summary */}\n <Box marginTop={1}>\n <Text color={theme.muted}>\n {currentStep} of {steps.length} completed\n </Text>\n </Box>\n </Box>\n );\n};\n\n/**\n * Indeterminate progress bar with moving indicator\n */\nexport const IndeterminateProgressBar: React.FC<{\n label?: string;\n width?: number;\n speed?: number;\n testId?: string;\n}> = ({\n label,\n width = 40,\n speed = 200,\n testId\n}) => {\n const { theme, isHeadless } = useTUIContext();\n const [position, setPosition] = React.useState(0);\n const [direction, setDirection] = React.useState(1);\n\n React.useEffect(() => {\n if (isHeadless) return;\n\n const timer = setInterval(() => {\n setPosition((prev) => {\n const next = prev + direction;\n if (next >= width - 5) {\n setDirection(-1);\n return width - 5;\n }\n if (next <= 0) {\n setDirection(1);\n return 0;\n }\n return next;\n });\n }, speed);\n\n return () => clearInterval(timer);\n }, [direction, width, speed, isHeadless]);\n\n if (isHeadless) {\n return (\n <Box flexDirection=\"column\">\n {label && <Text>{label}</Text>}\n <Text>Processing...</Text>\n </Box>\n );\n }\n\n const before = PROGRESS_CHARS.incomplete.repeat(position);\n const indicator = PROGRESS_CHARS.complete.repeat(5);\n const after = PROGRESS_CHARS.incomplete.repeat(width - position - 5);\n\n return (\n <Box flexDirection=\"column\" data-testid={testId}>\n {label && (\n <Box marginBottom={1}>\n <Text color={theme.text}>{label}</Text>\n </Box>\n )}\n <Box>\n <Text color={theme.muted}>{before}</Text>\n <Text color={theme.primary}>{indicator}</Text>\n <Text color={theme.muted}>{after}</Text>\n </Box>\n </Box>\n );\n};\n\n/**\n * Circular progress indicator (text-based approximation)\n */\nexport const CircularProgress: React.FC<{\n value: number;\n max?: number;\n label?: string;\n size?: 'small' | 'medium' | 'large';\n testId?: string;\n}> = ({\n value,\n max = 100,\n label,\n size = 'medium',\n testId\n}) => {\n const { theme, isHeadless } = useTUIContext();\n const percentage = Math.min(Math.max((value / max) * 100, 0), 100);\n\n const sizeConfig = {\n small: { frames: ['○', '◔', '◐', '◕', '●'], width: 1 },\n medium: { frames: ['○○○', '●○○', '●●○', '●●●'], width: 3 },\n large: { frames: ['○○○○○', '●○○○○', '●●○○○', '●●●○○', '●●●●○', '●●●●●'], width: 5 }\n };\n\n const config = sizeConfig[size];\n const frameIndex = Math.floor((percentage / 100) * (config.frames.length - 1));\n const currentFrame = config.frames[frameIndex];\n\n if (isHeadless) {\n return (\n <Box flexDirection=\"column\">\n {label && <Text>{label}</Text>}\n <Text>Progress: {Math.round(percentage)}%</Text>\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" alignItems=\"center\" data-testid={testId}>\n <Text color={theme.primary}>{currentFrame}</Text>\n <Text color={theme.text}>{Math.round(percentage)}%</Text>\n {label && (\n <Text color={theme.muted}>{label}</Text>\n )}\n </Box>\n );\n};\n\n/**\n * File transfer progress bar with speed indicator\n */\nexport const FileProgressBar: React.FC<{\n bytesTransferred: number;\n totalBytes: number;\n filename?: string;\n speed?: number; // bytes per second\n estimatedTimeRemaining?: number; // seconds\n testId?: string;\n}> = ({\n bytesTransferred,\n totalBytes,\n filename,\n speed,\n estimatedTimeRemaining,\n testId\n}) => {\n const { theme, isHeadless } = useTUIContext();\n\n const formatBytes = (bytes: number): string => {\n const units = ['B', 'KB', 'MB', 'GB'];\n let size = bytes;\n let unitIndex = 0;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(1)} ${units[unitIndex]}`;\n };\n\n const formatSpeed = (bytesPerSecond: number): string => {\n return `${formatBytes(bytesPerSecond)}/s`;\n };\n\n const formatTime = (seconds: number): string => {\n if (seconds < 60) return `${Math.round(seconds)}s`;\n const minutes = Math.floor(seconds / 60);\n const remainingSeconds = Math.round(seconds % 60);\n return `${minutes}m ${remainingSeconds}s`;\n };\n\n const percentage = totalBytes > 0 ? (bytesTransferred / totalBytes) * 100 : 0;\n\n if (isHeadless) {\n return (\n <Box flexDirection=\"column\">\n {filename && <Text>File: {filename}</Text>}\n <Text>\n {formatBytes(bytesTransferred)} / {formatBytes(totalBytes)} ({Math.round(percentage)}%)\n </Text>\n {speed && <Text>Speed: {formatSpeed(speed)}</Text>}\n {estimatedTimeRemaining && <Text>ETA: {formatTime(estimatedTimeRemaining)}</Text>}\n </Box>\n );\n }\n\n return (\n <Box flexDirection=\"column\" data-testid={testId}>\n {filename && (\n <Box marginBottom={1}>\n <Text color={theme.text}>{filename}</Text>\n </Box>\n )}\n\n <ProgressBar\n value={bytesTransferred}\n max={totalBytes}\n showPercentage={true}\n width={50}\n />\n\n <Box marginTop={1} justifyContent=\"space-between\">\n <Text color={theme.muted}>\n {formatBytes(bytesTransferred)} / {formatBytes(totalBytes)}\n </Text>\n {speed && (\n <Text color={theme.muted}>\n {formatSpeed(speed)}\n </Text>\n )}\n </Box>\n\n {estimatedTimeRemaining && estimatedTimeRemaining > 0 && (\n <Box marginTop={1}>\n <Text color={theme.muted}>\n ETA: {formatTime(estimatedTimeRemaining)}\n </Text>\n </Box>\n )}\n </Box>\n );\n};\n\n// ============================================================================\n// Progress Bar Utilities\n// ============================================================================\n\n/**\n * Create a smooth progress animation\n */\nexport const useProgressAnimation = (\n targetValue: number,\n duration: number = 1000\n) => {\n const [currentValue, setCurrentValue] = React.useState(0);\n\n React.useEffect(() => {\n const startValue = currentValue;\n const difference = targetValue - startValue;\n const startTime = Date.now();\n\n const animate = () => {\n const elapsed = Date.now() - startTime;\n const progress = Math.min(elapsed / duration, 1);\n\n // Easing function (ease-out)\n const easeOut = 1 - Math.pow(1 - progress, 3);\n const newValue = startValue + (difference * easeOut);\n\n setCurrentValue(newValue);\n\n if (progress < 1) {\n requestAnimationFrame(animate);\n }\n };\n\n requestAnimationFrame(animate);\n }, [targetValue, duration]);\n\n return currentValue;\n};\n\nexport default ProgressBar;","/**\n * MCP (Model Context Protocol) Module Exports\n */\n\n// Core client functionality\nexport { MCPClient, JunoMCPClient, createMCPClient, createMCPClientFromConfig } from './client.js';\nexport { MCPStubClient } from './client-stub.js';\n\n// Configuration management\nexport { MCPConfigLoader, type MCPConfig, type MCPServerConfig } from './config.js';\n\n// Type definitions\nexport * from './types.js';\n\n// Error classes\nexport * from './errors.js';\n\n// Advanced features\nexport * from './advanced/index.js';","/**\n * MCP Client Implementation using @modelcontextprotocol/sdk\n *\n * Full implementation of MCP client wrapper with progress callbacks,\n * subagent mapping, robust error handling, and connection management.\n */\n\nimport { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport { ProgressEventType, SessionState, ProgressEvent, ProgressCallback } from './types.js';\nimport { MCPConnectionError, MCPValidationError, MCPTimeoutError, MCPToolError, MCPErrorCode } from './errors.js';\nimport { ProgressStreamManager } from './advanced/progress-stream.js';\nimport { MCPConfigLoader, type MCPServerConfig } from './config.js';\nimport { spawn } from 'node:child_process';\nimport { promises as fsPromises } from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { getMCPLogger } from '../utils/logger.js';\nimport { writeTerminalProgressWithPrefix } from '../utils/terminal-progress-writer.js';\n\n// Core interfaces\nexport interface MCPClientOptions {\n serverPath?: string;\n serverName?: string;\n timeout?: number;\n retries?: number;\n workingDirectory?: string;\n debug?: boolean;\n environment?: Record<string, string>;\n progressCallback?: ProgressCallback;\n enableProgressStreaming?: boolean;\n sessionId?: string;\n}\n\nexport interface ToolCallRequest {\n toolName: string;\n arguments?: Record<string, any>;\n timeout?: number;\n priority?: 'low' | 'normal' | 'high';\n metadata?: Record<string, unknown>;\n progressCallback?: (event: ProgressEvent) => Promise<void>;\n}\n\nexport interface ToolCallResponse {\n toolId: string;\n content: string;\n success: boolean;\n duration: number;\n timestamp: Date;\n status?: string;\n progressEvents?: ProgressEvent[];\n}\n\nexport interface RetryConfig {\n maxRetries: number;\n baseDelay: number;\n maxDelay: number;\n backoffFactor: number;\n}\n\nexport interface ToolInfo {\n name: string;\n description: string;\n inputSchema: any;\n}\n\nexport interface SubagentInfo {\n name: string;\n description: string;\n capabilities: string[];\n models: string[];\n aliases: string[];\n}\n\n/**\n * Main MCP Client using the official @modelcontextprotocol/sdk\n * Uses per-operation connection pattern for stability\n */\nexport class JunoMCPClient {\n private progressTracker: MCPProgressTracker;\n private sessionManager = new SessionContextManager();\n private subagentMapper = new SubagentMapperImpl();\n private rateLimitMonitor: RateLimitMonitor;\n private eventHandlers: Map<string, Function[]> = new Map();\n private progressStreamManager?: ProgressStreamManager;\n private currentSessionId?: string;\n private lastConnectionTest: number = 0;\n private connectionTestInterval: number = 30000; // Test every 30 seconds\n private eventCounter: number = 0;\n private logger = getMCPLogger();\n\n constructor(\n private options: MCPClientOptions\n ) {\n this.progressTracker = new MCPProgressTracker();\n this.rateLimitMonitor = new RateLimitMonitor({\n maxRequests: 10,\n windowMs: 60000\n });\n\n // Initialize progress streaming if enabled\n if (options.enableProgressStreaming) {\n this.progressStreamManager = new ProgressStreamManager();\n this.currentSessionId = options.sessionId || `session-${Date.now()}`;\n }\n\n if (options.progressCallback) {\n this.progressTracker.addCallback(options.progressCallback);\n }\n\n // Initialize MCP logger\n this.logger.initialize().catch(error => {\n console.error('Failed to initialize MCP logger:', error);\n });\n }\n\n async connect(): Promise<void> {\n // Per-operation pattern - this method just validates configuration\n if (!this.options.serverPath && !this.options.serverName) {\n throw new MCPConnectionError('Server path or server name is required for connection');\n }\n\n // Test connection by doing a quick tool list operation\n try {\n await this.testConnection();\n if (this.options.debug) {\n this.logger.debug('Connection test successful').catch(() => {});\n }\n } catch (error) {\n // Preserve timeout classification for callers/tests\n if (error instanceof MCPTimeoutError) {\n throw error;\n }\n throw new MCPConnectionError(\n `MCP server connection test failed: ${error instanceof Error ? error.message : String(error)}`,\n error as Error\n );\n }\n }\n\n async disconnect(): Promise<void> {\n // Per-operation pattern - no persistent connections to disconnect\n if (this.options.debug) {\n this.logger.debug('Disconnect called (no persistent connections in per-operation mode)').catch(() => {});\n }\n }\n\n async callTool(request: ToolCallRequest): Promise<ToolCallResponse> {\n // Check rate limiting\n if (!this.rateLimitMonitor.isRequestAllowed(request.toolName)) {\n const waitTime = this.rateLimitMonitor.getTimeUntilAllowed(request.toolName);\n throw new MCPConnectionError(`Rate limit exceeded for tool ${request.toolName}. Try again in ${Math.ceil(waitTime / 1000)} seconds.`);\n }\n\n const startTime = Date.now();\n const toolId = `${request.toolName}_${startTime}`;\n\n // Create fresh connection for this operation (per-operation pattern)\n const { transport, client } = await this.createConnection();\n\n try {\n this.emit('tool:start', { toolName: request.toolName, toolId, arguments: request.arguments });\n\n // Emit detailed progress event for verbose mode\n await this.emitProgressEvent({\n sessionId: this.currentSessionId || 'unknown',\n timestamp: new Date(),\n backend: 'mcp',\n count: this.getNextEventCount(),\n type: 'tool_start',\n content: `Starting ${request.toolName}${request.arguments ? ` with arguments: ${JSON.stringify(request.arguments)}` : ''}`,\n toolId,\n metadata: {\n toolName: request.toolName,\n arguments: request.arguments,\n phase: 'initialization'\n }\n });\n\n // Record tool start in progress stream\n if (this.progressStreamManager && this.currentSessionId) {\n this.progressStreamManager.recordToolStart(\n this.currentSessionId,\n request.toolName,\n { arguments: request.arguments, toolId }\n );\n }\n\n if (this.options.debug) {\n this.logger.debug(`Calling tool: ${request.toolName} ${JSON.stringify(request.arguments)}`).catch(() => {});\n }\n\n // Record the request for rate limiting\n this.rateLimitMonitor.recordRequest(request.toolName);\n\n // Emit connection progress\n await this.emitProgressEvent({\n sessionId: this.currentSessionId || 'unknown',\n timestamp: new Date(),\n backend: 'mcp',\n count: this.getNextEventCount(),\n type: 'info',\n content: `Connecting to MCP server for ${request.toolName}`,\n toolId,\n metadata: {\n toolName: request.toolName,\n phase: 'connection'\n }\n });\n\n // Connect and call the tool with timeout\n const timeoutMs = this.options.timeout || 30000; // Default 30 seconds\n await this.connectWithTimeout(client, transport, timeoutMs);\n\n // Emit execution progress\n await this.emitProgressEvent({\n sessionId: this.currentSessionId || 'unknown',\n timestamp: new Date(),\n backend: 'mcp',\n count: this.getNextEventCount(),\n type: 'thinking',\n content: `Executing ${request.toolName} on subagent`,\n toolId,\n metadata: {\n toolName: request.toolName,\n phase: 'execution'\n }\n });\n\n // Apply timeout to tool call - prioritize request timeout over client options\n const timeout = request.timeout || this.options.timeout || this.subagentMapper.getDefaults('claude').timeout;\n this.logger.debug(`Using timeout: ${timeout}ms (request.timeout=${request.timeout}, options.timeout=${this.options.timeout}, default=${this.subagentMapper.getDefaults('claude').timeout})`).catch(() => {});\n // Enforce timeout at the top level as well, so tests that mock\n // callToolWithTimeout still respect the configured timeout.\n const result = await new Promise<any>((resolve, reject) => {\n const guard = setTimeout(() => {\n reject(new MCPTimeoutError(`Tool call '${request.toolName}' timed out after ${timeout}ms`));\n }, timeout);\n\n this.callToolWithTimeout(client, {\n name: request.toolName,\n arguments: request.arguments || {}\n }, timeout)\n .then(r => { clearTimeout(guard); resolve(r); })\n .catch(e => { clearTimeout(guard); reject(e); });\n });\n\n const duration = Date.now() - startTime;\n\n // Parse the response\n const content = this.extractToolResult(result);\n\n // Emit processing completion progress\n await this.emitProgressEvent({\n sessionId: this.currentSessionId || 'unknown',\n timestamp: new Date(),\n backend: 'mcp',\n count: this.getNextEventCount(),\n type: 'tool_result',\n content: `${request.toolName} completed successfully (${duration}ms)${content.length > 100 ? ` - Response: ${content.substring(0, 100)}...` : ` - Response: ${content}`}`,\n toolId,\n metadata: {\n toolName: request.toolName,\n duration,\n success: true,\n responseLength: content.length,\n phase: 'completion'\n }\n });\n\n // Check for rate limit info in response\n const rateLimitInfo = this.parseRateLimitInfo(content);\n if (rateLimitInfo) {\n this.rateLimitMonitor.updateRateLimit(rateLimitInfo.remaining, rateLimitInfo.resetTime);\n }\n\n const response: ToolCallResponse = {\n toolId,\n content,\n success: true,\n duration,\n timestamp: new Date(),\n status: 'COMPLETED'\n };\n\n // Record tool completion in progress stream\n if (this.progressStreamManager && this.currentSessionId) {\n this.progressStreamManager.recordToolComplete(\n this.currentSessionId,\n request.toolName,\n duration,\n true\n );\n }\n\n this.emit('tool:complete', response);\n\n if (this.options.debug) {\n this.logger.debug(`Tool call completed in ${duration}ms`).catch(() => {});\n }\n\n return response;\n\n } catch (error) {\n if (error instanceof MCPTimeoutError) {\n // Surface timeout errors directly for callers/tests\n throw error;\n }\n const duration = Date.now() - startTime;\n\n // Emit error progress event\n await this.emitProgressEvent({\n sessionId: this.currentSessionId || 'unknown',\n timestamp: new Date(),\n backend: 'mcp',\n count: this.getNextEventCount(),\n type: 'error',\n content: `${request.toolName} failed after ${duration}ms: ${error instanceof Error ? error.message : String(error)}`,\n toolId,\n metadata: {\n toolName: request.toolName,\n duration,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n phase: 'error'\n }\n });\n\n // Record tool failure in progress stream\n if (this.progressStreamManager && this.currentSessionId) {\n this.progressStreamManager.recordToolComplete(\n this.currentSessionId,\n request.toolName,\n duration,\n false,\n error instanceof Error ? error.message : String(error)\n );\n }\n\n this.emit('tool:error', { toolName: request.toolName, toolId, error, duration });\n\n if (this.options.debug) {\n this.logger.error(`Tool call failed after ${duration}ms: ${error instanceof Error ? error.message : String(error)}`).catch(() => {});\n }\n\n throw new MCPToolError(\n `Tool call failed: ${error instanceof Error ? error.message : String(error)}`,\n { name: request.toolName, subagent: 'unknown' },\n 'tool_execution',\n {\n code: MCPErrorCode.TOOL_EXECUTION_FAILED,\n cause: error as Error,\n metadata: { arguments: request.arguments }\n }\n );\n } finally {\n // Always cleanup - this is the key to per-operation pattern\n try {\n await client.close();\n } catch (cleanupError) {\n // Suppress cleanup errors like Python does\n if (this.options.debug) {\n console.debug('[MCP] Cleanup error suppressed:', cleanupError);\n }\n }\n }\n }\n\n async listTools(): Promise<ToolInfo[]> {\n // Use per-operation pattern for listing tools\n const { transport, client } = await this.createConnection();\n\n try {\n // Connect with timeout\n const timeoutMs = this.options.timeout || 30000; // Default 30 seconds\n await this.connectWithTimeout(client, transport, timeoutMs);\n const result = await client.listTools(undefined, { timeout: timeoutMs, resetTimeoutOnProgress: true });\n\n return result.tools.map(tool => ({\n name: tool.name,\n description: tool.description || '',\n inputSchema: tool.inputSchema\n }));\n } catch (error) {\n throw new MCPConnectionError(`Failed to list tools: ${error instanceof Error ? error.message : String(error)}`, error as Error);\n } finally {\n try {\n await client.close();\n } catch (cleanupError) {\n if (this.options.debug) {\n console.debug('[MCP] Cleanup error suppressed:', cleanupError);\n }\n }\n }\n }\n\n getConnectionStatus(): 'connected' | 'disconnected' | 'connecting' | 'error' {\n // Per-operation pattern - connection status is always 'connected' if server is available\n const now = Date.now();\n if (now - this.lastConnectionTest > this.connectionTestInterval) {\n // Test connection periodically in background\n this.testConnection().then(() => {\n this.lastConnectionTest = now;\n }).catch(() => {\n // Connection test failed - will be caught on next actual operation\n });\n }\n return 'connected'; // Assume connected until proven otherwise\n }\n\n async ping(): Promise<boolean> {\n try {\n await this.testConnection();\n return true;\n } catch {\n return false;\n }\n }\n\n isConnected(): boolean {\n // For per-operation pattern, we're \"connected\" if we can reach the server\n return true; // Let actual operations determine connectivity\n }\n\n getHealth(): any {\n return {\n state: this.getConnectionStatus(),\n uptime: Date.now() - (this.sessionManager as any).startTime,\n successfulOperations: (this.rateLimitMonitor as any).successCount || 0,\n failedOperations: (this.rateLimitMonitor as any).errorCount || 0,\n avgResponseTime: 500,\n errorStreak: 0,\n };\n }\n\n async getSubagentInfo(subagentType: string): Promise<any> {\n const mapper = SubagentMapper.getAvailableSubagents();\n const info = mapper.find(s => s.name === subagentType);\n\n if (!info) {\n throw new MCPValidationError(`Unknown subagent type: ${subagentType}`, 'subagent', null);\n }\n\n return {\n ...info,\n status: this.isConnected() ? 'available' : 'unavailable',\n performance: {\n avgResponseTime: 500,\n successRate: 0.95,\n }\n };\n }\n\n onProgress(callback: ProgressCallback): () => void {\n return this.progressTracker.addCallback(callback);\n }\n\n createSession(userId?: string, metadata?: any): any {\n return this.sessionManager.createSession(undefined, userId, metadata);\n }\n\n getSession(sessionId: string): any {\n return this.sessionManager.getSession(sessionId);\n }\n\n getSessionStatistics(): any {\n return this.sessionManager.getStatistics();\n }\n\n getRateLimitStatus(): any {\n return this.rateLimitMonitor.getStatus();\n }\n\n getSubagentMapper(): any {\n return this.subagentMapper;\n }\n\n updateSessionState(sessionId: string, state: string): void {\n this.sessionManager.updateSessionState(sessionId, state);\n }\n\n endSession(sessionId: string): void {\n this.sessionManager.endSession(sessionId);\n }\n\n dispose(): void {\n // Clean up progress streaming\n if (this.progressStreamManager) {\n this.progressStreamManager.destroy();\n }\n\n this.disconnect().catch(() => {\n // Ignore cleanup errors\n });\n }\n\n // Progress Streaming Methods\n\n /**\n * Start progress streaming for the current session\n */\n async startProgressStreaming(sessionId?: string): Promise<void> {\n if (!this.progressStreamManager) {\n throw new Error('Progress streaming not enabled. Set enableProgressStreaming to true in options.');\n }\n\n const streamSessionId = sessionId || this.currentSessionId;\n if (!streamSessionId) {\n throw new Error('No session ID available for progress streaming');\n }\n\n await this.progressStreamManager.startStream(streamSessionId);\n }\n\n /**\n * Stop progress streaming for the current session\n */\n async stopProgressStreaming(sessionId?: string): Promise<void> {\n if (!this.progressStreamManager) return;\n\n const streamSessionId = sessionId || this.currentSessionId;\n if (streamSessionId) {\n await this.progressStreamManager.stopStream(streamSessionId);\n }\n }\n\n /**\n * Record iteration start in progress stream\n */\n recordIterationStart(iterationNumber: number, totalIterations?: number): void {\n if (this.progressStreamManager && this.currentSessionId) {\n this.progressStreamManager.recordIterationStart(\n this.currentSessionId,\n iterationNumber,\n totalIterations\n );\n }\n }\n\n /**\n * Record iteration completion in progress stream\n */\n recordIterationComplete(iterationNumber: number): void {\n if (this.progressStreamManager && this.currentSessionId) {\n this.progressStreamManager.recordIterationComplete(\n this.currentSessionId,\n iterationNumber\n );\n }\n }\n\n /**\n * Get the progress stream manager instance\n */\n getProgressStreamManager(): ProgressStreamManager | undefined {\n return this.progressStreamManager;\n }\n\n /**\n * Get current session metrics\n */\n getCurrentSessionMetrics() {\n if (!this.progressStreamManager || !this.currentSessionId) {\n return null;\n }\n return this.progressStreamManager.getMetrics(this.currentSessionId);\n }\n\n /**\n * Check if progress streaming is active\n */\n isProgressStreamingActive(): boolean {\n if (!this.progressStreamManager || !this.currentSessionId) {\n return false;\n }\n return this.progressStreamManager.isStreaming(this.currentSessionId);\n }\n\n on(event: string, callback: Function): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, []);\n }\n this.eventHandlers.get(event)!.push(callback);\n }\n\n /**\n * Get next event counter value for progress tracking\n */\n private getNextEventCount(): number {\n return ++this.eventCounter;\n }\n\n /**\n * Emit progress event through progress callback system\n */\n private async emitProgressEvent(event: ProgressEvent): Promise<void> {\n if (this.progressTracker) {\n await this.progressTracker.processProgressEvent(event);\n }\n }\n\n private emit(event: string, data?: any): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.forEach(handler => {\n try {\n handler(data);\n } catch (error) {\n if (this.options.debug) {\n this.logger.error(`Error in event handler for ${event}: ${error instanceof Error ? error.message : String(error)}`).catch(err => {\n // Ignore logger errors to prevent infinite loops\n });\n }\n }\n });\n }\n }\n\n\n private async connectToNamedServer(): Promise<void> {\n const serverName = this.options.serverName!;\n\n if (this.options.debug) {\n this.logger.debug(`Connecting to named server: ${serverName}`).catch(() => {});\n }\n\n // For named servers like \"roundtable-ai\", we need to check if it's available\n // This could be through a registry, known endpoints, or environment configuration\n const serverConfig = await this.resolveNamedServer(serverName);\n\n if (serverConfig.type === 'executable') {\n // Named server points to an executable - let transport manage the process\n if (this.options.debug) {\n this.logger.debug(`Creating transport for server command: ${serverConfig.command} ${serverConfig.args.join(' ')}`).catch(() => {});\n }\n\n // Create transport for executable-based named server with stderr redirection\n // SECURITY: Only pass hardcoded defaults + user config (NO parent process.env inheritance)\n const mergedEnv = {\n // Hardcoded defaults for MCP server operation\n PYTHONUNBUFFERED: '1',\n MCP_LOG_LEVEL: 'ERROR',\n // User configuration from mcp.json overrides defaults\n ...serverConfig.env\n };\n\n this.transport = new StdioClientTransport({\n command: serverConfig.command,\n args: serverConfig.args || [],\n stderr: 'pipe', // Redirect stderr to prevent console pollution\n env: mergedEnv\n });\n\n // Set up stderr logging for the long-lived transport\n this.setupStderrLogging(this.transport);\n } else if (serverConfig.type === 'url') {\n // Named server is available at a URL (WebSocket, HTTP, etc.)\n throw new MCPConnectionError(`URL-based servers not yet supported for ${serverName}`);\n } else {\n throw new MCPConnectionError(`Unknown server type for ${serverName}`);\n }\n }\n\n private async resolveNamedServer(serverName: string): Promise<{ type: string; command?: string; args?: string[]; env?: Record<string, string>; url?: string }> {\n try {\n // Try to load configuration from .juno_task/mcp.json first\n const { config, command, args } = await MCPServerConfigResolver.getServerConfig(\n serverName,\n this.options.workingDirectory\n );\n\n this.logger.debug(`Resolved server '${serverName}' from configuration`).catch(() => {});\n return {\n type: 'executable',\n command,\n args,\n env: config.env\n };\n } catch (error) {\n this.logger.warning(`Failed to resolve server from config: ${error}`).catch(() => {});\n this.logger.warning(`Falling back to hardcoded server definitions`).catch(() => {});\n\n // Fallback to known server configurations\n const knownServers: Record<string, any> = {\n 'roundtable-ai': {\n type: 'executable',\n command: 'roundtable-mcp-server', // Assumes it's in PATH\n args: []\n }\n };\n\n if (knownServers[serverName]) {\n const config = knownServers[serverName];\n // Verify the command exists before returning it\n if (config.type === 'executable') {\n const commandExists = await this.checkCommandExists(config.command);\n if (!commandExists) {\n throw new MCPConnectionError(\n `MCP server \"${config.command}\" not found in PATH. Please run 'juno-task init' to create .juno_task/mcp.json`,\n undefined,\n undefined,\n {\n recoverySuggestions: [\n 'Run \"juno-task init\" to create .juno_task/mcp.json configuration',\n 'Install the roundtable MCP server: pip install roundtable-mcp-server',\n 'Ensure roundtable-mcp-server is in your PATH',\n 'Set JUNO_TASK_MCP_SERVER_PATH to point to the server executable',\n 'Check if the server is properly installed'\n ]\n }\n );\n }\n }\n return config;\n }\n\n // Try to find in common locations as final fallback\n const possiblePaths = [\n `${serverName}`, // Assume it's in PATH\n `/usr/local/bin/${serverName}`,\n path.resolve(os.homedir(), `.local/bin/${serverName}`),\n path.resolve(this.options.workingDirectory || process.cwd(), `${serverName}`),\n ];\n\n for (const serverPath of possiblePaths) {\n try {\n const stats = await fsPromises.stat(serverPath);\n if (stats.isFile()) {\n return {\n type: 'executable',\n command: serverPath,\n args: []\n };\n }\n } catch {\n // Continue to next path\n }\n }\n\n throw new MCPConnectionError(\n `Named server \"${serverName}\" not found. Please run 'juno-task init' to create .juno_task/mcp.json configuration.`\n );\n }\n }\n\n private async checkCommandExists(command: string): Promise<boolean> {\n return new Promise((resolve) => {\n const checkProcess = spawn('which', [command], {\n stdio: ['ignore', 'pipe', 'pipe']\n });\n\n checkProcess.on('close', (code) => {\n resolve(code === 0);\n });\n\n checkProcess.on('error', () => {\n resolve(false);\n });\n });\n }\n\n\n /**\n * Create a fresh connection for per-operation pattern\n */\n private async createConnection(): Promise<{ transport: StdioClientTransport; client: Client }> {\n let transport: StdioClientTransport;\n\n // Handle server connection based on options\n if (this.options.serverName) {\n // Connect to named MCP server (e.g., \"roundtable-ai\")\n const serverConfig = await this.resolveNamedServer(this.options.serverName);\n if (serverConfig.type === 'executable') {\n // SECURITY: Only pass hardcoded defaults + user config (NO parent process.env inheritance)\n const mergedEnv = {\n // Hardcoded defaults for MCP server operation\n PYTHONUNBUFFERED: '1',\n MCP_LOG_LEVEL: 'ERROR',\n // User configuration from mcp.json overrides defaults\n ...serverConfig.env\n };\n\n transport = new StdioClientTransport({\n command: serverConfig.command!,\n args: serverConfig.args || [],\n stderr: 'pipe', // Redirect stderr to prevent console pollution\n env: mergedEnv\n });\n } else {\n throw new MCPConnectionError(`Unsupported server type: ${serverConfig.type}`);\n }\n } else {\n // Create transport using command approach with stderr redirection\n const serverPath = this.options.serverPath!;\n const isPython = serverPath.endsWith('.py');\n\n // SECURITY: Only pass hardcoded defaults + user config (NO parent process.env inheritance)\n const mergedEnv = {\n // Hardcoded defaults for MCP server operation\n PYTHONUNBUFFERED: '1',\n MCP_LOG_LEVEL: 'ERROR',\n // User-provided environment from options overrides defaults\n ...this.options.environment\n };\n\n transport = new StdioClientTransport({\n command: isPython ? 'python' : serverPath,\n args: isPython ? [serverPath] : [],\n stderr: 'pipe', // Redirect stderr to prevent console pollution\n env: mergedEnv\n });\n }\n\n // Create MCP client for this operation\n const client = new Client({\n name: 'juno-task-ts',\n version: '1.0.0'\n }, {\n capabilities: {\n tools: {}\n }\n // Note: timeout applied at request level, not client level\n });\n\n // Set up stderr logging to prevent console pollution\n this.setupStderrLogging(transport);\n\n return { transport, client };\n }\n\n /**\n * Test connection by doing a quick operation\n */\n /**\n * Call tool with configurable timeout\n */\n private async callToolWithTimeout(\n client: Client,\n toolRequest: { name: string; arguments: Record<string, any> },\n timeoutMs: number,\n attempt: number = 1\n ): Promise<any> {\n this.logger.debug(`callToolWithTimeout: Starting ${toolRequest.name} with ${timeoutMs}ms timeout (attempt ${attempt})`).catch(() => {});\n const startTime = Date.now();\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n const actualDuration = Date.now() - startTime;\n this.logger.debug(`callToolWithTimeout: TIMEOUT triggered for ${toolRequest.name} after ${actualDuration}ms (expected ${timeoutMs}ms)`).catch(() => {});\n reject(new MCPTimeoutError(`Tool call '${toolRequest.name}' timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n /*\n * IMPORTANT SCHEMA NOTE: Correct callTool usage with Progress Callbacks\n *\n * Previous INCORRECT implementation:\n * client.callTool(toolRequest, { timeout, ... })\n *\n * Current CORRECT implementation:\n * client.callTool(toolRequest, undefined, requestOptions)\n *\n * Based on user feedback and Python budi-cli implementation analysis:\n * - Use RequestOptions.onprogress for proper MCP progress handling\n * - Progress callback should handle Callbacks\n * - maxTotalTimeout is necessary.\n *\n * The user identified that ESLint would have caught this schema error immediately.\n */\n\n // Create proper progress callback based on Python budi-cli implementation\n const progressCallback = (progress: any) => {\n // Handle progress events similar to Python version\n const logger = getMCPLogger();\n logger.debug(`Progress event: ${JSON.stringify(progress)}`).catch(() => {});\n\n if (this.options.debug) {\n // In debug mode, progress events should stay visible but go to stderr to avoid mixing with user input\n // Use terminal-aware progress writer to properly coordinate with active user input\n // This prevents visual mixing of progress output with user-typed characters\n writeTerminalProgressWithPrefix('[MCP] Progress event:', progress);\n }\n\n // Extract progress information and route to existing progress system\n try {\n if (typeof progress === 'object' && progress !== null) {\n const progressValue = progress.progress || progress.percent || 0;\n const message = progress.message || '';\n\n // Emit progress event for existing progress handling system\n this.emit('progress', {\n toolName: toolRequest.name,\n progress: progressValue,\n message,\n timestamp: new Date(),\n data: progress\n });\n }\n } catch (error) {\n // Never break execution on progress callback issues\n if (this.options.debug) {\n this.logger.debug(`Progress callback error (non-critical): ${error}`);\n }\n }\n };\n\n // Use proper RequestOptions interface\n const requestOptions = {\n timeout: Math.max(timeoutMs, 55000), //The bigger the better.\n resetTimeoutOnProgress: true,\n onprogress: progressCallback,\n maxTotalTimeout: timeoutMs *1000\n };\n //client.callTool(toolRequest, undefined, requestOptions) #This is a correct signature, it wont work without the undefined parameter.\n client.callTool(toolRequest, undefined, requestOptions)\n .then(result => {\n const actualDuration = Date.now() - startTime;\n this.logger.debug(`callToolWithTimeout: COMPLETED ${toolRequest.name} in ${actualDuration}ms`).catch(() => {});\n clearTimeout(timer);\n resolve(result);\n })\n .catch(async error => {\n const actualDuration = Date.now() - startTime;\n this.logger.debug(`callToolWithTimeout: ERROR for ${toolRequest.name} after ${actualDuration}ms: ${error.message}`).catch(() => {});\n clearTimeout(timer);\n\n // Check for MCP SDK internal timeout error (-32001)\n if (error.message.includes('32001') || error.message.includes('Request timed out')) {\n this.logger.debug(`Detected SDK internal timeout, implementing retry mechanism...`).catch(() => {});\n //No Retry!!!! It is not allowed.\n if (attempt < 0) { // No Retries\n this.logger.debug(`Retrying ${toolRequest.name} (attempt ${attempt + 1})...`).catch(() => {});\n\n // Create fresh connection\n try {\n const { transport: newTransport, client: newClient } = await this.createConnection();\n await this.connectWithTimeout(newClient, newTransport, 300000);\n\n // Retry with fresh connection\n const retryResult = await this.callToolWithTimeout(newClient, toolRequest, timeoutMs, attempt + 1);\n resolve(retryResult);\n return;\n } catch (retryError) {\n this.logger.debug(`Retry attempt ${attempt + 1} failed: ${retryError.message}`).catch(() => {});\n reject(retryError);\n return;\n }\n } else {\n this.logger.debug(`Max retry attempts reached for ${toolRequest.name}`).catch(() => {});\n }\n }\n\n reject(error);\n });\n });\n }\n\n /**\n * Connect to MCP client with configurable timeout\n */\n private async connectWithTimeout(\n client: Client,\n transport: StdioClientTransport,\n timeoutMs: number\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n reject(new MCPTimeoutError(`MCP connection timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n client.connect(transport, {\n timeout: timeoutMs,\n resetTimeoutOnProgress: true\n // Note: maxTotalTimeout is NOT set to allow indefinite operation with progress resets\n })\n .then(() => {\n clearTimeout(timer);\n resolve();\n })\n .catch(error => {\n clearTimeout(timer);\n reject(error);\n });\n });\n }\n\n /**\n * Set up stderr logging to redirect MCP server logs to files instead of console\n * This is the main fix for MCP logging pollution issue\n */\n private setupStderrLogging(transport: StdioClientTransport): void {\n try {\n const stderr = transport.stderr;\n const stdout = (transport as any).stdout;\n const stdin = (transport as any).stdin;\n if (stderr) {\n // Get MCP logger for redirecting stderr output\n const mcpLogger = getMCPLogger();\n\n // Set up error logging to capture all stderr output\n stderr.on('data', (chunk: Buffer) => {\n const message = chunk.toString().trim();\n if (message) {\n // Log stderr messages to file only, never to console\n mcpLogger.error(`[MCP-Server] ${message}`, false).catch(() => {\n // Ignore logging errors to prevent infinite loops\n });\n }\n });\n\n // Handle stream errors: log to MCP file, avoid throwing\n stderr.on('error', (err: any) => {\n const emsg = err?.message || String(err);\n const lower = emsg.toLowerCase();\n const isConnectionLike = ['epipe', 'broken pipe', 'econnreset', 'socket hang up', 'err_socket_closed', 'connection reset by peer']\n .some(t => lower.includes(t));\n const prefix = isConnectionLike ? '[MCP-Server][connection]' : '[MCP-Server][stream-error]';\n mcpLogger.error(`${prefix} ${emsg}`, false).catch(() => {});\n // Do not rethrow; preventing process-level 'error' crash\n });\n }\n\n // Best-effort: also attach silent error handlers to stdout/stdin if present\n if (stdout && typeof stdout.on === 'function') {\n stdout.on('error', (err: any) => {\n const message = err?.message || String(err);\n mcpLogger.error(`[MCP-Server][stdout-error] ${message}`, false).catch(() => {});\n });\n }\n if (stdin && typeof stdin.on === 'function') {\n stdin.on('error', (err: any) => {\n const message = err?.message || String(err);\n mcpLogger.error(`[MCP-Server][stdin-error] ${message}`, false).catch(() => {});\n });\n }\n\n // Attach error handlers to underlying transport/process if available\n const anyTransport: any = transport as any;\n const child: any = anyTransport?.child || anyTransport?.process || anyTransport?._child;\n if (child) {\n try {\n child.on?.('error', (err: any) => {\n const message = err?.message || String(err);\n const lower = message.toLowerCase();\n const isConnectionLike = ['epipe', 'broken pipe', 'econnreset', 'socket hang up', 'err_socket_closed', 'connection reset by peer']\n .some(t => lower.includes(t));\n const prefix = isConnectionLike ? '[MCP-Server][child-connection]' : '[MCP-Server][child-error]';\n mcpLogger.error(`${prefix} ${message}`, false).catch(() => {});\n });\n // Guard stdio sockets\n child.stdin?.on?.('error', (err: any) => mcpLogger.error(`[MCP-Server][child-stdin] ${err?.message || err}`, false).catch(() => {}));\n child.stdout?.on?.('error', (err: any) => mcpLogger.error(`[MCP-Server][child-stdout] ${err?.message || err}`, false).catch(() => {}));\n child.stderr?.on?.('error', (err: any) => mcpLogger.error(`[MCP-Server][child-stderr] ${err?.message || err}`, false).catch(() => {}));\n } catch {\n // ignore\n }\n }\n } catch (error) {\n // If stderr logging setup fails, continue without it\n // This prevents the logging fix from breaking the main functionality\n }\n }\n\n private async testConnection(): Promise<void> {\n const { transport, client } = await this.createConnection();\n\n try {\n // Use timeout configuration for connection\n const timeoutMs = this.options.timeout || 30000; // Default 30 seconds\n await this.connectWithTimeout(client, transport, timeoutMs);\n // Test with a simple operation\n await client.listTools(undefined, {\n timeout: timeoutMs,\n resetTimeoutOnProgress: true\n // Note: maxTotalTimeout is NOT set to allow indefinite operation with progress resets\n });\n } finally {\n try {\n await client.close();\n } catch {\n // Suppress cleanup errors\n }\n }\n }\n\n private extractToolResult(result: any): string {\n if (typeof result === 'string') {\n return result;\n }\n\n if (result && typeof result === 'object') {\n // Handle different response formats from MCP SDK\n if (result.content) {\n return Array.isArray(result.content)\n ? result.content.map(c => typeof c === 'string' ? c : JSON.stringify(c)).join('\\n')\n : String(result.content);\n }\n\n if (result.text) {\n return result.text;\n }\n\n return JSON.stringify(result);\n }\n\n return String(result);\n }\n\n private parseRateLimitInfo(content: string): { remaining: number; resetTime: Date } | null {\n // Look for rate limit patterns in the response\n const rateLimitMatch = content.match(/rate limit.+?(\\d+).+?remaining/i);\n const resetMatch = content.match(/resets?\\s+(?:at\\s+)?(\\d{1,2}):(\\d{2})(?:\\s*(AM|PM))?/i);\n\n if (rateLimitMatch) {\n const remaining = parseInt(rateLimitMatch[1]);\n let resetTime = new Date(Date.now() + 3600000); // Default to 1 hour from now\n\n if (resetMatch) {\n const [, hours, minutes, ampm] = resetMatch;\n let hour = parseInt(hours);\n const minute = parseInt(minutes);\n\n if (ampm) {\n if (ampm.toUpperCase() === 'PM' && hour !== 12) {\n hour += 12;\n } else if (ampm.toUpperCase() === 'AM' && hour === 12) {\n hour = 0;\n }\n }\n\n resetTime = new Date();\n resetTime.setHours(hour, minute, 0, 0);\n\n // If the time has already passed today, assume it's tomorrow\n if (resetTime.getTime() <= Date.now()) {\n resetTime.setDate(resetTime.getDate() + 1);\n }\n }\n\n return { remaining, resetTime };\n }\n\n return null;\n }\n}\n\n/**\n * MCP Progress Tracker for parsing and managing progress events\n */\nexport class MCPProgressTracker {\n private callbacks: ProgressCallback[] = [];\n private toolCallPatterns: RegExp[] = [\n /calling\\s+tool[:\\s]*([a-zA-Z_][a-zA-Z0-9_]*)/i,\n /<function_calls>\\s*<invoke name=\"([^\"]+)\"/i,\n /([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\(/,\n ];\n\n private resultPatterns: RegExp[] = [\n /completed[:\\s]*([a-zA-Z_][a-zA-Z0-9_]*)/i,\n /error[:\\s]*([a-zA-Z_][a-zA-Z0-9_]*)/i,\n /<\\/function_calls>/i,\n ];\n\n addCallback(callback: ProgressCallback): () => void {\n this.callbacks.push(callback);\n return () => {\n const index = this.callbacks.indexOf(callback);\n if (index > -1) {\n this.callbacks.splice(index, 1);\n }\n };\n }\n\n async processProgressEvent(event: unknown): Promise<void> {\n try {\n const progressEvent = this.parseProgressEvent(event);\n\n for (const callback of this.callbacks) {\n try {\n await callback(progressEvent);\n } catch (error) {\n // Never break execution on progress callback errors\n console.debug(`Progress callback error: ${error}`);\n }\n }\n } catch (error) {\n console.debug(`Progress event processing error: ${error}`);\n }\n }\n\n private mapEventType(eventType: string): string {\n const mapping: Record<string, string> = {\n 'start': 'tool_start',\n 'complete': 'tool_result',\n 'thinking': 'thinking',\n 'error': 'error',\n 'debug': 'debug',\n 'unknown': 'info',\n 'tool_start': 'tool_start', // Keep tool_start as-is\n 'tool_result': 'tool_result' // Keep tool_result as-is\n };\n return mapping[eventType] || 'info';\n }\n\n parseProgressText(text: string, sessionId: string): ProgressEvent[] {\n // Parse multiple progress events from text\n const lines = text.split('\\n').filter(line => line.trim());\n const events: ProgressEvent[] = [];\n\n for (const line of lines) {\n const event = this.parseProgressEvent(line);\n if (event) {\n // Override sessionId if provided\n event.sessionId = sessionId || event.sessionId;\n events.push(event);\n }\n }\n\n return events;\n }\n\n private parseProgressEvent(event: unknown): ProgressEvent {\n if (typeof event === 'string') {\n return this.parseMessageString(event);\n } else if (typeof event === 'object' && event !== null) {\n return this.parseEventObject(event);\n }\n\n return {\n sessionId: '',\n timestamp: new Date(),\n type: 'message',\n content: String(event)\n };\n }\n\n private parseMessageString(message: string): ProgressEvent {\n // Check for rate limit patterns\n const rateLimitPattern = /rate\\s+limit/i;\n if (rateLimitPattern.test(message)) {\n return {\n sessionId: '',\n timestamp: new Date(),\n type: 'error',\n content: message,\n metadata: {\n rateLimitDetected: true\n }\n };\n }\n\n // Check for specific backend pattern: \"Backend #1: tool_start => Starting analysis\"\n const backendPattern = /^(\\w+)\\s+#(\\d+):\\s+(\\w+)\\s+=>\\s+(.+)$/;\n const backendMatch = message.match(backendPattern);\n if (backendMatch) {\n const [, backend, count, eventType, content] = backendMatch;\n return {\n sessionId: '',\n timestamp: new Date(),\n type: this.mapEventType(eventType) as any,\n content: content,\n backend: backend.toLowerCase(),\n count: parseInt(count, 10),\n toolId: `${backend.toLowerCase()}_${count}`,\n toolName: backend.toLowerCase()\n };\n }\n\n // Detect tool calls\n for (const pattern of this.toolCallPatterns) {\n const match = message.match(pattern);\n if (match) {\n const detectedTool = match[1] || 'unknown';\n return {\n sessionId: '',\n timestamp: new Date(),\n type: 'tool_start',\n content: message,\n toolName: detectedTool,\n metadata: {\n detectedTool: detectedTool\n }\n };\n }\n }\n\n // Detect tool results\n for (const pattern of this.resultPatterns) {\n const match = message.match(pattern);\n if (match) {\n const isError = /error|failed|exception/i.test(message);\n return {\n sessionId: '',\n timestamp: new Date(),\n type: isError ? 'error' : 'tool_result',\n content: message,\n toolName: match[1]\n };\n }\n }\n\n return {\n sessionId: '',\n timestamp: new Date(),\n type: 'message',\n content: message\n };\n }\n\n private parseEventObject(event: object): ProgressEvent {\n const eventObj = event as any;\n\n return {\n sessionId: eventObj.sessionId || '',\n timestamp: new Date(eventObj.timestamp || Date.now()),\n type: eventObj.type || 'message',\n content: eventObj.message || eventObj.content || JSON.stringify(event),\n toolName: eventObj.toolName,\n metadata: eventObj.metadata\n };\n }\n}\n\n/**\n * Subagent Tool Mapping\n */\nexport class SubagentMapper {\n private static readonly SUBAGENT_TOOLS = {\n claude: 'claude_subagent',\n cursor: 'cursor_subagent',\n codex: 'codex_subagent',\n gemini: 'gemini_subagent'\n } as const;\n\n private static readonly SUBAGENT_ALIASES = {\n 'claude-code': 'claude',\n 'claude_code': 'claude',\n 'gemini-cli': 'gemini',\n 'cursor-agent': 'cursor'\n } as const;\n\n static getToolName(subagent: string): string {\n const normalized = this.normalizeSubagentName(subagent);\n const toolName = this.SUBAGENT_TOOLS[normalized as keyof typeof this.SUBAGENT_TOOLS];\n\n if (!toolName) {\n throw new MCPValidationError(`Unknown subagent: ${subagent}`, 'subagent', null);\n }\n\n return toolName;\n }\n\n static normalizeSubagentName(subagent: string): string {\n const normalized = subagent.toLowerCase().trim();\n\n // Check aliases first\n const aliasResult = this.SUBAGENT_ALIASES[normalized as keyof typeof this.SUBAGENT_ALIASES];\n if (aliasResult) {\n return aliasResult;\n }\n\n // Check direct matches\n if (normalized in this.SUBAGENT_TOOLS) {\n return normalized;\n }\n\n throw new MCPValidationError(`Invalid subagent: ${subagent}`, 'subagent', null);\n }\n\n static getAvailableSubagents(): SubagentInfo[] {\n return [\n {\n name: 'claude',\n description: 'Claude by Anthropic - Advanced reasoning and coding',\n capabilities: ['coding', 'analysis', 'reasoning', 'writing'],\n models: ['sonnet-4.5', 'opus-4.1', 'haiku-4.5'],\n aliases: ['claude-code', 'claude_code']\n },\n {\n name: 'cursor',\n description: 'Cursor AI - Specialized code editing and refactoring',\n capabilities: ['code-editing', 'refactoring', 'debugging'],\n models: ['auto','gpt-5','sonnet-4.5', 'sonnet-4', 'sonnet-4-thinking'],\n aliases: ['cursor-agent']\n },\n {\n name: 'codex',\n description: 'OpenAI Codex - Code generation and completion',\n capabilities: ['code-generation', 'completion', 'documentation'],\n models: ['gpt-5'],\n aliases: []\n },\n {\n name: 'gemini',\n description: 'Google Gemini - Multimodal AI with coding capabilities',\n capabilities: ['coding', 'multimodal', 'analysis'],\n models: ['gemini-2.5-pro', 'gemini-2.5-flash'],\n aliases: ['gemini-cli']\n }\n ];\n }\n\n static validateSubagent(name: string): boolean {\n try {\n this.normalizeSubagentName(name);\n return true;\n } catch {\n return false;\n }\n }\n}\n\n/**\n * Connection Manager with Retry Logic\n */\nexport class MCPConnectionManager {\n private client: JunoMCPClient | null = null;\n private retryConfig: RetryConfig;\n\n constructor(\n private config: MCPClientOptions,\n retryConfig?: Partial<RetryConfig>\n ) {\n this.retryConfig = {\n maxRetries: 3,\n baseDelay: 1000,\n maxDelay: 10000,\n backoffFactor: 2,\n ...retryConfig\n };\n }\n\n async connect(): Promise<JunoMCPClient> {\n if (this.client && this.client.isConnected()) {\n return this.client;\n }\n\n const connectWithRetry = async (): Promise<JunoMCPClient> => {\n const client = new JunoMCPClient(this.config);\n await client.connect();\n return client;\n };\n\n this.client = await this.retryWithBackoff(connectWithRetry);\n return this.client;\n }\n\n async disconnect(): Promise<void> {\n if (this.client) {\n await this.client.disconnect();\n this.client = null;\n }\n }\n\n async ensureConnected(): Promise<JunoMCPClient> {\n if (!this.client || !this.client.isConnected()) {\n return await this.connect();\n }\n\n // Test connection health\n try {\n await this.client.ping();\n return this.client;\n } catch (error) {\n console.warn('MCP connection test failed, reconnecting:', error);\n await this.disconnect();\n return await this.connect();\n }\n }\n\n private async retryWithBackoff<T>(fn: () => Promise<T>): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 0; attempt <= this.retryConfig.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n if (attempt < this.retryConfig.maxRetries) {\n const delay = Math.min(\n this.retryConfig.baseDelay * Math.pow(this.retryConfig.backoffFactor, attempt),\n this.retryConfig.maxDelay\n );\n\n console.debug(`Retry attempt ${attempt + 1} in ${delay}ms`);\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError!;\n }\n}\n\n/**\n * Server Configuration Resolution\n */\nexport class MCPServerConfigResolver {\n /**\n * Get server configuration from .juno_task/mcp.json\n */\n static async getServerConfig(\n serverName?: string,\n workingDirectory?: string\n ): Promise<{ config: MCPServerConfig; command: string; args: string[] }> {\n try {\n const serverConfig = await MCPConfigLoader.getServerConfig(serverName, workingDirectory);\n\n // Validate that the server script exists\n if (serverConfig.args.length > 0) {\n const serverScript = serverConfig.args[0];\n await this.validateServerPath(serverScript);\n }\n\n const logger = getMCPLogger();\n logger.debug(`Using server config: ${serverConfig.name}`).catch(() => {});\n logger.debug(`Command: ${serverConfig.command}`).catch(() => {});\n logger.debug(`Args: ${serverConfig.args.join(' ')}`).catch(() => {});\n\n return {\n config: serverConfig,\n command: serverConfig.command,\n args: serverConfig.args\n };\n } catch (error) {\n throw new MCPConnectionError(\n `MCP configuration not found. Please run 'juno-task init' to create .juno_task/mcp.json or ensure the configuration file exists in your project directory.`\n );\n }\n }\n\n\n\n static async validateServerPath(serverPath: string): Promise<boolean> {\n try {\n const stats = await fsPromises.stat(serverPath);\n const isValid = stats.isFile();\n if (!isValid) {\n throw new MCPConnectionError(`MCP server script not found: ${serverPath}`);\n }\n return true;\n } catch (error) {\n throw new MCPConnectionError(`MCP server validation failed: ${serverPath} - ${error}`);\n }\n }\n\n /**\n * Check if MCP configuration is available\n */\n static async hasConfig(workingDirectory?: string): Promise<boolean> {\n return MCPConfigLoader.hasConfig(workingDirectory);\n }\n\n static createServerConfig(\n serverConfig: MCPServerConfig,\n options: Partial<MCPClientOptions> = {}\n ): MCPClientOptions {\n return {\n serverPath: serverConfig.args[0], // For backwards compatibility\n serverName: serverConfig.name,\n timeout: (serverConfig.timeout * 1000) || 120000, // Server config timeout (user timeout applied at request level)\n retries: 3,\n environment: serverConfig.env,\n ...options\n };\n }\n}\n\n// Export the main implementation classes\nexport type MCPClient = JunoMCPClient;\n\n/**\n * Create an MCP client instance with automatic configuration loading\n */\nexport function createMCPClient(options: MCPClientOptions = {}): JunoMCPClient {\n // Allow environment variable to define timeout if not explicitly provided\n if (options.timeout == null && process.env.JUNO_TASK_MCP_TIMEOUT) {\n const parsed = Number(process.env.JUNO_TASK_MCP_TIMEOUT);\n if (!Number.isNaN(parsed) && parsed > 0) {\n options.timeout = parsed;\n }\n }\n return new JunoMCPClient(options);\n}\n\n/**\n * Create an MCP client instance using configuration from .juno_task/mcp.json\n */\nexport async function createMCPClientFromConfig(\n serverName?: string,\n workingDirectory?: string,\n additionalOptions: Partial<MCPClientOptions> = {}\n): Promise<JunoMCPClient> {\n try {\n const { config } = await MCPServerConfigResolver.getServerConfig(serverName, workingDirectory);\n const clientOptions = MCPServerConfigResolver.createServerConfig(config, {\n workingDirectory,\n ...additionalOptions\n });\n\n const logger = getMCPLogger();\n logger.debug(`Creating client with configuration: ${config.name}`).catch(() => {});\n return new JunoMCPClient(clientOptions);\n } catch (error) {\n // Log to file instead of console to avoid pollution\n const logger = getMCPLogger();\n logger.debug(`Failed to create client from config: ${error}`).catch(() => {});\n logger.debug(`Creating client with provided options or defaults`).catch(() => {});\n\n // Fallback to basic client creation\n return new JunoMCPClient({\n serverName, // Include the server name even when config loading fails\n workingDirectory,\n ...additionalOptions\n });\n }\n}\n\n// Keep compatibility with existing stub classes but mark as deprecated\nexport class RateLimitMonitor {\n private requestCounts: Map<string, number> = new Map();\n private windowStart: number = Date.now();\n private globalRemaining: number = -1;\n private globalResetTime?: Date;\n\n constructor(private config: any) {}\n\n isRequestAllowed(toolName: string): boolean {\n const maxRequests = this.config.maxRequests || 10;\n const windowMs = this.config.windowMs || 60000;\n\n const now = Date.now();\n if (now - this.windowStart >= windowMs) {\n this.requestCounts.clear();\n this.windowStart = now;\n }\n\n const currentCount = this.requestCounts.get(toolName) || 0;\n\n if (this.globalRemaining >= 0 && this.globalRemaining <= 0) {\n return false;\n }\n\n return currentCount < maxRequests;\n }\n\n recordRequest(toolName: string): void {\n const currentCount = this.requestCounts.get(toolName) || 0;\n this.requestCounts.set(toolName, currentCount + 1);\n\n if (this.globalRemaining > 0) {\n this.globalRemaining--;\n }\n }\n\n updateRateLimit(remaining: number, resetTime: Date): void {\n this.globalRemaining = remaining;\n this.globalResetTime = resetTime;\n }\n\n getTimeUntilAllowed(toolName: string): number {\n const maxRequests = this.config.maxRequests || 10;\n const windowMs = this.config.windowMs || 60000;\n const currentCount = this.requestCounts.get(toolName) || 0;\n\n if (currentCount < maxRequests) {\n return 0;\n }\n\n const timeInWindow = Date.now() - this.windowStart;\n return Math.max(0, windowMs - timeInWindow);\n }\n\n getStatus(): any {\n return {\n globalRemaining: this.globalRemaining,\n globalResetTime: this.globalResetTime,\n activeWindows: this.requestCounts.size,\n };\n }\n}\n\nexport class SubagentMapperImpl {\n mapToToolName(subagentType: string): string {\n return SubagentMapper.getToolName(subagentType);\n }\n\n validateModel(subagentType: string, model: string): boolean {\n const validModels: Record<string, string[]> = {\n 'claude': ['sonnet-4.5', 'opus-4.1', 'haiku-4.5'],\n 'cursor': ['auto','gpt-5','sonnet-4', 'sonnet-4.5', 'sonnet-4-thinking'],\n 'codex': ['gpt-5'],\n 'gemini': ['gemini-2.5-pro', 'gemini-2.5-flash'],\n };\n\n const models = validModels[subagentType];\n return models ? models.includes(model) : false;\n }\n\n getDefaultModel(subagentType: string): string {\n const defaults: Record<string, string> = {\n 'claude': 'sonnet-4.5',\n 'cursor': 'auto',\n 'codex': 'gpt-5',\n 'gemini': 'gemini-2.5-pro',\n };\n return defaults[subagentType] || 'default-model';\n }\n\n getDefaults(subagentType: string): any {\n return {\n timeout: 36000000,\n model: this.getDefaultModel(subagentType),\n arguments: {},\n priority: 'normal',\n };\n }\n\n getAvailableSubagents(): string[] {\n return ['claude', 'cursor', 'codex', 'gemini'];\n }\n\n getAvailableAliases(): string[] {\n return ['claude-code', 'claude_code', 'gemini-cli', 'cursor-agent'];\n }\n}\n\nexport class SessionContextManager {\n private sessions: Map<string, any> = new Map();\n\n createSession(sessionId?: string, userId?: string, metadata?: any): any {\n const id = sessionId || `session-${Date.now()}`;\n const session = {\n sessionId: id,\n userId,\n metadata: metadata || {},\n activeToolCalls: [],\n state: SessionState.INITIALIZING,\n startTime: new Date(),\n lastActivity: new Date(),\n };\n this.sessions.set(id, session);\n return session;\n }\n\n getSession(sessionId: string): any {\n return this.sessions.get(sessionId);\n }\n\n updateSessionState(sessionId: string, state: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.state = state;\n session.lastActivity = new Date();\n }\n }\n\n endSession(sessionId: string): void {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.state = SessionState.COMPLETED;\n }\n }\n\n getStatistics(): any {\n const sessions = Array.from(this.sessions.values());\n return {\n totalSessions: sessions.length,\n activeSessions: sessions.filter(s => s.state === SessionState.ACTIVE).length,\n idleSessions: sessions.filter(s => s.state === SessionState.IDLE).length,\n completedSessions: sessions.filter(s => s.state === SessionState.COMPLETED).length,\n totalActiveToolCalls: sessions.reduce((sum, s) => sum + s.activeToolCalls.length, 0),\n };\n }\n}\n\n// Add missing classes expected by tests\nexport class ProgressEventParser {\n private eventCounter: number = 0;\n\n constructor(private sessionId: string) {}\n\n parseProgressText(text: string): ProgressEvent[] {\n const tracker = new MCPProgressTracker();\n const events = tracker.parseProgressText(text, this.sessionId);\n\n // Add count to each event\n return events.map(event => ({\n ...event,\n count: ++this.eventCounter\n }));\n }\n\n reset(): void {\n this.eventCounter = 0;\n }\n\n extractRateLimitInfo(content: string): Date | null {\n // Parse various rate limit reset patterns\n const patterns = [\n /(\\d+)\\s+minutes?\\s+(\\d+)\\s+seconds?/i, // \"5 minutes 30 seconds\"\n /(\\d+)\\s+minutes?/i, // \"5 minutes\"\n /(\\d+)\\s+seconds?/i, // \"30 seconds\"\n /(\\d{1,2}):(\\d{2})\\s*([AP]M)?/i, // \"3:30 PM\" or \"15:30\"\n /(\\d{10,13})/, // Unix timestamp\n /(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2})/ // ISO format\n ];\n\n for (const pattern of patterns) {\n const match = content.match(pattern);\n if (match) {\n if (content.includes('minutes') || content.includes('seconds')) {\n // Parse relative time\n const minutes = content.match(/(\\d+)\\s+minutes?/i);\n const seconds = content.match(/(\\d+)\\s+seconds?/i);\n const totalSeconds = (minutes ? parseInt(minutes[1]) * 60 : 0) +\n (seconds ? parseInt(seconds[1]) : 0);\n return new Date(Date.now() + totalSeconds * 1000);\n } else if (match[0].includes(':')) {\n // Parse time format\n const [, hours, minutes, ampm] = match;\n const hour24 = ampm?.toUpperCase() === 'PM' && parseInt(hours) !== 12\n ? parseInt(hours) + 12\n : parseInt(hours);\n const resetTime = new Date();\n resetTime.setHours(hour24 || parseInt(hours), parseInt(minutes), 0, 0);\n return resetTime;\n } else if (match[0].length >= 10) {\n // Unix timestamp or ISO format\n return new Date(match[0].length === 10 ? parseInt(match[0]) * 1000 : match[0]);\n }\n }\n }\n\n return null;\n }\n}\n\nexport class StubMCPClient {\n private client: JunoMCPClient;\n\n constructor(options: MCPClientOptions) {\n this.client = new JunoMCPClient(options);\n }\n\n async connect(): Promise<void> {\n return this.client.connect();\n }\n\n async disconnect(): Promise<void> {\n return this.client.disconnect();\n }\n\n async callTool(request: ToolCallRequest): Promise<ToolCallResponse> {\n return this.client.callTool(request);\n }\n\n async listTools(): Promise<ToolInfo[]> {\n return this.client.listTools();\n }\n\n getConnectionStatus(): string {\n return this.client.getConnectionStatus();\n }\n}\n\nexport class ServerPathDiscovery {\n static findServerPath(cwd: string, currentFile: string): string {\n return ServerPathResolver.findServerPath(cwd, currentFile);\n }\n\n static createServerConfig(serverPath: string, options?: Partial<MCPClientOptions>): MCPClientOptions {\n return ServerPathResolver.createServerConfig(serverPath, options);\n }\n\n static async validateServerPath(serverPath: string): Promise<boolean> {\n try {\n const stats = await fsPromises.stat(serverPath);\n return stats.isFile();\n } catch {\n return false;\n }\n }\n\n\n static async getServerInfo(serverPath: string): Promise<any> {\n try {\n const stats = await fsPromises.stat(serverPath);\n return {\n path: serverPath,\n size: stats.size,\n lastModified: stats.mtime,\n exists: true,\n executable: true, // Simplified check\n isExecutable: true,\n version: 'unknown'\n };\n } catch {\n return {\n path: serverPath,\n exists: false,\n executable: false,\n size: 0,\n modified: new Date(0)\n };\n }\n }\n}\n\nexport class ConnectionRetryManager {\n constructor(private config: RetryConfig) {}\n\n async executeWithRetry<T>(fn: () => Promise<T>): Promise<T> {\n let lastError: Error;\n\n for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error as Error;\n\n // Don't retry validation errors - they won't succeed on retry\n if (error instanceof MCPValidationError) {\n throw error;\n }\n\n if (attempt < this.config.maxRetries) {\n const delay = Math.min(\n this.config.baseDelay * Math.pow(this.config.backoffFactor, attempt),\n this.config.maxDelay\n );\n await new Promise(resolve => setTimeout(resolve, delay));\n }\n }\n }\n\n throw lastError!;\n }\n}\n\nexport class ProgressCallbackManager {\n private callbacks: ProgressCallback[] = [];\n\n addCallback(callback: ProgressCallback): void {\n this.callbacks.push(callback);\n }\n\n removeCallback(callback: ProgressCallback): void {\n const index = this.callbacks.indexOf(callback);\n if (index > -1) {\n this.callbacks.splice(index, 1);\n }\n }\n\n async notifyCallbacks(event: ProgressEvent): Promise<void> {\n for (const callback of this.callbacks) {\n try {\n await callback(event);\n } catch (error) {\n // Suppress callback errors\n console.debug(`Progress callback error: ${error}`);\n }\n }\n }\n}\n\nexport default JunoMCPClient;\n","/**\n * Model Context Protocol (MCP) TypeScript type definitions for juno-task-ts\n *\n * This module provides comprehensive TypeScript types for MCP integration,\n * supporting the @modelcontextprotocol/sdk with the exact progress callback\n * patterns identified in the Python budi-cli implementation.\n *\n * @module MCPTypes\n * @since 1.0.0\n */\n\n// =============================================================================\n// Core Types & Enums\n// =============================================================================\n\n/**\n * Supported subagent types for MCP tool mapping\n */\nexport type SubagentType = 'claude' | 'cursor' | 'codex' | 'gemini';\n\n/**\n * Extended subagent aliases for flexible naming\n */\nexport type SubagentAlias =\n | 'claude-code'\n | 'claude_code'\n | 'gemini-cli'\n | 'cursor-agent';\n\n/**\n * MCP connection state lifecycle\n */\nexport enum MCPConnectionState {\n DISCONNECTED = 'disconnected',\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n RECONNECTING = 'reconnecting',\n FAILED = 'failed',\n CLOSING = 'closing'\n}\n\n/**\n * Progress event types from Roundtable MCP server format\n */\nexport enum ProgressEventType {\n TOOL_START = 'tool_start',\n TOOL_RESULT = 'tool_result',\n THINKING = 'thinking',\n ERROR = 'error',\n INFO = 'info',\n DEBUG = 'debug'\n}\n\n/**\n * MCP error categories for targeted error handling\n */\nexport enum MCPErrorType {\n CONNECTION = 'connection',\n TIMEOUT = 'timeout',\n RATE_LIMIT = 'rate_limit',\n TOOL_EXECUTION = 'tool_execution',\n VALIDATION = 'validation',\n SERVER_NOT_FOUND = 'server_not_found',\n PROTOCOL = 'protocol',\n AUTHENTICATION = 'authentication'\n}\n\n/**\n * Tool execution status for tracking\n */\nexport enum ToolExecutionStatus {\n PENDING = 'pending',\n RUNNING = 'running',\n COMPLETED = 'completed',\n FAILED = 'failed',\n CANCELLED = 'cancelled',\n TIMEOUT = 'timeout'\n}\n\n// =============================================================================\n// Configuration Types\n// =============================================================================\n\n/**\n * Core MCP server configuration interface\n *\n * @example\n * ```typescript\n * const config: MCPServerConfig = {\n * serverPath: './roundtable_mcp_server',\n * timeout: 3600,\n * retries: 3,\n * retryDelay: 1000,\n * workingDirectory: process.cwd(),\n * environment: {\n * 'ROUNDTABLE_API_KEY': 'your-key'\n * }\n * };\n * ```\n */\nexport interface MCPServerConfig {\n /** Optional path to MCP server executable - will auto-discover if not provided */\n readonly serverPath?: string;\n\n /** Tool execution timeout in milliseconds (default: 3600000ms = 1 hour) */\n readonly timeout: number;\n\n /** Maximum retry attempts for failed operations (default: 3) */\n readonly retries: number;\n\n /** Delay between retry attempts in milliseconds (default: 1000ms) */\n readonly retryDelay: number;\n\n /** Working directory for server process execution */\n readonly workingDirectory: string;\n\n /** Additional environment variables for server process */\n readonly environment?: Readonly<Record<string, string>>;\n\n /** Custom server arguments (advanced usage) */\n readonly serverArgs?: readonly string[];\n\n /** Enable debug logging for MCP communications */\n readonly debug?: boolean;\n\n /** Maximum memory usage for server process in MB */\n readonly maxMemoryMB?: number;\n\n /** Process priority for server subprocess */\n readonly processPriority?: 'low' | 'normal' | 'high';\n}\n\n/**\n * Connection retry configuration with exponential backoff\n */\nexport interface RetryConfig {\n /** Maximum number of retry attempts */\n readonly maxRetries: number;\n\n /** Initial delay between retries in milliseconds */\n readonly initialDelay: number;\n\n /** Maximum delay between retries in milliseconds */\n readonly maxDelay: number;\n\n /** Exponential backoff multiplier */\n readonly backoffMultiplier: number;\n\n /** Jitter factor to randomize retry timing (0-1) */\n readonly jitterFactor: number;\n\n /** Custom retry condition predicate */\n readonly shouldRetry?: (error: Error, attempt: number) => boolean;\n}\n\n/**\n * Rate limiting configuration and state\n */\nexport interface RateLimitConfig {\n /** Maximum requests per time window */\n readonly maxRequests: number;\n\n /** Time window in milliseconds */\n readonly windowMs: number;\n\n /** Burst allowance for short-term spikes */\n readonly burstAllowance: number;\n\n /** Enable adaptive rate limiting based on server responses */\n readonly adaptive: boolean;\n}\n\n// =============================================================================\n// Progress Tracking Types\n// =============================================================================\n\n/**\n * Progress event interface matching Roundtable MCP server format\n * Format: \"Backend #count: event_type => content\"\n *\n * @example\n * ```typescript\n * const progressEvent: ProgressEvent = {\n * sessionId: 'session-123',\n * timestamp: new Date(),\n * backend: 'claude',\n * count: 1,\n * type: ProgressEventType.TOOL_START,\n * content: 'Starting code analysis...',\n * toolId: 'claude_1',\n * metadata: {\n * duration: 150,\n * tokens: 1024\n * }\n * };\n * ```\n */\nexport interface ProgressEvent {\n /** Unique session identifier for correlation */\n readonly sessionId: string;\n\n /** Event timestamp */\n readonly timestamp: Date;\n\n /** Subagent backend name (claude, cursor, codex, gemini) */\n readonly backend: string;\n\n /** Sequential event number within session */\n readonly count: number;\n\n /** Progress event classification */\n readonly type: ProgressEventType;\n\n /** Event content/message from subagent */\n readonly content: string;\n\n /** Generated tool correlation ID for tracking */\n readonly toolId: string;\n\n /** Additional event metadata */\n readonly metadata?: Readonly<Record<string, unknown>>;\n\n /** Parent event ID for nested operations */\n readonly parentId?: string;\n\n /** Event priority level */\n readonly priority?: 'low' | 'normal' | 'high';\n}\n\n/**\n * Progress callback function signature\n * Callbacks must never throw errors to avoid breaking execution flow\n *\n * @param event - The progress event to handle\n * @returns Promise<void> - Should handle errors internally\n */\nexport type ProgressCallback = (event: ProgressEvent) => Promise<void> | void;\n\n/**\n * Progress metadata for context tracking\n */\nexport interface ProgressMetadata {\n /** Operation start time */\n readonly startTime: Date;\n\n /** Total events processed */\n readonly eventCount: number;\n\n /** Last event timestamp */\n readonly lastEventTime?: Date;\n\n /** Operation context */\n readonly context: string;\n\n /** User-defined tags for categorization */\n readonly tags?: readonly string[];\n\n /** Performance metrics */\n readonly metrics?: ProgressMetrics;\n}\n\n/**\n * Performance metrics for progress tracking\n */\nexport interface ProgressMetrics {\n /** Average event processing time in milliseconds */\n readonly avgProcessingTime: number;\n\n /** Events processed per second */\n readonly eventsPerSecond: number;\n\n /** Memory usage in bytes */\n readonly memoryUsage: number;\n\n /** CPU usage percentage */\n readonly cpuUsage: number;\n}\n\n// =============================================================================\n// Tool Execution Types\n// =============================================================================\n\n/**\n * Tool call request structure\n *\n * @example\n * ```typescript\n * const request: ToolCallRequest = {\n * toolName: 'claude_subagent',\n * arguments: {\n * instruction: 'Analyze this code',\n * project_path: '/path/to/project',\n * model: 'sonnet-4'\n * },\n * timeout: 30000,\n * priority: 'high',\n * metadata: {\n * userId: 'user-123',\n * sessionId: 'session-456'\n * }\n * };\n * ```\n */\nexport interface ToolCallRequest {\n /** MCP tool name (mapped from subagent name) */\n readonly toolName: string;\n\n /** Tool arguments object */\n readonly arguments: Readonly<Record<string, unknown>>;\n\n /** Request timeout in milliseconds */\n readonly timeout?: number;\n\n /** Request priority level */\n readonly priority?: 'low' | 'normal' | 'high';\n\n /** Additional request metadata */\n readonly metadata?: Readonly<Record<string, unknown>>;\n\n /** Callback for progress events */\n readonly progressCallback?: ProgressCallback;\n\n /** Unique request identifier */\n readonly requestId?: string;\n}\n\n/**\n * Tool call result structure\n */\nexport interface ToolCallResult {\n /** Tool execution result content */\n readonly content: string;\n\n /** Execution status */\n readonly status: ToolExecutionStatus;\n\n /** Execution start time */\n readonly startTime: Date;\n\n /** Execution end time */\n readonly endTime: Date;\n\n /** Total execution duration in milliseconds */\n readonly duration: number;\n\n /** Any error that occurred during execution */\n readonly error?: Error;\n\n /** Progress events generated during execution */\n readonly progressEvents: readonly ProgressEvent[];\n\n /** Tool execution metadata */\n readonly metadata?: ToolExecutionMetadata;\n\n /** Request that generated this result */\n readonly request: ToolCallRequest;\n}\n\n/**\n * Tool execution metadata\n */\nexport interface ToolExecutionMetadata {\n /** Number of tokens used */\n readonly tokensUsed?: number;\n\n /** Estimated cost */\n readonly estimatedCost?: number;\n\n /** Model used for execution */\n readonly model?: string;\n\n /** Server version */\n readonly serverVersion?: string;\n\n /** Performance metrics */\n readonly performanceMetrics?: ToolPerformanceMetrics;\n}\n\n/**\n * Tool performance metrics\n */\nexport interface ToolPerformanceMetrics {\n /** CPU usage during execution */\n readonly cpuUsage: number;\n\n /** Memory usage during execution */\n readonly memoryUsage: number;\n\n /** Network usage in bytes */\n readonly networkUsage: number;\n\n /** Processing time breakdown */\n readonly timingBreakdown: Record<string, number>;\n}\n\n// =============================================================================\n// Subagent Integration Types\n// =============================================================================\n\n/**\n * Subagent information and capabilities\n */\nexport interface SubagentInfo {\n /** Subagent identifier */\n readonly id: SubagentType;\n\n /** Display name */\n readonly name: string;\n\n /** Supported capabilities */\n readonly capabilities: readonly SubagentCapability[];\n\n /** Available models */\n readonly models: readonly string[];\n\n /** Default model */\n readonly defaultModel: string;\n\n /** Current availability status */\n readonly status: SubagentStatus;\n\n /** Rate limiting information */\n readonly rateLimits?: RateLimitInfo;\n\n /** Performance characteristics */\n readonly performance?: SubagentPerformance;\n}\n\n/**\n * Subagent capability types\n */\nexport enum SubagentCapability {\n CODE_GENERATION = 'code_generation',\n CODE_ANALYSIS = 'code_analysis',\n DEBUGGING = 'debugging',\n REFACTORING = 'refactoring',\n DOCUMENTATION = 'documentation',\n TESTING = 'testing',\n ARCHITECTURE = 'architecture',\n REVIEW = 'review'\n}\n\n/**\n * Subagent status\n */\nexport enum SubagentStatus {\n AVAILABLE = 'available',\n BUSY = 'busy',\n RATE_LIMITED = 'rate_limited',\n UNAVAILABLE = 'unavailable',\n ERROR = 'error',\n MAINTENANCE = 'maintenance'\n}\n\n/**\n * Rate limit information\n */\nexport interface RateLimitInfo {\n /** Requests remaining in current window */\n readonly remaining: number;\n\n /** Total requests allowed per window */\n readonly limit: number;\n\n /** Window reset time */\n readonly resetTime: Date;\n\n /** Current rate limit tier */\n readonly tier: string;\n}\n\n/**\n * Subagent performance characteristics\n */\nexport interface SubagentPerformance {\n /** Average response time in milliseconds */\n readonly avgResponseTime: number;\n\n /** Success rate percentage */\n readonly successRate: number;\n\n /** Current load level */\n readonly loadLevel: 'low' | 'medium' | 'high';\n\n /** Quality score (0-100) */\n readonly qualityScore: number;\n}\n\n/**\n * Subagent tool mapping configuration\n */\nexport interface SubagentMapper {\n /** Core subagent to tool name mapping */\n readonly mapping: Readonly<Record<SubagentType, string>>;\n\n /** Alias to subagent mapping */\n readonly aliases: Readonly<Record<SubagentAlias, SubagentType>>;\n\n /** Model validation rules */\n readonly modelValidation: Readonly<Record<SubagentType, ModelValidationRule>>;\n\n /** Default configurations per subagent */\n readonly defaults: Readonly<Record<SubagentType, SubagentDefaults>>;\n}\n\n/**\n * Model validation rule\n */\nexport interface ModelValidationRule {\n /** Allowed models for this subagent */\n readonly allowedModels: readonly string[];\n\n /** Default model if none specified */\n readonly defaultModel: string;\n\n /** Custom validation function */\n readonly customValidator?: (model: string) => boolean;\n}\n\n/**\n * Default subagent configuration\n */\nexport interface SubagentDefaults {\n /** Default timeout in milliseconds */\n readonly timeout: number;\n\n /** Default model */\n readonly model: string;\n\n /** Default arguments */\n readonly arguments: Readonly<Record<string, unknown>>;\n\n /** Default priority */\n readonly priority: 'low' | 'normal' | 'high';\n}\n\n// =============================================================================\n// Connection Management Types\n// =============================================================================\n\n/**\n * Connection lifecycle event\n */\nexport interface ConnectionEvent {\n /** Event type */\n readonly type: ConnectionEventType;\n\n /** Event timestamp */\n readonly timestamp: Date;\n\n /** Connection state after event */\n readonly state: MCPConnectionState;\n\n /** Event details */\n readonly details?: string;\n\n /** Error information if applicable */\n readonly error?: Error;\n}\n\n/**\n * Connection event types\n */\nexport enum ConnectionEventType {\n CONNECTING = 'connecting',\n CONNECTED = 'connected',\n DISCONNECTED = 'disconnected',\n RECONNECTING = 'reconnecting',\n ERROR = 'error',\n TIMEOUT = 'timeout',\n RATE_LIMITED = 'rate_limited'\n}\n\n/**\n * Connection health monitoring\n */\nexport interface ConnectionHealth {\n /** Current connection state */\n readonly state: MCPConnectionState;\n\n /** Connection uptime in milliseconds */\n readonly uptime: number;\n\n /** Number of successful operations */\n readonly successfulOperations: number;\n\n /** Number of failed operations */\n readonly failedOperations: number;\n\n /** Average response time */\n readonly avgResponseTime: number;\n\n /** Last successful operation time */\n readonly lastSuccessTime?: Date;\n\n /** Last error time */\n readonly lastErrorTime?: Date;\n\n /** Current error streak */\n readonly errorStreak: number;\n}\n\n/**\n * Connection recovery strategy\n */\nexport interface RecoveryStrategy {\n /** Strategy type */\n readonly type: RecoveryStrategyType;\n\n /** Strategy configuration */\n readonly config: RecoveryConfig;\n\n /** Custom recovery function */\n readonly customRecovery?: () => Promise<boolean>;\n}\n\n/**\n * Recovery strategy types\n */\nexport enum RecoveryStrategyType {\n IMMEDIATE_RETRY = 'immediate_retry',\n EXPONENTIAL_BACKOFF = 'exponential_backoff',\n CIRCUIT_BREAKER = 'circuit_breaker',\n GRACEFUL_DEGRADATION = 'graceful_degradation',\n CUSTOM = 'custom'\n}\n\n/**\n * Recovery configuration\n */\nexport interface RecoveryConfig {\n /** Maximum recovery attempts */\n readonly maxAttempts: number;\n\n /** Recovery timeout */\n readonly timeout: number;\n\n /** Strategy-specific parameters */\n readonly parameters: Readonly<Record<string, unknown>>;\n}\n\n// =============================================================================\n// Session Integration Types\n// =============================================================================\n\n/**\n * MCP session context\n */\nexport interface MCPSessionContext {\n /** Unique session identifier */\n readonly sessionId: string;\n\n /** Session start time */\n readonly startTime: Date;\n\n /** User identifier */\n readonly userId?: string;\n\n /** Session metadata */\n readonly metadata: Readonly<Record<string, unknown>>;\n\n /** Active tool calls */\n readonly activeToolCalls: readonly string[];\n\n /** Session state */\n readonly state: SessionState;\n\n /** Last activity time */\n readonly lastActivity: Date;\n}\n\n/**\n * Session state\n */\nexport enum SessionState {\n INITIALIZING = 'initializing',\n ACTIVE = 'active',\n IDLE = 'idle',\n SUSPENDED = 'suspended',\n COMPLETED = 'completed',\n FAILED = 'failed'\n}\n\n/**\n * Session persistence configuration\n */\nexport interface SessionPersistence {\n /** Enable session persistence */\n readonly enabled: boolean;\n\n /** Storage backend type */\n readonly storageType: SessionStorageType;\n\n /** Storage configuration */\n readonly storageConfig: SessionStorageConfig;\n\n /** Session TTL in milliseconds */\n readonly ttlMs: number;\n\n /** Auto-cleanup interval */\n readonly cleanupIntervalMs: number;\n}\n\n/**\n * Session storage types\n */\nexport enum SessionStorageType {\n MEMORY = 'memory',\n FILE = 'file',\n DATABASE = 'database',\n REDIS = 'redis'\n}\n\n/**\n * Session storage configuration\n */\nexport interface SessionStorageConfig {\n /** Storage-specific parameters */\n readonly parameters: Readonly<Record<string, unknown>>;\n\n /** Encryption configuration */\n readonly encryption?: EncryptionConfig;\n\n /** Compression configuration */\n readonly compression?: CompressionConfig;\n}\n\n/**\n * Encryption configuration\n */\nexport interface EncryptionConfig {\n /** Encryption algorithm */\n readonly algorithm: string;\n\n /** Key derivation parameters */\n readonly keyDerivation: KeyDerivationConfig;\n}\n\n/**\n * Key derivation configuration\n */\nexport interface KeyDerivationConfig {\n /** KDF algorithm */\n readonly algorithm: string;\n\n /** Salt length */\n readonly saltLength: number;\n\n /** Iteration count */\n readonly iterations: number;\n}\n\n/**\n * Compression configuration\n */\nexport interface CompressionConfig {\n /** Compression algorithm */\n readonly algorithm: 'gzip' | 'deflate' | 'brotli';\n\n /** Compression level */\n readonly level: number;\n}\n\n// =============================================================================\n// Error Types - Import from errors.ts\n// =============================================================================\n\n// Import error types from dedicated errors module\nexport type {\n MCPError,\n MCPConnectionError,\n MCPToolError,\n MCPTimeoutError,\n MCPRateLimitError,\n MCPValidationError,\n MCPErrorOptions,\n RetryInfo,\n ServerInfo,\n ToolInfo,\n ToolExecutionDetails,\n} from './errors.js';\n\n// =============================================================================\n// Utility Types\n// =============================================================================\n\n/**\n * Type-safe event emitter interface for MCP events\n */\nexport interface MCPEventEmitter {\n on<T extends keyof MCPEventMap>(event: T, listener: MCPEventMap[T]): void;\n off<T extends keyof MCPEventMap>(event: T, listener: MCPEventMap[T]): void;\n emit<T extends keyof MCPEventMap>(event: T, ...args: Parameters<MCPEventMap[T]>): boolean;\n}\n\n/**\n * MCP event map for type-safe event handling\n */\nexport interface MCPEventMap {\n 'connection:state': (state: MCPConnectionState) => void;\n 'connection:error': (error: Error) => void;\n 'progress:event': (event: ProgressEvent) => void;\n 'tool:start': (request: ToolCallRequest) => void;\n 'tool:complete': (result: ToolCallResult) => void;\n 'tool:error': (error: Error) => void;\n 'session:create': (context: MCPSessionContext) => void;\n 'session:end': (sessionId: string) => void;\n 'rate-limit:reached': (error: Error) => void;\n}\n\n/**\n * Utility type for making properties optional\n */\nexport type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\n/**\n * Utility type for making properties required\n */\nexport type RequiredBy<T, K extends keyof T> = T & Required<Pick<T, K>>;\n\n/**\n * Utility type for deep readonly\n */\nexport type DeepReadonly<T> = {\n readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];\n};\n\n/**\n * Utility type for extracting promise return type\n */\nexport type Awaited<T> = T extends Promise<infer U> ? U : T;\n\n/**\n * Type guard for progress events\n */\nexport function isProgressEvent(obj: unknown): obj is ProgressEvent {\n return (\n typeof obj === 'object' &&\n obj !== null &&\n 'sessionId' in obj &&\n 'timestamp' in obj &&\n 'backend' in obj &&\n 'count' in obj &&\n 'type' in obj &&\n 'content' in obj &&\n 'toolId' in obj\n );\n}\n\n// Import type guards from errors module\nexport { isMCPError } from './errors.js';\n\n/**\n * Type guard for subagent types\n */\nexport function isSubagentType(value: string): value is SubagentType {\n return ['claude', 'cursor', 'codex', 'gemini'].includes(value);\n}\n\n/**\n * Type guard for connection states\n */\nexport function isConnectionState(value: string): value is MCPConnectionState {\n return Object.values(MCPConnectionState).includes(value as MCPConnectionState);\n}\n\n// =============================================================================\n// Factory Types\n// =============================================================================\n\n/**\n * MCP client factory configuration\n */\nexport interface MCPClientFactory {\n /** Create MCP client with configuration */\n create(config: MCPServerConfig): Promise<MCPClient>;\n\n /** Create mock client for testing */\n createMock(mockConfig?: MockClientConfig): MockMCPClient;\n\n /** Validate configuration */\n validateConfig(config: MCPServerConfig): ValidationResult;\n}\n\n/**\n * Mock client configuration for testing\n */\nexport interface MockClientConfig {\n /** Predefined tool responses */\n readonly toolResponses: Readonly<Record<string, string>>;\n\n /** Simulated progress events */\n readonly progressEvents: readonly ProgressEvent[];\n\n /** Simulated errors */\n readonly errors: readonly Error[];\n\n /** Response delays */\n readonly responseDelays: Readonly<Record<string, number>>;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n /** Validation success */\n readonly valid: boolean;\n\n /** Validation errors */\n readonly errors: readonly string[];\n\n /** Validation warnings */\n readonly warnings: readonly string[];\n}\n\n/**\n * Abstract MCP client interface\n */\nexport interface MCPClient {\n /** Connect to MCP server */\n connect(): Promise<void>;\n\n /** Disconnect from MCP server */\n disconnect(): Promise<void>;\n\n /** Check connection status */\n isConnected(): boolean;\n\n /** Call tool with progress tracking */\n callTool(request: ToolCallRequest): Promise<ToolCallResult>;\n\n /** List available tools */\n listTools(): Promise<readonly string[]>;\n\n /** Get subagent information */\n getSubagentInfo(subagent: SubagentType): Promise<SubagentInfo>;\n\n /** Add progress callback */\n onProgress(callback: ProgressCallback): () => void;\n\n /** Get connection health */\n getHealth(): ConnectionHealth;\n\n /** Event emitter interface */\n on<T extends keyof MCPEventMap>(event: T, listener: MCPEventMap[T]): void;\n off<T extends keyof MCPEventMap>(event: T, listener: MCPEventMap[T]): void;\n}\n\n/**\n * Mock MCP client interface for testing\n */\nexport interface MockMCPClient extends MCPClient {\n /** Add mock tool response */\n addToolResponse(toolName: string, response: string): void;\n\n /** Simulate progress event */\n simulateProgressEvent(event: ProgressEvent): void;\n\n /** Simulate error */\n simulateError(error: Error): void;\n\n /** Reset mock state */\n reset(): void;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\n/**\n * Default MCP configuration values\n */\nexport const MCP_DEFAULTS = {\n TIMEOUT: 3600000, // 1 hour\n RETRIES: 3,\n RETRY_DELAY: 1000, // 1 second\n MAX_MEMORY_MB: 512,\n PROCESS_PRIORITY: 'normal' as const,\n CONNECTION_TIMEOUT: 30000, // 30 seconds\n HEALTH_CHECK_INTERVAL: 60000, // 1 minute\n SESSION_TTL: 86400000, // 24 hours\n CLEANUP_INTERVAL: 3600000, // 1 hour\n} as const;\n\n/**\n * Subagent to tool mapping\n */\nexport const SUBAGENT_TOOL_MAPPING: Record<SubagentType, string> = {\n claude: 'claude_subagent',\n cursor: 'cursor_subagent',\n codex: 'codex_subagent',\n gemini: 'gemini_subagent',\n} as const;\n\n/**\n * Subagent alias mapping\n */\nexport const SUBAGENT_ALIASES: Record<SubagentAlias, SubagentType> = {\n 'claude-code': 'claude',\n 'claude_code': 'claude',\n 'gemini-cli': 'gemini',\n 'cursor-agent': 'cursor',\n} as const;\n\n/**\n * Progress event parsing patterns\n */\nexport const PROGRESS_PATTERNS = {\n /** Main progress message pattern: \"Backend #count: event_type => content\" */\n MAIN: /^(.+?)\\s+#(\\d+):\\s+(\\w+)\\s*=>\\s*(.+)$/,\n\n /** Tool call patterns for detection */\n TOOL_CALLS: [\n /calling\\s+tool[:\\s]*([a-zA-Z_][a-zA-Z0-9_]*)/i,\n /<function_calls>\\s*<invoke name=\"([^\"]+)\"/i,\n /tool[:\\s]*([a-zA-Z_][a-zA-Z0-9_]*)/i,\n ],\n\n /** Rate limit patterns */\n RATE_LIMITS: [\n /resets\\s+(at\\s+)?(\\d{1,2}):(\\d{2})\\s*(am|pm)?/i,\n /resets\\s+(at\\s+)?(\\d{1,2})\\s*(am|pm)/i,\n /try again in (\\d+)\\s*(minutes?|hours?)/i,\n /5-hour limit reached.*resets\\s+(at\\s+)?(\\d{1,2})\\s*(am|pm)/i,\n ],\n} as const;\n\n// Note: All types and enums are already exported above via their declarations","/**\n * Progress Stream Manager for juno-task-ts\n *\n * Real-time progress streaming display for MCP operations.\n * Provides live streaming of tool execution progress and performance metrics.\n */\n\nimport { EventEmitter } from 'node:events';\nimport type { ProgressEvent, ProgressCallback } from '../types.js';\n\nexport interface ProgressStreamUpdate {\n sessionId: string;\n timestamp: Date;\n type: 'tool_start' | 'tool_progress' | 'tool_complete' | 'iteration_start' | 'iteration_complete' | 'stream_start' | 'stream_end';\n data: {\n toolName?: string;\n progress?: number;\n message?: string;\n metadata?: Record<string, any>;\n duration?: number;\n error?: string;\n totalSteps?: number;\n currentStep?: number;\n rate?: number; // operations per second\n eta?: Date;\n };\n}\n\nexport interface ExecutionMetrics {\n startTime: Date;\n endTime?: Date;\n totalDuration: number;\n toolCalls: number;\n successfulCalls: number;\n failedCalls: number;\n averageResponseTime: number;\n iterationsCompleted: number;\n totalIterations?: number;\n currentIteration?: number;\n operationsPerSecond: number;\n estimatedTimeRemaining?: number;\n}\n\nexport interface StreamSession {\n sessionId: string;\n startTime: Date;\n isActive: boolean;\n metrics: ExecutionMetrics;\n updates: ProgressStreamUpdate[];\n callbacks: Array<(update: ProgressStreamUpdate) => void>;\n}\n\nexport class ProgressStreamManager extends EventEmitter {\n private sessions: Map<string, StreamSession> = new Map();\n private globalCallbacks: Array<(update: ProgressStreamUpdate) => void> = [];\n private updateInterval?: NodeJS.Timeout;\n private metricsUpdateInterval: number = 1000; // 1 second\n\n constructor() {\n super();\n this.startMetricsUpdater();\n }\n\n /**\n * Start progress streaming for a session\n */\n async startStream(sessionId: string): Promise<void> {\n if (this.sessions.has(sessionId)) {\n throw new Error(`Progress stream already active for session: ${sessionId}`);\n }\n\n const session: StreamSession = {\n sessionId,\n startTime: new Date(),\n isActive: true,\n metrics: {\n startTime: new Date(),\n totalDuration: 0,\n toolCalls: 0,\n successfulCalls: 0,\n failedCalls: 0,\n averageResponseTime: 0,\n iterationsCompleted: 0,\n operationsPerSecond: 0\n },\n updates: [],\n callbacks: []\n };\n\n this.sessions.set(sessionId, session);\n\n // Emit stream start event\n const startUpdate: ProgressStreamUpdate = {\n sessionId,\n timestamp: new Date(),\n type: 'stream_start',\n data: {\n message: 'Progress stream started'\n }\n };\n\n this.emitUpdate(startUpdate);\n this.emit('streamStarted', sessionId);\n }\n\n /**\n * Stop progress streaming for a session\n */\n async stopStream(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return; // Session doesn't exist or already stopped\n }\n\n session.isActive = false;\n session.metrics.endTime = new Date();\n session.metrics.totalDuration = session.metrics.endTime.getTime() - session.metrics.startTime.getTime();\n\n // Emit stream end event\n const endUpdate: ProgressStreamUpdate = {\n sessionId,\n timestamp: new Date(),\n type: 'stream_end',\n data: {\n message: 'Progress stream ended',\n duration: session.metrics.totalDuration,\n metadata: {\n totalToolCalls: session.metrics.toolCalls,\n successRate: session.metrics.toolCalls > 0 ? (session.metrics.successfulCalls / session.metrics.toolCalls) * 100 : 0,\n averageResponseTime: session.metrics.averageResponseTime\n }\n }\n };\n\n this.emitUpdate(endUpdate);\n this.emit('streamEnded', sessionId, session.metrics);\n\n // Clean up session after a delay to allow final metrics collection\n setTimeout(() => {\n this.sessions.delete(sessionId);\n }, 5000);\n }\n\n /**\n * Add progress update callback for a session\n */\n onProgressUpdate(callback: (update: ProgressStreamUpdate) => void, sessionId?: string): void {\n if (sessionId) {\n const session = this.sessions.get(sessionId);\n if (session) {\n session.callbacks.push(callback);\n }\n } else {\n this.globalCallbacks.push(callback);\n }\n }\n\n /**\n * Remove progress update callback\n */\n removeProgressCallback(callback: (update: ProgressStreamUpdate) => void, sessionId?: string): void {\n if (sessionId) {\n const session = this.sessions.get(sessionId);\n if (session) {\n const index = session.callbacks.indexOf(callback);\n if (index !== -1) {\n session.callbacks.splice(index, 1);\n }\n }\n } else {\n const index = this.globalCallbacks.indexOf(callback);\n if (index !== -1) {\n this.globalCallbacks.splice(index, 1);\n }\n }\n }\n\n /**\n * Check if streaming is active for a session\n */\n isStreaming(sessionId: string): boolean {\n const session = this.sessions.get(sessionId);\n return session?.isActive || false;\n }\n\n /**\n * Get current metrics for a session\n */\n getMetrics(sessionId: string): ExecutionMetrics | null {\n const session = this.sessions.get(sessionId);\n return session?.metrics || null;\n }\n\n /**\n * Get all active session IDs\n */\n getActiveSessions(): string[] {\n return Array.from(this.sessions.entries())\n .filter(([_, session]) => session.isActive)\n .map(([sessionId]) => sessionId);\n }\n\n /**\n * Record tool execution start\n */\n recordToolStart(sessionId: string, toolName: string, metadata?: Record<string, any>): void {\n const session = this.sessions.get(sessionId);\n if (!session || !session.isActive) return;\n\n const update: ProgressStreamUpdate = {\n sessionId,\n timestamp: new Date(),\n type: 'tool_start',\n data: {\n toolName,\n message: `Starting ${toolName}`,\n metadata\n }\n };\n\n this.emitUpdate(update);\n }\n\n /**\n * Record tool execution progress\n */\n recordToolProgress(sessionId: string, toolName: string, progress: number, message?: string): void {\n const session = this.sessions.get(sessionId);\n if (!session || !session.isActive) return;\n\n const update: ProgressStreamUpdate = {\n sessionId,\n timestamp: new Date(),\n type: 'tool_progress',\n data: {\n toolName,\n progress: Math.max(0, Math.min(100, progress)),\n message: message || `${toolName} progress: ${progress.toFixed(1)}%`,\n rate: this.calculateOperationRate(sessionId)\n }\n };\n\n this.emitUpdate(update);\n }\n\n /**\n * Record tool execution completion\n */\n recordToolComplete(sessionId: string, toolName: string, duration: number, success: boolean = true, error?: string): void {\n const session = this.sessions.get(sessionId);\n if (!session || !session.isActive) return;\n\n // Update metrics\n session.metrics.toolCalls++;\n if (success) {\n session.metrics.successfulCalls++;\n } else {\n session.metrics.failedCalls++;\n }\n\n // Update average response time\n session.metrics.averageResponseTime = this.calculateAverageResponseTime(session, duration);\n\n const update: ProgressStreamUpdate = {\n sessionId,\n timestamp: new Date(),\n type: 'tool_complete',\n data: {\n toolName,\n message: success ? `${toolName} completed successfully` : `${toolName} failed`,\n duration,\n error,\n metadata: {\n success,\n totalCalls: session.metrics.toolCalls,\n successRate: (session.metrics.successfulCalls / session.metrics.toolCalls) * 100\n }\n }\n };\n\n this.emitUpdate(update);\n }\n\n /**\n * Record iteration start\n */\n recordIterationStart(sessionId: string, iterationNumber: number, totalIterations?: number): void {\n const session = this.sessions.get(sessionId);\n if (!session || !session.isActive) return;\n\n session.metrics.currentIteration = iterationNumber;\n session.metrics.totalIterations = totalIterations;\n\n const update: ProgressStreamUpdate = {\n sessionId,\n timestamp: new Date(),\n type: 'iteration_start',\n data: {\n message: `Starting iteration ${iterationNumber}${totalIterations ? ` of ${totalIterations}` : ''}`,\n currentStep: iterationNumber,\n totalSteps: totalIterations,\n progress: totalIterations ? (iterationNumber / totalIterations) * 100 : undefined\n }\n };\n\n this.emitUpdate(update);\n }\n\n /**\n * Record iteration completion\n */\n recordIterationComplete(sessionId: string, iterationNumber: number): void {\n const session = this.sessions.get(sessionId);\n if (!session || !session.isActive) return;\n\n session.metrics.iterationsCompleted = iterationNumber;\n\n // Calculate ETA if we have total iterations\n let eta: Date | undefined;\n if (session.metrics.totalIterations && session.metrics.totalIterations > iterationNumber) {\n const remainingIterations = session.metrics.totalIterations - iterationNumber;\n const iterationRate = this.calculateIterationRate(session);\n if (iterationRate > 0) {\n const remainingTime = (remainingIterations / iterationRate) * 1000;\n eta = new Date(Date.now() + remainingTime);\n }\n }\n\n const update: ProgressStreamUpdate = {\n sessionId,\n timestamp: new Date(),\n type: 'iteration_complete',\n data: {\n message: `Iteration ${iterationNumber} completed`,\n currentStep: iterationNumber,\n totalSteps: session.metrics.totalIterations,\n progress: session.metrics.totalIterations ? (iterationNumber / session.metrics.totalIterations) * 100 : undefined,\n rate: this.calculateIterationRate(session),\n eta\n }\n };\n\n this.emitUpdate(update);\n }\n\n /**\n * Create a progress callback for MCP client integration\n */\n createProgressCallback(sessionId: string): ProgressCallback {\n return (event: ProgressEvent) => {\n const session = this.sessions.get(sessionId);\n if (!session || !session.isActive) return;\n\n const update: ProgressStreamUpdate = {\n sessionId,\n timestamp: new Date(),\n type: 'tool_progress',\n data: {\n toolName: event.toolName,\n progress: event.progress,\n message: event.message,\n metadata: event.metadata\n }\n };\n\n this.emitUpdate(update);\n };\n }\n\n /**\n * Emit update to all callbacks\n */\n private emitUpdate(update: ProgressStreamUpdate): void {\n const session = this.sessions.get(update.sessionId);\n\n // Store update in session history\n if (session) {\n session.updates.push(update);\n // Keep only last 100 updates per session to prevent memory leaks\n if (session.updates.length > 100) {\n session.updates = session.updates.slice(-100);\n }\n\n // Call session-specific callbacks\n session.callbacks.forEach(callback => {\n try {\n callback(update);\n } catch (error) {\n console.error('Error in progress callback:', error);\n }\n });\n }\n\n // Call global callbacks\n this.globalCallbacks.forEach(callback => {\n try {\n callback(update);\n } catch (error) {\n console.error('Error in global progress callback:', error);\n }\n });\n\n // Emit as event\n this.emit('progressUpdate', update);\n }\n\n /**\n * Calculate operation rate (ops/second)\n */\n private calculateOperationRate(sessionId: string): number {\n const session = this.sessions.get(sessionId);\n if (!session) return 0;\n\n const elapsedTime = (Date.now() - session.startTime.getTime()) / 1000;\n return elapsedTime > 0 ? session.metrics.toolCalls / elapsedTime : 0;\n }\n\n /**\n * Calculate iteration rate (iterations/second)\n */\n private calculateIterationRate(session: StreamSession): number {\n const elapsedTime = (Date.now() - session.startTime.getTime()) / 1000;\n return elapsedTime > 0 ? session.metrics.iterationsCompleted / elapsedTime : 0;\n }\n\n /**\n * Calculate rolling average response time\n */\n private calculateAverageResponseTime(session: StreamSession, newDuration: number): number {\n const totalCalls = session.metrics.toolCalls;\n if (totalCalls === 1) {\n return newDuration;\n }\n\n const currentAverage = session.metrics.averageResponseTime;\n return ((currentAverage * (totalCalls - 1)) + newDuration) / totalCalls;\n }\n\n /**\n * Start periodic metrics updater\n */\n private startMetricsUpdater(): void {\n this.updateInterval = setInterval(() => {\n for (const [sessionId, session] of this.sessions.entries()) {\n if (session.isActive) {\n // Update current duration\n session.metrics.totalDuration = Date.now() - session.startTime.getTime();\n session.metrics.operationsPerSecond = this.calculateOperationRate(sessionId);\n\n // Emit metrics update\n this.emit('metricsUpdate', sessionId, session.metrics);\n }\n }\n }, this.metricsUpdateInterval);\n }\n\n /**\n * Cleanup and stop all streams\n */\n destroy(): void {\n if (this.updateInterval) {\n clearInterval(this.updateInterval);\n }\n\n // Stop all active streams\n for (const sessionId of this.getActiveSessions()) {\n this.stopStream(sessionId);\n }\n\n this.sessions.clear();\n this.globalCallbacks.length = 0;\n }\n}\n\nexport default ProgressStreamManager;","/**\n * MCP Configuration System\n *\n * Handles loading and managing MCP server configurations from .juno_task/mcp.json\n * Eliminates hardcoded server paths and provides centralized configuration management.\n */\n\nimport fs from 'fs-extra';\nimport * as path from 'node:path';\nimport { MCPConnectionError, MCPValidationError } from './errors.js';\n\nexport interface MCPServerConfig {\n name: string;\n command: string;\n args: string[];\n timeout: number;\n enable_default_progress_callback: boolean;\n suppress_subprocess_logs: boolean;\n env?: Record<string, string>;\n _metadata?: {\n description: string;\n capabilities: string[];\n working_directory: string;\n verbose: boolean;\n created_at: string;\n project_name: string;\n main_task: string;\n };\n}\n\nexport interface MCPConfig {\n mcpServers: Record<string, MCPServerConfig>;\n default_server: string;\n global_settings: {\n connection_timeout: number;\n default_retries: number;\n enable_progress_streaming: boolean;\n log_level: string;\n debug_mode: boolean;\n };\n project_config: {\n name: string;\n main_task: string;\n preferred_subagent: string;\n created_at: string;\n version: string;\n };\n}\n\n/**\n * MCP Configuration Loader\n *\n * Loads and validates MCP configuration from .juno_task/mcp.json files\n */\nexport class MCPConfigLoader {\n private static configCache = new Map<string, MCPConfig>();\n private static lastLoadTime = new Map<string, number>();\n private static readonly CACHE_TTL = 30000; // 30 seconds\n\n /**\n * Load MCP configuration from .juno_task/mcp.json\n */\n static async loadConfig(workingDirectory?: string): Promise<MCPConfig> {\n const baseDir = workingDirectory || process.cwd();\n const configPath = await this.findConfigFile(baseDir);\n\n // Check cache first\n const cached = this.getCachedConfig(configPath);\n if (cached) {\n return cached;\n }\n\n try {\n const configContent = await fs.readFile(configPath, 'utf-8');\n const config = JSON.parse(configContent) as MCPConfig;\n\n // Validate configuration\n this.validateConfig(config);\n\n // Resolve relative paths to absolute paths\n const resolvedConfig = this.resolveConfigPaths(config, path.dirname(configPath));\n\n // Cache the configuration\n this.configCache.set(configPath, resolvedConfig);\n this.lastLoadTime.set(configPath, Date.now());\n\n return resolvedConfig;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new MCPValidationError(`Invalid JSON in MCP config: ${error.message}`, configPath);\n }\n throw new MCPConnectionError(`Failed to load MCP config from ${configPath}: ${error}`);\n }\n }\n\n /**\n * Find the mcp.json configuration file\n */\n private static async findConfigFile(startDir: string): Promise<string> {\n let currentDir = path.resolve(startDir);\n const rootDir = path.parse(currentDir).root;\n\n while (currentDir !== rootDir) {\n const configPath = path.join(currentDir, '.juno_task', 'mcp.json');\n\n if (await fs.pathExists(configPath)) {\n return configPath;\n }\n\n currentDir = path.dirname(currentDir);\n }\n\n throw new MCPConnectionError(\n `MCP configuration not found. Please run 'juno-task init' to create .juno_task/mcp.json`\n );\n }\n\n /**\n * Get cached configuration if valid\n */\n private static getCachedConfig(configPath: string): MCPConfig | null {\n const lastLoad = this.lastLoadTime.get(configPath);\n const config = this.configCache.get(configPath);\n\n if (config && lastLoad && (Date.now() - lastLoad) < this.CACHE_TTL) {\n return config;\n }\n\n return null;\n }\n\n /**\n * Validate MCP configuration structure\n */\n private static validateConfig(config: MCPConfig): void {\n if (!config.mcpServers || typeof config.mcpServers !== 'object') {\n throw new MCPValidationError('Invalid MCP config: mcpServers section is required');\n }\n\n if (!config.default_server || typeof config.default_server !== 'string') {\n throw new MCPValidationError('Invalid MCP config: default_server is required');\n }\n\n if (!config.mcpServers[config.default_server]) {\n throw new MCPValidationError(\n `Invalid MCP config: default_server '${config.default_server}' not found in mcpServers`\n );\n }\n\n // Validate each server configuration\n for (const [serverName, serverConfig] of Object.entries(config.mcpServers)) {\n this.validateServerConfig(serverName, serverConfig);\n }\n }\n\n /**\n * Validate individual server configuration\n */\n private static validateServerConfig(serverName: string, config: MCPServerConfig): void {\n const required = ['name', 'command', 'args', 'timeout'];\n for (const field of required) {\n if (!(field in config)) {\n throw new MCPValidationError(\n `Invalid server config for '${serverName}': missing required field '${field}'`\n );\n }\n }\n\n if (!Array.isArray(config.args)) {\n throw new MCPValidationError(\n `Invalid server config for '${serverName}': args must be an array`\n );\n }\n\n if (typeof config.timeout !== 'number' || config.timeout <= 0) {\n throw new MCPValidationError(\n `Invalid server config for '${serverName}': timeout must be a positive number`\n );\n }\n }\n\n /**\n * Resolve relative paths in configuration to absolute paths\n */\n private static resolveConfigPaths(config: MCPConfig, configDir: string): MCPConfig {\n const resolvedConfig = JSON.parse(JSON.stringify(config)); // Deep clone\n\n for (const [serverName, serverConfig] of Object.entries(resolvedConfig.mcpServers)) {\n // Resolve server script paths\n serverConfig.args = serverConfig.args.map(arg => {\n // If arg looks like a file path (contains /) and is not absolute, resolve it\n if (arg.includes('/') && !path.isAbsolute(arg)) {\n return path.resolve(configDir, '..', arg); // Go up from .juno_task to project root\n }\n return arg;\n });\n\n // Resolve environment variable paths\n if (serverConfig.env) {\n for (const [envKey, envValue] of Object.entries(serverConfig.env)) {\n if (envValue.includes('/') && !path.isAbsolute(envValue)) {\n serverConfig.env[envKey] = path.resolve(configDir, '..', envValue);\n }\n }\n }\n }\n\n return resolvedConfig;\n }\n\n /**\n * Get server configuration by name\n */\n static async getServerConfig(serverName?: string, workingDirectory?: string): Promise<MCPServerConfig> {\n const config = await this.loadConfig(workingDirectory);\n const targetServer = serverName || config.default_server;\n\n const serverConfig = config.mcpServers[targetServer];\n if (!serverConfig) {\n throw new MCPConnectionError(`Server '${targetServer}' not found in MCP configuration`);\n }\n\n return serverConfig;\n }\n\n /**\n * Get default server configuration\n */\n static async getDefaultServerConfig(workingDirectory?: string): Promise<MCPServerConfig> {\n const config = await this.loadConfig(workingDirectory);\n return config.mcpServers[config.default_server];\n }\n\n /**\n * List available servers\n */\n static async listServers(workingDirectory?: string): Promise<string[]> {\n const config = await this.loadConfig(workingDirectory);\n return Object.keys(config.mcpServers);\n }\n\n /**\n * Clear configuration cache (useful for testing)\n */\n static clearCache(): void {\n this.configCache.clear();\n this.lastLoadTime.clear();\n }\n\n /**\n * Check if configuration file exists\n */\n static async hasConfig(workingDirectory?: string): Promise<boolean> {\n try {\n await this.findConfigFile(workingDirectory || process.cwd());\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get configuration file path\n */\n static async getConfigPath(workingDirectory?: string): Promise<string> {\n return this.findConfigFile(workingDirectory || process.cwd());\n }\n}","/**\n * Logging system implementation for juno-task-ts\n *\n * File-based logging system matching Python version's format:\n * - Creates logs in .juno_task/logs/ directory\n * - Uses timestamp format: subagent_loop_{subagent}_{timestamp}.log\n * - Format: %(asctime)s - %(levelname)s - %(message)s\n * - Routes MCP debug logs to files instead of console\n */\n\nimport fs from 'fs-extra';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARNING = 2,\n ERROR = 3,\n CRITICAL = 4\n}\n\nexport interface LoggerOptions {\n logDirectory?: string;\n logLevel?: LogLevel;\n enableConsoleLogging?: boolean;\n}\n\n/**\n * File-based logger for juno-task-ts\n * Matches Python version logging format and behavior\n */\nexport class JunoLogger {\n private logDirectory: string;\n private logLevel: LogLevel;\n private enableConsoleLogging: boolean;\n private logFilePath?: string;\n\n constructor(options: LoggerOptions = {}) {\n this.logDirectory = options.logDirectory || path.join(process.cwd(), '.juno_task', 'logs');\n this.logLevel = options.logLevel || LogLevel.INFO;\n this.enableConsoleLogging = options.enableConsoleLogging ?? true;\n }\n\n /**\n * Initialize logger with specific log file\n * Matches Python's generate_log_file function\n */\n async initialize(subagent: string = 'mcp'): Promise<void> {\n // Ensure log directory exists\n await fs.ensureDir(this.logDirectory);\n\n // Generate timestamp matching Python version\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-').split('T');\n const dateStr = timestamp[0];\n const timeStr = timestamp[1].split('-')[0].substring(0, 6); // HH-MM-SS\n const fullTimestamp = `${dateStr}_${timeStr}`;\n\n // Generate log file name matching Python version: subagent_loop_{subagent}_{timestamp}.log\n const logFileName = `subagent_loop_${subagent}_${fullTimestamp}.log`;\n this.logFilePath = path.join(this.logDirectory, logFileName);\n\n // Initialize log file with header\n const header = `# Juno-Task TypeScript Log - Started ${new Date().toISOString()}\\n`;\n await fs.writeFile(this.logFilePath, header);\n }\n\n /**\n * Format log message matching Python version format\n * Format: %(asctime)s - %(levelname)s - %(message)s\n */\n private formatMessage(level: string, message: string): string {\n const timestamp = new Date().toISOString();\n return `${timestamp} - ${level} - ${message}\\n`;\n }\n\n /**\n * Write message to log file\n */\n private async writeToLog(message: string): Promise<void> {\n if (!this.logFilePath) {\n throw new Error('Logger not initialized. Call initialize() first.');\n }\n await fs.appendFile(this.logFilePath, message);\n }\n\n /**\n * Log message at specified level\n */\n private async log(level: LogLevel, levelName: string, message: string, writeToConsole: boolean = true): Promise<void> {\n if (level < this.logLevel) {\n return;\n }\n\n const formattedMessage = this.formatMessage(levelName, message);\n\n // Always write to log file\n await this.writeToLog(formattedMessage);\n\n // Optionally write to console (for non-MCP logs)\n if (this.enableConsoleLogging && writeToConsole) {\n console.log(formattedMessage.trim());\n }\n }\n\n /**\n * Debug level logging - typically goes to file only\n */\n async debug(message: string, writeToConsole: boolean = false): Promise<void> {\n await this.log(LogLevel.DEBUG, 'DEBUG', message, writeToConsole);\n }\n\n /**\n * Info level logging\n */\n async info(message: string, writeToConsole: boolean = true): Promise<void> {\n await this.log(LogLevel.INFO, 'INFO', message, writeToConsole);\n }\n\n /**\n * Warning level logging\n */\n async warning(message: string, writeToConsole: boolean = true): Promise<void> {\n await this.log(LogLevel.WARNING, 'WARNING', message, writeToConsole);\n }\n\n /**\n * Error level logging\n */\n async error(message: string, writeToConsole: boolean = true): Promise<void> {\n await this.log(LogLevel.ERROR, 'ERROR', message, writeToConsole);\n }\n\n /**\n * Critical level logging\n */\n async critical(message: string, writeToConsole: boolean = true): Promise<void> {\n await this.log(LogLevel.CRITICAL, 'CRITICAL', message, writeToConsole);\n }\n\n /**\n * Get the current log file path\n */\n getLogFilePath(): string | undefined {\n return this.logFilePath;\n }\n\n /**\n * Set log level\n */\n setLogLevel(level: LogLevel): void {\n this.logLevel = level;\n }\n\n /**\n * Enable/disable console logging\n */\n setConsoleLogging(enabled: boolean): void {\n this.enableConsoleLogging = enabled;\n }\n}\n\n/**\n * MCP-specific logger that routes all [MCP] messages to log files\n * This is the main fix for the MCP logging pollution issue\n */\nexport class MCPLogger {\n private logger: JunoLogger;\n private initialized: boolean = false;\n\n constructor(options?: LoggerOptions) {\n this.logger = new JunoLogger(options);\n }\n\n /**\n * Initialize MCP logger\n */\n async initialize(): Promise<void> {\n if (!this.initialized) {\n await this.logger.initialize('mcp');\n this.initialized = true;\n }\n }\n\n /**\n * Log MCP-specific debug messages (file only)\n * This replaces console.log('[MCP] ...') calls\n */\n async debug(message: string): Promise<void> {\n await this.ensureInitialized();\n await this.logger.debug(`[MCP] ${message}`, false); // Never write to console\n }\n\n /**\n * Log MCP info messages (file only)\n */\n async info(message: string): Promise<void> {\n await this.ensureInitialized();\n await this.logger.info(`[MCP] ${message}`, false); // Never write to console\n }\n\n /**\n * Log MCP warning messages (file only)\n */\n async warning(message: string): Promise<void> {\n await this.ensureInitialized();\n await this.logger.warning(`[MCP] ${message}`, false); // Never write to console\n }\n\n /**\n * Log MCP error messages (file only by default)\n */\n async error(message: string, writeToConsole: boolean = false): Promise<void> {\n await this.ensureInitialized();\n await this.logger.error(`[MCP] ${message}`, writeToConsole); // Default to file only\n }\n\n /**\n * Get log file path for debugging\n */\n getLogFilePath(): string | undefined {\n return this.logger.getLogFilePath();\n }\n\n private async ensureInitialized(): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n }\n}\n\n/**\n * Global MCP logger instance for use throughout the application\n */\nlet globalMCPLogger: MCPLogger | null = null;\n\n/**\n * Get or create the global MCP logger instance\n */\nexport function getMCPLogger(options?: LoggerOptions): MCPLogger {\n if (!globalMCPLogger) {\n globalMCPLogger = new MCPLogger(options);\n }\n return globalMCPLogger;\n}\n\n/**\n * Initialize the global MCP logger\n */\nexport async function initializeMCPLogger(options?: LoggerOptions): Promise<MCPLogger> {\n const logger = getMCPLogger(options);\n await logger.initialize();\n return logger;\n}","/**\n * Terminal Progress Writer Utility\n *\n * Provides safe progress output to stderr that properly coordinates with active user input on stdin.\n * This prevents visual mixing of progress output with user-typed characters.\n *\n * The problem:\n * - When user is typing on stdin, their characters are echoed to the terminal\n * - If progress output writes to stderr while user is typing, it can visually interrupt the input line\n * - Result: User sees \"xxxxx[MCP] Progress event:...\" instead of clean separation\n *\n * The solution:\n * - Use ANSI escape codes to clear the current input line before writing progress\n * - Write the progress output\n * - The terminal will automatically restore the input line after our output\n *\n * ANSI Escape Codes used:\n * - \\r - Move cursor to beginning of line\n * - \\x1b[K - Clear from cursor to end of line\n * - \\x1b[2K - Clear entire line\n */\n\nimport { EOL } from 'node:os';\nimport { isFeedbackActive, bufferProgressEvent } from './feedback-state.js';\n\nexport interface TerminalProgressOptions {\n /**\n * Whether to use terminal-aware output (with ANSI codes)\n * @default true if stderr.isTTY, false otherwise\n */\n terminalAware?: boolean;\n\n /**\n * Custom output stream\n * @default process.stderr\n */\n stream?: NodeJS.WriteStream;\n}\n\n/**\n * Terminal-aware progress writer that coordinates with active user input\n */\nexport class TerminalProgressWriter {\n private options: Required<TerminalProgressOptions>;\n\n constructor(options: TerminalProgressOptions = {}) {\n this.options = {\n terminalAware: options.terminalAware ?? (process.stderr.isTTY ?? false),\n stream: options.stream ?? process.stderr\n };\n }\n\n /**\n * Write progress output to stderr with proper terminal coordination\n *\n * @param content - The content to write (can be string or object for console.error formatting)\n */\n write(content: any): void {\n // If feedback collection is active, buffer the progress instead of displaying\n // This prevents visual mixing of progress with user input\n if (isFeedbackActive()) {\n bufferProgressEvent(content);\n return;\n }\n\n if (this.options.terminalAware) {\n // Terminal-aware mode: clear the line, write content, let terminal restore input\n // Note: We use \\r\\x1b[K to clear the current line before writing\n // This ensures any partial user input is temporarily cleared\n this.options.stream.write('\\r\\x1b[K'); // Move to start and clear line\n\n // Write the actual content using console.error for proper formatting\n // console.error writes to stderr and handles object formatting with colors\n if (typeof content === 'string') {\n this.options.stream.write(content);\n if (!content.endsWith('\\n') && !content.endsWith(EOL)) {\n this.options.stream.write(EOL);\n }\n } else {\n // Use console.error for object formatting (colors, indentation, etc.)\n console.error(content);\n }\n\n // Note: We don't need to manually restore the input line\n // The terminal automatically re-displays the user's input buffer after our output\n } else {\n // Non-TTY mode: simple write without ANSI codes\n if (typeof content === 'string') {\n this.options.stream.write(content);\n if (!content.endsWith('\\n') && !content.endsWith(EOL)) {\n this.options.stream.write(EOL);\n }\n } else {\n console.error(content);\n }\n }\n }\n\n /**\n * Write formatted progress message with prefix\n *\n * @param prefix - Prefix to add before the message (e.g., '[MCP]')\n * @param message - The message or object to write\n */\n writeWithPrefix(prefix: string, message: any): void {\n // If feedback collection is active, buffer the progress instead of displaying\n // This prevents visual mixing of progress with user input\n if (isFeedbackActive()) {\n bufferProgressEvent(message, prefix);\n return;\n }\n\n if (this.options.terminalAware) {\n this.options.stream.write('\\r\\x1b[K'); // Clear line first\n }\n\n // Write prefix and message using console.error for formatting\n console.error(prefix, message);\n }\n\n /**\n * Check if terminal-aware mode is enabled\n */\n isTerminalAware(): boolean {\n return this.options.terminalAware;\n }\n}\n\n/**\n * Global singleton instance for consistent terminal progress output\n */\nlet globalWriter: TerminalProgressWriter | null = null;\n\n/**\n * Get or create the global terminal progress writer\n */\nexport function getTerminalProgressWriter(): TerminalProgressWriter {\n if (!globalWriter) {\n globalWriter = new TerminalProgressWriter();\n }\n return globalWriter;\n}\n\n/**\n * Write progress to stderr with proper terminal coordination\n *\n * This is the recommended way to write progress output that might appear\n * while the user is actively typing input.\n *\n * @param content - Content to write (string or object)\n */\nexport function writeTerminalProgress(content: any): void {\n getTerminalProgressWriter().write(content);\n}\n\n/**\n * Write progress with prefix (e.g., '[MCP] Progress event:', data)\n *\n * @param prefix - Prefix string\n * @param message - Message or object to write\n */\nexport function writeTerminalProgressWithPrefix(prefix: string, message: any): void {\n getTerminalProgressWriter().writeWithPrefix(prefix, message);\n}\n\n/**\n * Reset the global writer (useful for testing)\n */\nexport function resetTerminalProgressWriter(): void {\n globalWriter = null;\n}\n","/**\n * Global Feedback Collection State Management\n *\n * Tracks when feedback collection is active to prevent progress output mixing.\n *\n * The Problem:\n * - TerminalProgressWriter uses ANSI escape codes (\\r\\x1b[K) to clear lines\n * - This works in raw/canonical TTY mode where terminals automatically restore input\n * - Feedback collector uses line-based stdin (not raw mode) for AI agent compatibility\n * - In line-based mode, terminal buffers input internally but doesn't re-display after ANSI clears\n * - Result: User's typed characters disappear when progress writes occur\n *\n * The Solution:\n * - Suppress progress output entirely when feedback collection is active\n * - Queue progress events to a buffer instead of displaying them\n * - Optionally flush queued progress after feedback submission completes\n */\n\nimport chalk from 'chalk';\n\nexport interface ProgressEvent {\n content: any;\n prefix?: string;\n timestamp: Date;\n}\n\n/**\n * Global state for feedback collection\n */\nclass FeedbackState {\n private _isActive: boolean = false;\n private _progressBuffer: ProgressEvent[] = [];\n private readonly _maxBufferSize: number = 100; // Prevent memory leaks\n private _inputRedisplayCallback: (() => void) | null = null;\n\n /**\n * Check if feedback collection is currently active\n */\n isActive(): boolean {\n return this._isActive;\n }\n\n /**\n * Set feedback collection active state\n */\n setActive(active: boolean): void {\n const wasActive = this._isActive;\n this._isActive = active;\n\n // If feedback just became inactive, optionally flush buffered progress\n if (wasActive && !active && this._progressBuffer.length > 0) {\n this.flushProgressBuffer();\n }\n }\n\n /**\n * Set the callback to redisplay user input after progress flush\n */\n setInputRedisplayCallback(callback: (() => void) | null): void {\n this._inputRedisplayCallback = callback;\n }\n\n /**\n * Add a progress event to the buffer (when feedback is active)\n */\n bufferProgress(content: any, prefix?: string): void {\n // Only buffer if feedback is active\n if (!this._isActive) {\n return;\n }\n\n const event: ProgressEvent = {\n content,\n prefix,\n timestamp: new Date()\n };\n\n this._progressBuffer.push(event);\n\n // Prevent memory leaks by limiting buffer size\n if (this._progressBuffer.length > this._maxBufferSize) {\n this._progressBuffer.shift(); // Remove oldest event\n }\n }\n\n /**\n * Get buffered progress events\n */\n getBufferedProgress(): ProgressEvent[] {\n return [...this._progressBuffer];\n }\n\n /**\n * Clear the progress buffer\n */\n clearProgressBuffer(): void {\n this._progressBuffer.length = 0;\n }\n\n /**\n * Flush buffered progress events to stderr\n * Called when feedback collection ends or periodically\n */\n private flushProgressBuffer(): void {\n if (this._progressBuffer.length === 0) {\n return;\n }\n\n const bufferCount = this._progressBuffer.length;\n\n // Show colored status message before flushing\n console.error(chalk.yellow.bold(`\\n⏸️ Agent working - ${bufferCount} buffered update${bufferCount > 1 ? 's' : ''} (live updates paused while you type)`));\n console.error(chalk.gray(' Updates will resume after you submit feedback or 2min of inactivity\\n'));\n\n // Display buffered progress events\n // Note: We don't add separators - just display the progress naturally\n for (const event of this._progressBuffer) {\n if (event.prefix) {\n console.error(event.prefix, event.content);\n } else {\n console.error(event.content);\n }\n }\n\n this.clearProgressBuffer();\n\n // After flushing progress to stderr, ensure output synchronization\n // before redisplaying user input to stdout\n if (this._inputRedisplayCallback) {\n // Use setImmediate to ensure stderr flushes complete before stdout writes\n setImmediate(() => {\n // Ensure we're on a new line after progress output\n // This prevents the redisplayed input from mixing with progress output\n process.stdout.write('\\n');\n\n // Call the redisplay callback\n if (this._inputRedisplayCallback) {\n this._inputRedisplayCallback();\n }\n });\n }\n }\n\n /**\n * Manually flush buffered progress (can be called periodically)\n */\n flushBufferedProgress(): void {\n this.flushProgressBuffer();\n }\n\n /**\n * Get buffer statistics\n */\n getBufferStats(): { count: number; maxSize: number } {\n return {\n count: this._progressBuffer.length,\n maxSize: this._maxBufferSize\n };\n }\n}\n\n/**\n * Global singleton instance\n */\nconst globalFeedbackState = new FeedbackState();\n\n/**\n * Check if feedback collection is currently active\n */\nexport function isFeedbackActive(): boolean {\n return globalFeedbackState.isActive();\n}\n\n/**\n * Set feedback collection active state\n */\nexport function setFeedbackActive(active: boolean): void {\n globalFeedbackState.setActive(active);\n}\n\n/**\n * Buffer a progress event during active feedback collection\n */\nexport function bufferProgressEvent(content: any, prefix?: string): void {\n globalFeedbackState.bufferProgress(content, prefix);\n}\n\n/**\n * Get all buffered progress events\n */\nexport function getBufferedProgressEvents(): ProgressEvent[] {\n return globalFeedbackState.getBufferedProgress();\n}\n\n/**\n * Clear buffered progress events\n */\nexport function clearBufferedProgressEvents(): void {\n globalFeedbackState.clearProgressBuffer();\n}\n\n/**\n * Get buffer statistics\n */\nexport function getFeedbackBufferStats(): { count: number; maxSize: number } {\n return globalFeedbackState.getBufferStats();\n}\n\n/**\n * Manually flush buffered progress events\n * Useful for periodic flushing during feedback collection\n */\nexport function flushBufferedProgress(): void {\n globalFeedbackState.flushBufferedProgress();\n}\n\n/**\n * Set the callback to redisplay user input after progress flush\n */\nexport function setInputRedisplayCallback(callback: (() => void) | null): void {\n globalFeedbackState.setInputRedisplayCallback(callback);\n}\n\n/**\n * Reset all feedback state (useful for testing)\n */\nexport function resetFeedbackState(): void {\n globalFeedbackState.setActive(false);\n globalFeedbackState.clearProgressBuffer();\n}","/**\n * Stub MCP Client Implementation\n *\n * This is a minimal stub to allow the CLI to function without MCP dependencies.\n * Replace this with the full implementation when MCP SDK is available.\n */\n\nimport { writeTerminalProgressWithPrefix } from '../utils/terminal-progress-writer.js';\n\n// Stub types to match expected interface\nexport interface MCPClientOptions {\n serverPath?: string;\n timeout?: number;\n retries?: number;\n workingDirectory?: string;\n debug?: boolean;\n}\n\nexport interface ToolCallRequest {\n toolName: string;\n parameters?: Record<string, any>;\n}\n\nexport interface ToolCallResponse {\n toolId: string;\n content: string;\n success: boolean;\n duration: number;\n timestamp: Date;\n}\n\nexport interface MCPClient {\n connect(): Promise<void>;\n disconnect(): Promise<void>;\n callTool(request: ToolCallRequest): Promise<ToolCallResponse>;\n listTools(): Promise<string[]>;\n getConnectionStatus(): 'connected' | 'disconnected' | 'connecting' | 'error';\n ping(): Promise<boolean>;\n}\n\n/**\n * Stub MCP Client that simulates basic functionality\n */\nexport class StubMCPClient implements MCPClient {\n private options: MCPClientOptions;\n private connected: boolean = false;\n\n constructor(options: MCPClientOptions) {\n this.options = options;\n }\n\n async connect(): Promise<void> {\n if (this.options.debug) {\n writeTerminalProgressWithPrefix('[MCP]', 'Stub client connecting...');\n }\n this.connected = true;\n }\n\n async disconnect(): Promise<void> {\n if (this.options.debug) {\n writeTerminalProgressWithPrefix('[MCP]', 'Stub client disconnecting...');\n }\n this.connected = false;\n }\n\n async callTool(request: ToolCallRequest): Promise<ToolCallResponse> {\n if (!this.connected) {\n throw new Error('MCP client not connected');\n }\n\n if (this.options.debug) {\n writeTerminalProgressWithPrefix('[MCP] Stub tool call:', { tool: request.toolName, parameters: request.parameters });\n }\n\n // Simulate tool execution\n return {\n toolId: request.toolName,\n content: `Stub response for tool: ${request.toolName}\\nParameters: ${JSON.stringify(request.parameters, null, 2)}`,\n success: true,\n duration: Math.random() * 1000,\n timestamp: new Date()\n };\n }\n\n async listTools(): Promise<string[]> {\n return ['stub_tool', 'file_operations', 'code_analysis'];\n }\n\n getConnectionStatus(): 'connected' | 'disconnected' | 'connecting' | 'error' {\n return this.connected ? 'connected' : 'disconnected';\n }\n\n async ping(): Promise<boolean> {\n return this.connected;\n }\n}\n\n/**\n * Create a stub MCP client instance\n */\nexport function createMCPClient(options: MCPClientOptions): MCPClient {\n return new StubMCPClient(options);\n}\n\nexport default StubMCPClient;","/**\n * Advanced MCP Features\n */\n\nexport * from './progress-stream.js';","/**\n * Unified Error Hierarchy for juno-task-ts\n *\n * Provides a comprehensive error handling system with:\n * - Hierarchical error categories\n * - Rich error context and metadata\n * - Recovery strategies and retry mechanisms\n * - Unified error reporting and formatting\n *\n * This system consolidates error handling patterns from all modules\n * while preserving the sophistication of the MCP error framework.\n */\n\n// Core error types and interfaces\nexport * from './base';\nexport * from './categories';\nexport * from './codes';\nexport * from './context';\nexport * from './recovery';\n\n// Specialized error classes\nexport * from './system';\nexport * from './validation';\nexport * from './configuration';\nexport * from './mcp';\nexport * from './template';\nexport * from './session';\nexport * from './cli';\nexport * from './tui';\n\n// Error utilities and managers\nexport * from './utils';\nexport * from './manager';\nexport * from './reporter';\n\n// Legacy compatibility layer\nexport * from './legacy';","/**\n * Base Error Classes for Unified Error Hierarchy\n *\n * Provides the foundational error classes that all juno-task-ts errors inherit from,\n * with comprehensive context, recovery capabilities, and standardized interfaces.\n */\n\nimport type { ErrorCategory, ErrorSeverity, ErrorPriority, ErrorHandlingStrategy } from './categories';\nimport type { ErrorCode } from './codes';\nimport type { ErrorContext, ErrorMetadata, ErrorCorrelation, ErrorImpact } from './context';\nimport { createContextFromCode, createErrorCorrelation } from './context';\n\n/**\n * Recovery action that can be suggested for an error\n */\nexport interface RecoveryAction {\n /** Unique identifier for the recovery action */\n readonly id: string;\n\n /** Human-readable description of the action */\n readonly description: string;\n\n /** Type of recovery action */\n readonly type: RecoveryActionType;\n\n /** Whether this action can be automated */\n readonly canAutomate: boolean;\n\n /** Estimated success probability (0-1) */\n readonly successProbability?: number;\n\n /** Time estimate for recovery in milliseconds */\n readonly estimatedTime?: number;\n\n /** Prerequisites for this recovery action */\n readonly prerequisites?: readonly string[];\n\n /** Function to execute this recovery action */\n readonly execute?: () => Promise<RecoveryResult>;\n}\n\n/**\n * Types of recovery actions\n */\nexport enum RecoveryActionType {\n /** Retry the operation */\n RETRY = 'retry',\n\n /** Use fallback approach */\n FALLBACK = 'fallback',\n\n /** Repair or fix the issue */\n REPAIR = 'repair',\n\n /** Reset to known good state */\n RESET = 'reset',\n\n /** Manual user intervention required */\n MANUAL = 'manual',\n\n /** Escalate to higher level handler */\n ESCALATE = 'escalate',\n\n /** Ignore and continue */\n IGNORE = 'ignore'\n}\n\n/**\n * Result of a recovery attempt\n */\nexport interface RecoveryResult {\n /** Whether recovery was successful */\n readonly success: boolean;\n\n /** Description of what was done */\n readonly description: string;\n\n /** New error if recovery failed */\n readonly error?: Error;\n\n /** Additional context from recovery */\n readonly context?: Record<string, unknown>;\n\n /** Whether to retry original operation */\n readonly shouldRetry: boolean;\n\n /** Delay before retry in milliseconds */\n readonly retryDelay?: number;\n}\n\n/**\n * Interface for errors that support recovery\n */\nexport interface Recoverable {\n /** Check if this error is recoverable */\n isRecoverable(): boolean;\n\n /** Get available recovery actions */\n getRecoveryActions(): readonly RecoveryAction[];\n\n /** Attempt recovery using specified action */\n attemptRecovery(actionId: string): Promise<RecoveryResult>;\n\n /** Get default recovery action */\n getDefaultRecoveryAction(): RecoveryAction | null;\n}\n\n/**\n * Interface for errors that support retry logic\n */\nexport interface Retryable {\n /** Check if this error is retryable */\n isRetryable(): boolean;\n\n /** Get maximum number of retry attempts */\n getMaxRetries(): number;\n\n /** Get retry delay for attempt number */\n getRetryDelay(attempt: number): number;\n\n /** Check if should retry based on attempt history */\n shouldRetry(attempts: number): boolean;\n\n /** Get backoff strategy */\n getBackoffStrategy(): BackoffStrategy;\n}\n\n/**\n * Backoff strategy for retries\n */\nexport interface BackoffStrategy {\n /** Calculate delay for given attempt number */\n calculateDelay(attempt: number): number;\n\n /** Maximum delay in milliseconds */\n readonly maxDelay: number;\n\n /** Whether to use jitter */\n readonly useJitter: boolean;\n}\n\n/**\n * Base error class for all juno-task-ts errors\n */\nexport abstract class JunoTaskError extends Error implements Recoverable, Retryable {\n /** Unique error identifier */\n public readonly id: string;\n\n /** Error code */\n public abstract readonly code: ErrorCode;\n\n /** Error category */\n public abstract readonly category: ErrorCategory;\n\n /** Rich error context */\n public readonly context: ErrorContext;\n\n /** Error correlation information */\n public readonly correlation: ErrorCorrelation;\n\n /** Original cause of this error */\n public readonly cause?: Error;\n\n /** Error impact assessment */\n public readonly impact?: ErrorImpact;\n\n /** When this error was created */\n public readonly timestamp: Date;\n\n /** Available recovery actions */\n protected recoveryActions: readonly RecoveryAction[] = [];\n\n /**\n * Create a new JunoTaskError\n */\n constructor(\n message: string,\n options: {\n code: ErrorCode;\n category?: ErrorCategory;\n context?: Partial<ErrorContext>;\n cause?: Error;\n correlation?: Partial<ErrorCorrelation>;\n impact?: ErrorImpact;\n recoveryActions?: readonly RecoveryAction[];\n }\n ) {\n super(message);\n\n this.name = this.constructor.name;\n this.timestamp = new Date();\n this.id = this.generateErrorId();\n this.cause = options.cause;\n this.impact = options.impact;\n this.recoveryActions = options.recoveryActions || [];\n\n // Create rich context\n this.context = options.context\n ? createContextFromCode(options.code, options.context)\n : createContextFromCode(options.code);\n\n // Create correlation information\n this.correlation = {\n ...createErrorCorrelation(options.cause),\n ...options.correlation\n };\n\n // Ensure the error stack includes the cause chain\n if (this.cause && this.cause.stack) {\n this.stack = `${this.stack}\\nCaused by: ${this.cause.stack}`;\n }\n\n // Ensure non-enumerable properties for clean serialization\n Object.defineProperty(this, 'cause', { enumerable: false });\n Object.defineProperty(this, 'correlation', { enumerable: false });\n }\n\n // ============================================================================\n // Error Identification\n // ============================================================================\n\n /**\n * Get error severity\n */\n get severity(): ErrorSeverity {\n return this.context.severity;\n }\n\n /**\n * Get error priority\n */\n get priority(): ErrorPriority {\n return this.context.priority;\n }\n\n /**\n * Get error handling strategy\n */\n get strategy(): ErrorHandlingStrategy {\n return this.context.strategy;\n }\n\n /**\n * Check if this is a specific error code\n */\n public isCode(code: ErrorCode): boolean {\n return this.code === code;\n }\n\n /**\n * Check if this is a specific error category\n */\n public isCategory(category: ErrorCategory): boolean {\n return this.category === category;\n }\n\n // ============================================================================\n // Recoverable Interface Implementation\n // ============================================================================\n\n /**\n * Check if this error is recoverable\n */\n public isRecoverable(): boolean {\n return this.recoveryActions.length > 0;\n }\n\n /**\n * Get available recovery actions\n */\n public getRecoveryActions(): readonly RecoveryAction[] {\n return this.recoveryActions;\n }\n\n /**\n * Attempt recovery using specified action\n */\n public async attemptRecovery(actionId: string): Promise<RecoveryResult> {\n const action = this.recoveryActions.find(a => a.id === actionId);\n if (!action) {\n return {\n success: false,\n description: `Recovery action '${actionId}' not found`,\n shouldRetry: false\n };\n }\n\n if (!action.execute) {\n return {\n success: false,\n description: `Recovery action '${actionId}' has no execution handler`,\n shouldRetry: false\n };\n }\n\n try {\n return await action.execute();\n } catch (error) {\n return {\n success: false,\n description: `Recovery action '${actionId}' failed: ${error instanceof Error ? error.message : String(error)}`,\n error: error instanceof Error ? error : new Error(String(error)),\n shouldRetry: false\n };\n }\n }\n\n /**\n * Get default recovery action\n */\n public getDefaultRecoveryAction(): RecoveryAction | null {\n // Prefer automated actions\n const automated = this.recoveryActions.find(a => a.canAutomate);\n if (automated) return automated;\n\n // Fall back to highest probability action\n return this.recoveryActions.reduce((best, current) => {\n if (!best) return current;\n const bestProb = best.successProbability || 0;\n const currentProb = current.successProbability || 0;\n return currentProb > bestProb ? current : best;\n }, null as RecoveryAction | null);\n }\n\n // ============================================================================\n // Retryable Interface Implementation\n // ============================================================================\n\n /**\n * Check if this error is retryable\n */\n public isRetryable(): boolean {\n return this.context.isRetriable;\n }\n\n /**\n * Get maximum number of retry attempts\n */\n public getMaxRetries(): number {\n return this.context.maxRetries || 3;\n }\n\n /**\n * Get retry delay for attempt number\n */\n public getRetryDelay(attempt: number): number {\n const config = this.context.retryDelay;\n if (!config) return 1000; // Default 1 second\n\n return this.getBackoffStrategy().calculateDelay(attempt);\n }\n\n /**\n * Check if should retry based on attempt history\n */\n public shouldRetry(attempts: number): boolean {\n return this.isRetryable() && attempts < this.getMaxRetries();\n }\n\n /**\n * Get backoff strategy\n */\n public getBackoffStrategy(): BackoffStrategy {\n const config = this.context.retryDelay;\n if (!config) {\n return new ExponentialBackoffStrategy(1000, 30000, 2, true);\n }\n\n return new ExponentialBackoffStrategy(\n config.initialDelay,\n config.maxDelay,\n config.backoffMultiplier,\n config.useJitter\n );\n }\n\n // ============================================================================\n // Context and Metadata\n // ============================================================================\n\n /**\n * Add metadata to this error\n */\n public addMetadata(metadata: Partial<ErrorMetadata>): this {\n const newContext = {\n ...this.context,\n metadata: {\n ...this.context.metadata,\n ...metadata\n }\n };\n\n // Create new instance with updated context (errors should be immutable)\n Object.defineProperty(this, 'context', {\n value: newContext,\n writable: false,\n enumerable: true\n });\n\n return this;\n }\n\n /**\n * Add recovery action to this error\n */\n public addRecoveryAction(action: RecoveryAction): this {\n this.recoveryActions = [...this.recoveryActions, action];\n return this;\n }\n\n // ============================================================================\n // Serialization and Display\n // ============================================================================\n\n /**\n * Convert error to JSON for logging/transmission\n */\n public toJSON(): Record<string, unknown> {\n return {\n id: this.id,\n name: this.name,\n message: this.message,\n code: this.code,\n category: this.category,\n context: this.context,\n correlation: this.correlation,\n impact: this.impact,\n timestamp: this.timestamp.toISOString(),\n stack: this.stack,\n cause: this.cause ? {\n name: this.cause.name,\n message: this.cause.message,\n stack: this.cause.stack\n } : undefined\n };\n }\n\n /**\n * Get user-friendly error message with suggestions\n */\n public getUserMessage(): string {\n let message = this.message;\n\n if (this.context.recoverySuggestions && this.context.recoverySuggestions.length > 0) {\n message += '\\n\\nSuggestions:';\n this.context.recoverySuggestions.forEach((suggestion, index) => {\n message += `\\n ${index + 1}. ${suggestion}`;\n });\n }\n\n if (this.context.documentationLinks && this.context.documentationLinks.length > 0) {\n message += '\\n\\nDocumentation:';\n this.context.documentationLinks.forEach(link => {\n message += `\\n - ${link}`;\n });\n }\n\n return message;\n }\n\n /**\n * Generate unique error ID\n */\n private generateErrorId(): string {\n const timestamp = this.timestamp.getTime();\n const random = Math.random().toString(36).substr(2, 9);\n return `juno_${timestamp}_${random}`;\n }\n}\n\n/**\n * Exponential backoff strategy implementation\n */\nexport class ExponentialBackoffStrategy implements BackoffStrategy {\n constructor(\n private readonly initialDelay: number,\n public readonly maxDelay: number,\n private readonly multiplier: number,\n public readonly useJitter: boolean\n ) {}\n\n calculateDelay(attempt: number): number {\n const exponential = this.initialDelay * Math.pow(this.multiplier, attempt);\n const delay = Math.min(exponential, this.maxDelay);\n\n if (this.useJitter) {\n // Add up to 10% jitter to prevent thundering herd\n const jitter = delay * 0.1 * Math.random();\n return Math.floor(delay + jitter);\n }\n\n return delay;\n }\n}\n\n/**\n * Linear backoff strategy implementation\n */\nexport class LinearBackoffStrategy implements BackoffStrategy {\n constructor(\n private readonly baseDelay: number,\n public readonly maxDelay: number,\n public readonly useJitter: boolean = false\n ) {}\n\n calculateDelay(attempt: number): number {\n const linear = this.baseDelay * (attempt + 1);\n const delay = Math.min(linear, this.maxDelay);\n\n if (this.useJitter) {\n const jitter = delay * 0.1 * Math.random();\n return Math.floor(delay + jitter);\n }\n\n return delay;\n }\n}\n\n/**\n * Fixed backoff strategy implementation\n */\nexport class FixedBackoffStrategy implements BackoffStrategy {\n constructor(\n private readonly fixedDelay: number,\n public readonly maxDelay: number = fixedDelay,\n public readonly useJitter: boolean = false\n ) {}\n\n calculateDelay(_attempt: number): number {\n if (this.useJitter) {\n const jitter = this.fixedDelay * 0.1 * Math.random();\n return Math.floor(this.fixedDelay + jitter);\n }\n\n return this.fixedDelay;\n }\n}","/**\n * Error Context and Metadata System\n *\n * Provides rich contextual information for errors to enable\n * better debugging, recovery, and user assistance.\n */\n\nimport { ErrorCategory, ErrorSeverity, ErrorPriority, ErrorHandlingStrategy } from './categories';\nimport { ErrorCode } from './codes';\n\n/**\n * Rich error context containing all relevant information\n */\nexport interface ErrorContext {\n /** Primary error code */\n readonly code: ErrorCode;\n\n /** Error category */\n readonly category: ErrorCategory;\n\n /** Error severity level */\n readonly severity: ErrorSeverity;\n\n /** Error priority for handling */\n readonly priority: ErrorPriority;\n\n /** Recommended handling strategy */\n readonly strategy: ErrorHandlingStrategy;\n\n /** Component or module where error occurred */\n readonly component?: string;\n\n /** Operation being performed when error occurred */\n readonly operation?: string;\n\n /** Request ID or correlation ID */\n readonly requestId?: string;\n\n /** User ID or session ID */\n readonly userId?: string;\n\n /** Timestamp when error occurred */\n readonly timestamp: Date;\n\n /** Stack trace at point of error */\n readonly stackTrace?: string;\n\n /** Additional error metadata */\n readonly metadata?: ErrorMetadata;\n\n /** Recovery suggestions for user */\n readonly recoverySuggestions?: readonly string[];\n\n /** Related documentation links */\n readonly documentationLinks?: readonly string[];\n\n /** Whether error is retriable */\n readonly isRetriable: boolean;\n\n /** Maximum retry attempts */\n readonly maxRetries?: number;\n\n /** Retry delay configuration */\n readonly retryDelay?: RetryDelayConfig;\n}\n\n/**\n * Additional metadata that can be attached to errors\n */\nexport interface ErrorMetadata {\n /** File path related to error */\n readonly filePath?: string;\n\n /** Line number where error occurred */\n readonly lineNumber?: number;\n\n /** Column number where error occurred */\n readonly columnNumber?: number;\n\n /** Function name where error occurred */\n readonly functionName?: string;\n\n /** Input data that caused the error */\n readonly inputData?: unknown;\n\n /** Expected vs actual values */\n readonly expectedValue?: unknown;\n readonly actualValue?: unknown;\n\n /** Performance metrics at time of error */\n readonly performanceMetrics?: PerformanceMetrics;\n\n /** Environment information */\n readonly environment?: EnvironmentInfo;\n\n /** User agent or client information */\n readonly userAgent?: string;\n\n /** Request headers or parameters */\n readonly requestData?: Record<string, unknown>;\n\n /** Response data if applicable */\n readonly responseData?: unknown;\n\n /** External service information */\n readonly externalService?: ExternalServiceInfo;\n\n /** Custom application-specific metadata */\n readonly custom?: Record<string, unknown>;\n}\n\n/**\n * Performance metrics at time of error\n */\nexport interface PerformanceMetrics {\n /** Memory usage in bytes */\n readonly memoryUsage?: number;\n\n /** CPU usage percentage */\n readonly cpuUsage?: number;\n\n /** Operation duration in milliseconds */\n readonly duration?: number;\n\n /** Request/response time */\n readonly responseTime?: number;\n\n /** Queue size or backlog */\n readonly queueSize?: number;\n\n /** Active connection count */\n readonly activeConnections?: number;\n}\n\n/**\n * Environment information at time of error\n */\nexport interface EnvironmentInfo {\n /** Node.js version */\n readonly nodeVersion?: string;\n\n /** Operating system */\n readonly platform?: string;\n\n /** Architecture */\n readonly architecture?: string;\n\n /** Application version */\n readonly appVersion?: string;\n\n /** Environment mode (development, production, test) */\n readonly environment?: string;\n\n /** Available memory */\n readonly availableMemory?: number;\n\n /** Working directory */\n readonly workingDirectory?: string;\n\n /** Environment variables (sanitized) */\n readonly environmentVariables?: Record<string, string>;\n}\n\n/**\n * External service information\n */\nexport interface ExternalServiceInfo {\n /** Service name */\n readonly serviceName?: string;\n\n /** Service URL or endpoint */\n readonly serviceUrl?: string;\n\n /** Service version */\n readonly serviceVersion?: string;\n\n /** HTTP status code */\n readonly httpStatus?: number;\n\n /** Service response time */\n readonly responseTime?: number;\n\n /** Service availability */\n readonly isAvailable?: boolean;\n\n /** Rate limit information */\n readonly rateLimitInfo?: RateLimitInfo;\n}\n\n/**\n * Rate limit information\n */\nexport interface RateLimitInfo {\n /** Remaining requests */\n readonly remaining?: number;\n\n /** Request limit */\n readonly limit?: number;\n\n /** Reset time */\n readonly resetTime?: Date;\n\n /** Retry after time */\n readonly retryAfter?: number;\n}\n\n/**\n * Retry delay configuration\n */\nexport interface RetryDelayConfig {\n /** Initial delay in milliseconds */\n readonly initialDelay: number;\n\n /** Maximum delay in milliseconds */\n readonly maxDelay: number;\n\n /** Backoff multiplier */\n readonly backoffMultiplier: number;\n\n /** Whether to add jitter */\n readonly useJitter: boolean;\n}\n\n/**\n * Error correlation information for tracking related errors\n */\nexport interface ErrorCorrelation {\n /** Parent error ID */\n readonly parentErrorId?: string;\n\n /** Root cause error ID */\n readonly rootCauseId?: string;\n\n /** Related error IDs */\n readonly relatedErrorIds?: readonly string[];\n\n /** Error chain depth */\n readonly chainDepth?: number;\n\n /** Session correlation ID */\n readonly sessionId?: string;\n\n /** Operation correlation ID */\n readonly operationId?: string;\n}\n\n/**\n * Error impact assessment\n */\nexport interface ErrorImpact {\n /** Number of users affected */\n readonly usersAffected?: number;\n\n /** Number of operations failed */\n readonly operationsFailed?: number;\n\n /** Business impact level */\n readonly businessImpact?: 'low' | 'medium' | 'high' | 'critical';\n\n /** Financial impact estimate */\n readonly financialImpact?: number;\n\n /** Performance impact */\n readonly performanceImpact?: PerformanceImpact;\n\n /** Data integrity impact */\n readonly dataIntegrityImpact?: boolean;\n\n /** Security impact */\n readonly securityImpact?: boolean;\n}\n\n/**\n * Performance impact details\n */\nexport interface PerformanceImpact {\n /** Response time degradation percentage */\n readonly responseTimeDegradation?: number;\n\n /** Throughput reduction percentage */\n readonly throughputReduction?: number;\n\n /** Memory usage increase percentage */\n readonly memoryUsageIncrease?: number;\n\n /** CPU usage increase percentage */\n readonly cpuUsageIncrease?: number;\n}\n\n/**\n * Create basic error context with minimal required information\n */\nexport function createErrorContext(\n code: ErrorCode,\n category: ErrorCategory,\n options?: Partial<ErrorContext>\n): ErrorContext {\n return {\n code,\n category,\n severity: options?.severity || ErrorSeverity.MEDIUM,\n priority: options?.priority || ErrorPriority.NORMAL,\n strategy: options?.strategy || ErrorHandlingStrategy.FAIL_FAST,\n timestamp: new Date(),\n isRetriable: options?.isRetriable ?? false,\n ...options\n };\n}\n\n/**\n * Create error context with automatic defaults based on code\n */\nexport function createContextFromCode(\n code: ErrorCode,\n overrides?: Partial<ErrorContext>\n): ErrorContext {\n // Auto-determine category from error code\n const codeString = code.toString();\n const categoryPrefix = codeString.split('_')[0].toLowerCase();\n\n let category: ErrorCategory;\n switch (categoryPrefix) {\n case 'system':\n category = ErrorCategory.SYSTEM;\n break;\n case 'validation':\n category = ErrorCategory.VALIDATION;\n break;\n case 'config':\n category = ErrorCategory.CONFIGURATION;\n break;\n case 'mcp':\n category = ErrorCategory.MCP;\n break;\n case 'template':\n category = ErrorCategory.TEMPLATE;\n break;\n case 'session':\n category = ErrorCategory.SESSION;\n break;\n case 'cli':\n category = ErrorCategory.CLI;\n break;\n case 'tui':\n category = ErrorCategory.TUI;\n break;\n case 'network':\n category = ErrorCategory.NETWORK;\n break;\n case 'security':\n category = ErrorCategory.SECURITY;\n break;\n case 'internal':\n category = ErrorCategory.INTERNAL;\n break;\n default:\n category = ErrorCategory.INTERNAL;\n }\n\n return createErrorContext(code, category, overrides);\n}\n\n/**\n * Enrich error context with additional metadata\n */\nexport function enrichErrorContext(\n context: ErrorContext,\n metadata: Partial<ErrorMetadata>\n): ErrorContext {\n return {\n ...context,\n metadata: {\n ...context.metadata,\n ...metadata\n }\n };\n}\n\n/**\n * Create correlation information for error chaining\n */\nexport function createErrorCorrelation(\n parentError?: Error,\n operationId?: string\n): ErrorCorrelation {\n return {\n parentErrorId: parentError ? generateErrorId(parentError) : undefined,\n operationId,\n chainDepth: getErrorChainDepth(parentError),\n sessionId: generateSessionId()\n };\n}\n\n/**\n * Generate unique error ID for correlation\n */\nfunction generateErrorId(error: Error): string {\n const timestamp = Date.now();\n const hash = simpleHash(error.message + error.stack);\n return `err_${timestamp}_${hash}`;\n}\n\n/**\n * Generate session ID for correlation\n */\nfunction generateSessionId(): string {\n return `sess_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\n/**\n * Get error chain depth for correlation\n */\nfunction getErrorChainDepth(error?: Error): number {\n let depth = 0;\n let currentError = error;\n\n while (currentError && 'cause' in currentError && currentError.cause) {\n depth++;\n currentError = currentError.cause as Error;\n }\n\n return depth;\n}\n\n/**\n * Simple hash function for error ID generation\n */\nfunction simpleHash(str: string): string {\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n return Math.abs(hash).toString(36).substr(0, 8);\n}","/**\n * Error Categories for Unified Error Hierarchy\n *\n * Defines the main error categories used throughout juno-task-ts\n * for organizing and handling different types of errors.\n */\n\n/**\n * Primary error categories in the juno-task-ts system\n */\nexport enum ErrorCategory {\n /** System-level errors (file system, network, OS operations) */\n SYSTEM = 'system',\n\n /** Input validation and schema errors */\n VALIDATION = 'validation',\n\n /** Configuration file and setup errors */\n CONFIGURATION = 'configuration',\n\n /** MCP server interaction errors */\n MCP = 'mcp',\n\n /** Template processing and generation errors */\n TEMPLATE = 'template',\n\n /** Session management and state errors */\n SESSION = 'session',\n\n /** Command-line interface errors */\n CLI = 'cli',\n\n /** Terminal user interface errors */\n TUI = 'tui',\n\n /** Internal application errors */\n INTERNAL = 'internal',\n\n /** Network and connectivity errors */\n NETWORK = 'network',\n\n /** Security and permission errors */\n SECURITY = 'security'\n}\n\n/**\n * Error severity levels for prioritizing and handling errors\n */\nexport enum ErrorSeverity {\n /** Low impact errors that don't affect functionality */\n LOW = 'low',\n\n /** Medium impact errors that may degrade functionality */\n MEDIUM = 'medium',\n\n /** High impact errors that significantly affect functionality */\n HIGH = 'high',\n\n /** Critical errors that prevent normal operation */\n CRITICAL = 'critical',\n\n /** Fatal errors that require immediate termination */\n FATAL = 'fatal'\n}\n\n/**\n * Error priority for handling and recovery order\n */\nexport enum ErrorPriority {\n /** Lowest priority - handle when convenient */\n LOWEST = 0,\n\n /** Low priority - handle in background */\n LOW = 1,\n\n /** Normal priority - handle in normal flow */\n NORMAL = 2,\n\n /** High priority - handle immediately */\n HIGH = 3,\n\n /** Highest priority - handle before all others */\n HIGHEST = 4\n}\n\n/**\n * Error handling strategy types\n */\nexport enum ErrorHandlingStrategy {\n /** Fail fast - throw error immediately */\n FAIL_FAST = 'fail_fast',\n\n /** Retry - attempt operation again */\n RETRY = 'retry',\n\n /** Fallback - use alternative approach */\n FALLBACK = 'fallback',\n\n /** Graceful degradation - continue with reduced functionality */\n GRACEFUL_DEGRADATION = 'graceful_degradation',\n\n /** User intervention - require user action */\n USER_INTERVENTION = 'user_intervention',\n\n /** Ignore - log and continue */\n IGNORE = 'ignore'\n}\n\n/**\n * Mapping of error categories to default severity levels\n */\nexport const DEFAULT_CATEGORY_SEVERITY: Record<ErrorCategory, ErrorSeverity> = {\n [ErrorCategory.SYSTEM]: ErrorSeverity.HIGH,\n [ErrorCategory.VALIDATION]: ErrorSeverity.MEDIUM,\n [ErrorCategory.CONFIGURATION]: ErrorSeverity.HIGH,\n [ErrorCategory.MCP]: ErrorSeverity.HIGH,\n [ErrorCategory.TEMPLATE]: ErrorSeverity.MEDIUM,\n [ErrorCategory.SESSION]: ErrorSeverity.MEDIUM,\n [ErrorCategory.CLI]: ErrorSeverity.LOW,\n [ErrorCategory.TUI]: ErrorSeverity.LOW,\n [ErrorCategory.INTERNAL]: ErrorSeverity.CRITICAL,\n [ErrorCategory.NETWORK]: ErrorSeverity.HIGH,\n [ErrorCategory.SECURITY]: ErrorSeverity.CRITICAL\n};\n\n/**\n * Mapping of error categories to default handling strategies\n */\nexport const DEFAULT_CATEGORY_STRATEGY: Record<ErrorCategory, ErrorHandlingStrategy> = {\n [ErrorCategory.SYSTEM]: ErrorHandlingStrategy.RETRY,\n [ErrorCategory.VALIDATION]: ErrorHandlingStrategy.USER_INTERVENTION,\n [ErrorCategory.CONFIGURATION]: ErrorHandlingStrategy.USER_INTERVENTION,\n [ErrorCategory.MCP]: ErrorHandlingStrategy.RETRY,\n [ErrorCategory.TEMPLATE]: ErrorHandlingStrategy.FALLBACK,\n [ErrorCategory.SESSION]: ErrorHandlingStrategy.RETRY,\n [ErrorCategory.CLI]: ErrorHandlingStrategy.USER_INTERVENTION,\n [ErrorCategory.TUI]: ErrorHandlingStrategy.FALLBACK,\n [ErrorCategory.INTERNAL]: ErrorHandlingStrategy.FAIL_FAST,\n [ErrorCategory.NETWORK]: ErrorHandlingStrategy.RETRY,\n [ErrorCategory.SECURITY]: ErrorHandlingStrategy.FAIL_FAST\n};\n\n/**\n * Check if an error category is retriable by default\n */\nexport function isCategoryRetriable(category: ErrorCategory): boolean {\n const strategy = DEFAULT_CATEGORY_STRATEGY[category];\n return strategy === ErrorHandlingStrategy.RETRY || strategy === ErrorHandlingStrategy.FALLBACK;\n}\n\n/**\n * Get the default priority for an error category\n */\nexport function getCategoryPriority(category: ErrorCategory): ErrorPriority {\n const severity = DEFAULT_CATEGORY_SEVERITY[category];\n\n switch (severity) {\n case ErrorSeverity.FATAL:\n return ErrorPriority.HIGHEST;\n case ErrorSeverity.CRITICAL:\n return ErrorPriority.HIGH;\n case ErrorSeverity.HIGH:\n return ErrorPriority.HIGH;\n case ErrorSeverity.MEDIUM:\n return ErrorPriority.NORMAL;\n case ErrorSeverity.LOW:\n default:\n return ErrorPriority.LOW;\n }\n}","/**\n * Error Codes for Unified Error Hierarchy\n *\n * Standardized error codes using hierarchical naming convention:\n * CATEGORY_SUBCATEGORY_SPECIFIC\n *\n * This provides consistent error identification across all modules\n * while maintaining compatibility with existing MCP error codes.\n */\n\n/**\n * Comprehensive error codes for all juno-task-ts modules\n */\nexport enum ErrorCode {\n // ============================================================================\n // SYSTEM ERRORS (File system, OS, hardware)\n // ============================================================================\n\n /** File or directory not found */\n SYSTEM_FILE_NOT_FOUND = 'SYSTEM_FILE_NOT_FOUND',\n\n /** Permission denied for file/directory operation */\n SYSTEM_PERMISSION_DENIED = 'SYSTEM_PERMISSION_DENIED',\n\n /** Disk space insufficient */\n SYSTEM_DISK_FULL = 'SYSTEM_DISK_FULL',\n\n /** File or directory already exists */\n SYSTEM_ALREADY_EXISTS = 'SYSTEM_ALREADY_EXISTS',\n\n /** File system operation failed */\n SYSTEM_IO_ERROR = 'SYSTEM_IO_ERROR',\n\n /** Path is invalid or malformed */\n SYSTEM_INVALID_PATH = 'SYSTEM_INVALID_PATH',\n\n /** Resource is locked or busy */\n SYSTEM_RESOURCE_BUSY = 'SYSTEM_RESOURCE_BUSY',\n\n /** System resource exhausted */\n SYSTEM_RESOURCE_EXHAUSTED = 'SYSTEM_RESOURCE_EXHAUSTED',\n\n // ============================================================================\n // VALIDATION ERRORS (Input validation, schema validation)\n // ============================================================================\n\n /** Required field is missing */\n VALIDATION_REQUIRED_FIELD = 'VALIDATION_REQUIRED_FIELD',\n\n /** Field value has invalid format */\n VALIDATION_INVALID_FORMAT = 'VALIDATION_INVALID_FORMAT',\n\n /** Field value is out of allowed range */\n VALIDATION_OUT_OF_RANGE = 'VALIDATION_OUT_OF_RANGE',\n\n /** Field value doesn't match allowed options */\n VALIDATION_INVALID_CHOICE = 'VALIDATION_INVALID_CHOICE',\n\n /** Schema validation failed */\n VALIDATION_SCHEMA_ERROR = 'VALIDATION_SCHEMA_ERROR',\n\n /** Type validation failed */\n VALIDATION_TYPE_ERROR = 'VALIDATION_TYPE_ERROR',\n\n /** Constraint validation failed */\n VALIDATION_CONSTRAINT_ERROR = 'VALIDATION_CONSTRAINT_ERROR',\n\n /** Cross-field validation failed */\n VALIDATION_DEPENDENCY_ERROR = 'VALIDATION_DEPENDENCY_ERROR',\n\n // ============================================================================\n // CONFIGURATION ERRORS (Config files, setup, initialization)\n // ============================================================================\n\n /** Configuration file not found */\n CONFIG_FILE_NOT_FOUND = 'CONFIG_FILE_NOT_FOUND',\n\n /** Configuration file has invalid syntax */\n CONFIG_INVALID_SYNTAX = 'CONFIG_INVALID_SYNTAX',\n\n /** Configuration file has invalid schema */\n CONFIG_INVALID_SCHEMA = 'CONFIG_INVALID_SCHEMA',\n\n /** Required configuration option missing */\n CONFIG_MISSING_OPTION = 'CONFIG_MISSING_OPTION',\n\n /** Configuration option has invalid value */\n CONFIG_INVALID_VALUE = 'CONFIG_INVALID_VALUE',\n\n /** Configuration file cannot be loaded */\n CONFIG_LOAD_ERROR = 'CONFIG_LOAD_ERROR',\n\n /** Configuration file cannot be saved */\n CONFIG_SAVE_ERROR = 'CONFIG_SAVE_ERROR',\n\n /** Configuration migration failed */\n CONFIG_MIGRATION_ERROR = 'CONFIG_MIGRATION_ERROR',\n\n // ============================================================================\n // MCP ERRORS (Model Context Protocol server interactions)\n // ============================================================================\n\n /** Failed to connect to MCP server */\n MCP_CONNECTION_FAILED = 'MCP_CONNECTION_FAILED',\n\n /** Connection to MCP server lost */\n MCP_CONNECTION_LOST = 'MCP_CONNECTION_LOST',\n\n /** MCP server connection timeout */\n MCP_CONNECTION_TIMEOUT = 'MCP_CONNECTION_TIMEOUT',\n\n /** MCP tool execution failed */\n MCP_TOOL_EXECUTION_FAILED = 'MCP_TOOL_EXECUTION_FAILED',\n\n /** MCP tool not found */\n MCP_TOOL_NOT_FOUND = 'MCP_TOOL_NOT_FOUND',\n\n /** MCP operation timeout */\n MCP_OPERATION_TIMEOUT = 'MCP_OPERATION_TIMEOUT',\n\n /** MCP rate limit exceeded */\n MCP_RATE_LIMIT_EXCEEDED = 'MCP_RATE_LIMIT_EXCEEDED',\n\n /** MCP server authentication failed */\n MCP_AUTH_FAILED = 'MCP_AUTH_FAILED',\n\n /** MCP server configuration invalid */\n MCP_CONFIG_INVALID = 'MCP_CONFIG_INVALID',\n\n /** MCP server not responding */\n MCP_SERVER_UNRESPONSIVE = 'MCP_SERVER_UNRESPONSIVE',\n\n /** MCP protocol version mismatch */\n MCP_VERSION_MISMATCH = 'MCP_VERSION_MISMATCH',\n\n /** MCP server returned invalid response */\n MCP_INVALID_RESPONSE = 'MCP_INVALID_RESPONSE',\n\n // ============================================================================\n // TEMPLATE ERRORS (Template processing and generation)\n // ============================================================================\n\n /** Template file not found */\n TEMPLATE_NOT_FOUND = 'TEMPLATE_NOT_FOUND',\n\n /** Template syntax error */\n TEMPLATE_SYNTAX_ERROR = 'TEMPLATE_SYNTAX_ERROR',\n\n /** Template variable not defined */\n TEMPLATE_VARIABLE_UNDEFINED = 'TEMPLATE_VARIABLE_UNDEFINED',\n\n /** Template variable has invalid value */\n TEMPLATE_VARIABLE_INVALID = 'TEMPLATE_VARIABLE_INVALID',\n\n /** Template compilation failed */\n TEMPLATE_COMPILATION_FAILED = 'TEMPLATE_COMPILATION_FAILED',\n\n /** Template rendering failed */\n TEMPLATE_RENDER_FAILED = 'TEMPLATE_RENDER_FAILED',\n\n /** Template generation failed */\n TEMPLATE_GENERATION_FAILED = 'TEMPLATE_GENERATION_FAILED',\n\n /** Template helper function error */\n TEMPLATE_HELPER_ERROR = 'TEMPLATE_HELPER_ERROR',\n\n // ============================================================================\n // SESSION ERRORS (Session management and state)\n // ============================================================================\n\n /** Session not found */\n SESSION_NOT_FOUND = 'SESSION_NOT_FOUND',\n\n /** Session already exists */\n SESSION_ALREADY_EXISTS = 'SESSION_ALREADY_EXISTS',\n\n /** Session has expired */\n SESSION_EXPIRED = 'SESSION_EXPIRED',\n\n /** Session is invalid */\n SESSION_INVALID = 'SESSION_INVALID',\n\n /** Session creation failed */\n SESSION_CREATION_FAILED = 'SESSION_CREATION_FAILED',\n\n /** Session state corruption */\n SESSION_CORRUPTED = 'SESSION_CORRUPTED',\n\n /** Session serialization failed */\n SESSION_SERIALIZE_ERROR = 'SESSION_SERIALIZE_ERROR',\n\n /** Session deserialization failed */\n SESSION_DESERIALIZE_ERROR = 'SESSION_DESERIALIZE_ERROR',\n\n // ============================================================================\n // CLI ERRORS (Command-line interface)\n // ============================================================================\n\n /** Command not found */\n CLI_COMMAND_NOT_FOUND = 'CLI_COMMAND_NOT_FOUND',\n\n /** Invalid command arguments */\n CLI_INVALID_ARGUMENTS = 'CLI_INVALID_ARGUMENTS',\n\n /** Missing required arguments */\n CLI_MISSING_ARGUMENTS = 'CLI_MISSING_ARGUMENTS',\n\n /** Command execution failed */\n CLI_EXECUTION_FAILED = 'CLI_EXECUTION_FAILED',\n\n /** Command interrupted */\n CLI_INTERRUPTED = 'CLI_INTERRUPTED',\n\n /** Command timeout */\n CLI_TIMEOUT = 'CLI_TIMEOUT',\n\n /** Help system error */\n CLI_HELP_ERROR = 'CLI_HELP_ERROR',\n\n /** Command parsing error */\n CLI_PARSE_ERROR = 'CLI_PARSE_ERROR',\n\n // ============================================================================\n // TUI ERRORS (Terminal user interface)\n // ============================================================================\n\n /** TUI rendering failed */\n TUI_RENDER_ERROR = 'TUI_RENDER_ERROR',\n\n /** TUI input handling failed */\n TUI_INPUT_ERROR = 'TUI_INPUT_ERROR',\n\n /** TUI component error */\n TUI_COMPONENT_ERROR = 'TUI_COMPONENT_ERROR',\n\n /** TUI layout error */\n TUI_LAYOUT_ERROR = 'TUI_LAYOUT_ERROR',\n\n /** TUI not available in environment */\n TUI_NOT_AVAILABLE = 'TUI_NOT_AVAILABLE',\n\n /** TUI context error */\n TUI_CONTEXT_ERROR = 'TUI_CONTEXT_ERROR',\n\n /** TUI navigation error */\n TUI_NAVIGATION_ERROR = 'TUI_NAVIGATION_ERROR',\n\n /** TUI state management error */\n TUI_STATE_ERROR = 'TUI_STATE_ERROR',\n\n // ============================================================================\n // NETWORK ERRORS (Network connectivity and requests)\n // ============================================================================\n\n /** Network connection failed */\n NETWORK_CONNECTION_FAILED = 'NETWORK_CONNECTION_FAILED',\n\n /** Network timeout */\n NETWORK_TIMEOUT = 'NETWORK_TIMEOUT',\n\n /** DNS resolution failed */\n NETWORK_DNS_ERROR = 'NETWORK_DNS_ERROR',\n\n /** Network unreachable */\n NETWORK_UNREACHABLE = 'NETWORK_UNREACHABLE',\n\n /** SSL/TLS certificate error */\n NETWORK_SSL_ERROR = 'NETWORK_SSL_ERROR',\n\n /** Proxy error */\n NETWORK_PROXY_ERROR = 'NETWORK_PROXY_ERROR',\n\n /** HTTP error response */\n NETWORK_HTTP_ERROR = 'NETWORK_HTTP_ERROR',\n\n /** Request interrupted */\n NETWORK_REQUEST_INTERRUPTED = 'NETWORK_REQUEST_INTERRUPTED',\n\n // ============================================================================\n // SECURITY ERRORS (Security and permissions)\n // ============================================================================\n\n /** Authentication failed */\n SECURITY_AUTH_FAILED = 'SECURITY_AUTH_FAILED',\n\n /** Authorization denied */\n SECURITY_AUTH_DENIED = 'SECURITY_AUTH_DENIED',\n\n /** Invalid credentials */\n SECURITY_INVALID_CREDENTIALS = 'SECURITY_INVALID_CREDENTIALS',\n\n /** Token expired */\n SECURITY_TOKEN_EXPIRED = 'SECURITY_TOKEN_EXPIRED',\n\n /** Invalid token */\n SECURITY_INVALID_TOKEN = 'SECURITY_INVALID_TOKEN',\n\n /** Security policy violation */\n SECURITY_POLICY_VIOLATION = 'SECURITY_POLICY_VIOLATION',\n\n /** Encryption failed */\n SECURITY_ENCRYPTION_FAILED = 'SECURITY_ENCRYPTION_FAILED',\n\n /** Decryption failed */\n SECURITY_DECRYPTION_FAILED = 'SECURITY_DECRYPTION_FAILED',\n\n // ============================================================================\n // INTERNAL ERRORS (Application internal errors)\n // ============================================================================\n\n /** Unexpected internal error */\n INTERNAL_UNEXPECTED_ERROR = 'INTERNAL_UNEXPECTED_ERROR',\n\n /** Assertion failure */\n INTERNAL_ASSERTION_FAILED = 'INTERNAL_ASSERTION_FAILED',\n\n /** Invalid state */\n INTERNAL_INVALID_STATE = 'INTERNAL_INVALID_STATE',\n\n /** Not implemented */\n INTERNAL_NOT_IMPLEMENTED = 'INTERNAL_NOT_IMPLEMENTED',\n\n /** Memory allocation failed */\n INTERNAL_MEMORY_ERROR = 'INTERNAL_MEMORY_ERROR',\n\n /** Threading error */\n INTERNAL_THREAD_ERROR = 'INTERNAL_THREAD_ERROR',\n\n /** Deadlock detected */\n INTERNAL_DEADLOCK = 'INTERNAL_DEADLOCK',\n\n /** Resource leak detected */\n INTERNAL_RESOURCE_LEAK = 'INTERNAL_RESOURCE_LEAK'\n}\n\n/**\n * Error code categories mapping for quick lookup\n */\nexport const ERROR_CODE_CATEGORIES: Record<string, string> = {\n SYSTEM: 'system',\n VALIDATION: 'validation',\n CONFIG: 'configuration',\n MCP: 'mcp',\n TEMPLATE: 'template',\n SESSION: 'session',\n CLI: 'cli',\n TUI: 'tui',\n NETWORK: 'network',\n SECURITY: 'security',\n INTERNAL: 'internal'\n};\n\n/**\n * Get the category from an error code\n */\nexport function getErrorCodeCategory(code: ErrorCode): string {\n const prefix = code.split('_')[0];\n return ERROR_CODE_CATEGORIES[prefix] || 'unknown';\n}\n\n/**\n * Check if an error code indicates a retriable error\n */\nexport function isRetriableErrorCode(code: ErrorCode): boolean {\n const retriableCodes = [\n ErrorCode.SYSTEM_RESOURCE_BUSY,\n ErrorCode.MCP_CONNECTION_TIMEOUT,\n ErrorCode.MCP_OPERATION_TIMEOUT,\n ErrorCode.MCP_RATE_LIMIT_EXCEEDED,\n ErrorCode.MCP_SERVER_UNRESPONSIVE,\n ErrorCode.NETWORK_CONNECTION_FAILED,\n ErrorCode.NETWORK_TIMEOUT,\n ErrorCode.NETWORK_DNS_ERROR,\n ErrorCode.NETWORK_UNREACHABLE,\n ErrorCode.NETWORK_REQUEST_INTERRUPTED\n ];\n\n return retriableCodes.includes(code);\n}\n\n/**\n * Check if an error code indicates a user intervention required\n */\nexport function requiresUserIntervention(code: ErrorCode): boolean {\n const userInterventionCodes = [\n ErrorCode.SYSTEM_PERMISSION_DENIED,\n ErrorCode.VALIDATION_REQUIRED_FIELD,\n ErrorCode.VALIDATION_INVALID_FORMAT,\n ErrorCode.CONFIG_FILE_NOT_FOUND,\n ErrorCode.CONFIG_INVALID_SYNTAX,\n ErrorCode.CONFIG_MISSING_OPTION,\n ErrorCode.MCP_AUTH_FAILED,\n ErrorCode.MCP_CONFIG_INVALID,\n ErrorCode.CLI_COMMAND_NOT_FOUND,\n ErrorCode.CLI_INVALID_ARGUMENTS,\n ErrorCode.CLI_MISSING_ARGUMENTS,\n ErrorCode.SECURITY_AUTH_FAILED,\n ErrorCode.SECURITY_INVALID_CREDENTIALS\n ];\n\n return userInterventionCodes.includes(code);\n}","/**\n * Error Recovery Framework\n *\n * Provides comprehensive error recovery mechanisms including\n * retry strategies, fallback handling, and recovery orchestration.\n */\n\nimport type { JunoTaskError, RecoveryAction, RecoveryResult } from './base';\nimport type { ErrorCategory, ErrorHandlingStrategy } from './categories';\nimport type { ErrorCode } from './codes';\n\n/**\n * Recovery strategy configuration\n */\nexport interface RecoveryStrategy {\n /** Strategy identifier */\n readonly id: string;\n\n /** Strategy name */\n readonly name: string;\n\n /** Strategy description */\n readonly description: string;\n\n /** Error categories this strategy applies to */\n readonly applicableCategories: readonly ErrorCategory[];\n\n /** Error codes this strategy applies to */\n readonly applicableCodes?: readonly ErrorCode[];\n\n /** Error handling strategy type */\n readonly handlingStrategy: ErrorHandlingStrategy;\n\n /** Priority of this strategy (higher = preferred) */\n readonly priority: number;\n\n /** Whether this strategy can be automated */\n readonly canAutomate: boolean;\n\n /** Maximum number of attempts */\n readonly maxAttempts: number;\n\n /** Timeout for recovery attempt in milliseconds */\n readonly timeout?: number;\n\n /** Prerequisites for using this strategy */\n readonly prerequisites?: readonly string[];\n\n /** Strategy configuration */\n readonly config?: Record<string, unknown>;\n}\n\n/**\n * Recovery context for strategy execution\n */\nexport interface RecoveryContext {\n /** Error being recovered from */\n readonly error: JunoTaskError;\n\n /** Previous recovery attempts */\n readonly previousAttempts: readonly RecoveryAttempt[];\n\n /** Current attempt number */\n readonly attemptNumber: number;\n\n /** Operation context */\n readonly operationContext?: Record<string, unknown>;\n\n /** User preferences for recovery */\n readonly userPreferences?: RecoveryPreferences;\n\n /** Time budget for recovery */\n readonly timeBudget?: number;\n\n /** Available resources for recovery */\n readonly availableResources?: Record<string, unknown>;\n}\n\n/**\n * User preferences for error recovery\n */\nexport interface RecoveryPreferences {\n /** Whether to attempt automatic recovery */\n readonly allowAutomaticRecovery: boolean;\n\n /** Whether to ask for user confirmation */\n readonly requireUserConfirmation: boolean;\n\n /** Maximum time to spend on recovery */\n readonly maxRecoveryTime?: number;\n\n /** Preferred recovery strategies */\n readonly preferredStrategies?: readonly string[];\n\n /** Strategies to avoid */\n readonly avoidedStrategies?: readonly string[];\n}\n\n/**\n * Record of a recovery attempt\n */\nexport interface RecoveryAttempt {\n /** Attempt identifier */\n readonly id: string;\n\n /** Strategy used */\n readonly strategy: RecoveryStrategy;\n\n /** Recovery action executed */\n readonly action?: RecoveryAction;\n\n /** Timestamp of attempt */\n readonly timestamp: Date;\n\n /** Duration of attempt in milliseconds */\n readonly duration: number;\n\n /** Result of the attempt */\n readonly result: RecoveryResult;\n\n /** Context during attempt */\n readonly context: Record<string, unknown>;\n}\n\n/**\n * Recovery plan containing multiple strategies\n */\nexport interface RecoveryPlan {\n /** Plan identifier */\n readonly id: string;\n\n /** Error this plan applies to */\n readonly error: JunoTaskError;\n\n /** Ordered list of recovery strategies to try */\n readonly strategies: readonly RecoveryStrategy[];\n\n /** Plan metadata */\n readonly metadata: {\n readonly createdAt: Date;\n readonly estimatedTime: number;\n readonly successProbability: number;\n readonly requiresUserIntervention: boolean;\n };\n}\n\n/**\n * Interface for implementing recovery strategies\n */\nexport interface RecoveryStrategyExecutor {\n /** Execute the recovery strategy */\n execute(context: RecoveryContext): Promise<RecoveryResult>;\n\n /** Check if strategy can be applied to error */\n canApply(error: JunoTaskError, context: RecoveryContext): boolean;\n\n /** Estimate success probability for this error */\n estimateSuccessProbability(error: JunoTaskError, context: RecoveryContext): number;\n\n /** Estimate time required for recovery */\n estimateTime(error: JunoTaskError, context: RecoveryContext): number;\n}\n\n/**\n * Central error recovery manager\n */\nexport class ErrorRecoveryManager {\n private strategies = new Map<string, RecoveryStrategy>();\n private executors = new Map<string, RecoveryStrategyExecutor>();\n private recoveryHistory = new Map<string, readonly RecoveryAttempt[]>();\n\n /**\n * Register a recovery strategy\n */\n public registerStrategy(strategy: RecoveryStrategy, executor: RecoveryStrategyExecutor): void {\n this.strategies.set(strategy.id, strategy);\n this.executors.set(strategy.id, executor);\n }\n\n /**\n * Create recovery plan for an error\n */\n public createRecoveryPlan(\n error: JunoTaskError,\n preferences?: RecoveryPreferences\n ): RecoveryPlan {\n const applicableStrategies = this.findApplicableStrategies(error, preferences);\n const sortedStrategies = this.prioritizeStrategies(applicableStrategies, error, preferences);\n\n const estimatedTime = sortedStrategies.reduce((total, strategy) => {\n const executor = this.executors.get(strategy.id);\n if (executor) {\n return total + executor.estimateTime(error, this.createContext(error));\n }\n return total;\n }, 0);\n\n const successProbability = this.calculatePlanSuccessProbability(sortedStrategies, error);\n const requiresUserIntervention = sortedStrategies.some(s => !s.canAutomate);\n\n return {\n id: this.generatePlanId(error),\n error,\n strategies: sortedStrategies,\n metadata: {\n createdAt: new Date(),\n estimatedTime,\n successProbability,\n requiresUserIntervention\n }\n };\n }\n\n /**\n * Execute recovery plan\n */\n public async executeRecoveryPlan(\n plan: RecoveryPlan,\n preferences?: RecoveryPreferences\n ): Promise<RecoveryResult> {\n const context = this.createContext(plan.error, preferences);\n let lastResult: RecoveryResult = {\n success: false,\n description: 'No recovery strategies available',\n shouldRetry: false\n };\n\n for (const strategy of plan.strategies) {\n if (context.timeBudget && context.timeBudget <= 0) {\n break;\n }\n\n const executor = this.executors.get(strategy.id);\n if (!executor || !executor.canApply(plan.error, context)) {\n continue;\n }\n\n const attempt = await this.executeStrategy(strategy, executor, context);\n this.recordAttempt(plan.error, attempt);\n\n if (attempt.result.success) {\n return attempt.result;\n }\n\n lastResult = attempt.result;\n\n // Update context for next attempt\n context.attemptNumber++;\n if (context.timeBudget) {\n context.timeBudget -= attempt.duration;\n }\n }\n\n return lastResult;\n }\n\n /**\n * Get recovery suggestions for an error\n */\n public getRecoverySuggestions(error: JunoTaskError): readonly string[] {\n const suggestions: string[] = [];\n const applicableStrategies = this.findApplicableStrategies(error);\n\n for (const strategy of applicableStrategies) {\n if (strategy.canAutomate) {\n suggestions.push(`Try ${strategy.name}: ${strategy.description}`);\n } else {\n suggestions.push(`Manual intervention: ${strategy.description}`);\n }\n }\n\n // Add error-specific suggestions\n if (error.context.recoverySuggestions) {\n suggestions.push(...error.context.recoverySuggestions);\n }\n\n return suggestions;\n }\n\n /**\n * Get recovery history for an error\n */\n public getRecoveryHistory(error: JunoTaskError): readonly RecoveryAttempt[] {\n return this.recoveryHistory.get(error.id) || [];\n }\n\n /**\n * Find applicable strategies for an error\n */\n private findApplicableStrategies(\n error: JunoTaskError,\n preferences?: RecoveryPreferences\n ): readonly RecoveryStrategy[] {\n const strategies: RecoveryStrategy[] = [];\n\n for (const strategy of this.strategies.values()) {\n // Check category match\n if (!strategy.applicableCategories.includes(error.category)) {\n continue;\n }\n\n // Check code match if specified\n if (strategy.applicableCodes && !strategy.applicableCodes.includes(error.code)) {\n continue;\n }\n\n // Check user preferences\n if (preferences?.avoidedStrategies?.includes(strategy.id)) {\n continue;\n }\n\n if (preferences?.preferredStrategies) {\n if (!preferences.preferredStrategies.includes(strategy.id)) {\n continue;\n }\n }\n\n // Check automation preference\n if (!preferences?.allowAutomaticRecovery && strategy.canAutomate) {\n continue;\n }\n\n strategies.push(strategy);\n }\n\n return strategies;\n }\n\n /**\n * Prioritize strategies based on success probability and preferences\n */\n private prioritizeStrategies(\n strategies: readonly RecoveryStrategy[],\n error: JunoTaskError,\n preferences?: RecoveryPreferences\n ): readonly RecoveryStrategy[] {\n const context = this.createContext(error, preferences);\n\n return [...strategies].sort((a, b) => {\n // First, sort by user preference order\n if (preferences?.preferredStrategies) {\n const aIndex = preferences.preferredStrategies.indexOf(a.id);\n const bIndex = preferences.preferredStrategies.indexOf(b.id);\n\n if (aIndex !== -1 && bIndex !== -1) {\n return aIndex - bIndex;\n }\n if (aIndex !== -1) return -1;\n if (bIndex !== -1) return 1;\n }\n\n // Then by strategy priority\n if (a.priority !== b.priority) {\n return b.priority - a.priority;\n }\n\n // Then by estimated success probability\n const aExecutor = this.executors.get(a.id);\n const bExecutor = this.executors.get(b.id);\n\n if (aExecutor && bExecutor) {\n const aProb = aExecutor.estimateSuccessProbability(error, context);\n const bProb = bExecutor.estimateSuccessProbability(error, context);\n\n if (aProb !== bProb) {\n return bProb - aProb;\n }\n }\n\n // Finally by estimated time (prefer faster)\n if (aExecutor && bExecutor) {\n const aTime = aExecutor.estimateTime(error, context);\n const bTime = bExecutor.estimateTime(error, context);\n\n return aTime - bTime;\n }\n\n return 0;\n });\n }\n\n /**\n * Calculate overall success probability for a plan\n */\n private calculatePlanSuccessProbability(\n strategies: readonly RecoveryStrategy[],\n error: JunoTaskError\n ): number {\n if (strategies.length === 0) return 0;\n\n const context = this.createContext(error);\n let combinedFailureProb = 1;\n\n for (const strategy of strategies) {\n const executor = this.executors.get(strategy.id);\n if (executor) {\n const successProb = executor.estimateSuccessProbability(error, context);\n combinedFailureProb *= (1 - successProb);\n }\n }\n\n return 1 - combinedFailureProb;\n }\n\n /**\n * Execute a single recovery strategy\n */\n private async executeStrategy(\n strategy: RecoveryStrategy,\n executor: RecoveryStrategyExecutor,\n context: RecoveryContext\n ): Promise<RecoveryAttempt> {\n const startTime = Date.now();\n const attemptId = this.generateAttemptId();\n\n try {\n const result = await this.executeWithTimeout(\n () => executor.execute(context),\n strategy.timeout || 30000\n );\n\n const duration = Date.now() - startTime;\n\n return {\n id: attemptId,\n strategy,\n timestamp: new Date(startTime),\n duration,\n result,\n context: { ...context.operationContext }\n };\n } catch (error) {\n const duration = Date.now() - startTime;\n\n return {\n id: attemptId,\n strategy,\n timestamp: new Date(startTime),\n duration,\n result: {\n success: false,\n description: `Strategy execution failed: ${error instanceof Error ? error.message : String(error)}`,\n error: error instanceof Error ? error : new Error(String(error)),\n shouldRetry: false\n },\n context: { ...context.operationContext }\n };\n }\n }\n\n /**\n * Execute function with timeout\n */\n private async executeWithTimeout<T>(\n fn: () => Promise<T>,\n timeoutMs: number\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(`Recovery strategy timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n\n fn()\n .then(result => {\n clearTimeout(timeout);\n resolve(result);\n })\n .catch(error => {\n clearTimeout(timeout);\n reject(error);\n });\n });\n }\n\n /**\n * Create recovery context\n */\n private createContext(\n error: JunoTaskError,\n preferences?: RecoveryPreferences\n ): RecoveryContext {\n const previousAttempts = this.getRecoveryHistory(error);\n\n return {\n error,\n previousAttempts,\n attemptNumber: previousAttempts.length + 1,\n userPreferences: preferences,\n timeBudget: preferences?.maxRecoveryTime\n };\n }\n\n /**\n * Record recovery attempt\n */\n private recordAttempt(error: JunoTaskError, attempt: RecoveryAttempt): void {\n const history = this.recoveryHistory.get(error.id) || [];\n this.recoveryHistory.set(error.id, [...history, attempt]);\n }\n\n /**\n * Generate unique plan ID\n */\n private generatePlanId(error: JunoTaskError): string {\n return `plan_${error.id}_${Date.now()}`;\n }\n\n /**\n * Generate unique attempt ID\n */\n private generateAttemptId(): string {\n return `attempt_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n}\n\n// Export singleton instance\nexport const errorRecoveryManager = new ErrorRecoveryManager();","/**\n * System Error Classes\n *\n * Handles system-level errors including file system operations,\n * network connectivity, OS operations, and hardware issues.\n */\n\nimport { JunoTaskError, RecoveryAction, RecoveryActionType } from './base';\nimport { ErrorCategory } from './categories';\nimport { ErrorCode } from './codes';\nimport type { ErrorContext } from './context';\n\n/**\n * Base class for all system-related errors\n */\nexport abstract class SystemError extends JunoTaskError {\n public readonly category = ErrorCategory.SYSTEM;\n public abstract readonly code: ErrorCode;\n}\n\n/**\n * File or directory not found error\n */\nexport class FileNotFoundError extends SystemError {\n public readonly code = ErrorCode.SYSTEM_FILE_NOT_FOUND;\n\n constructor(\n filePath: string,\n operation?: string,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n const message = operation\n ? `File not found during ${operation}: ${filePath}`\n : `File not found: ${filePath}`;\n\n super(message, {\n code: ErrorCode.SYSTEM_FILE_NOT_FOUND,\n context: {\n ...options?.context,\n metadata: {\n filePath,\n operation,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Check if the file path is correct',\n 'Verify the file exists at the specified location',\n 'Check file permissions',\n 'Try using an absolute path instead of relative path'\n ],\n isRetriable: false\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'create_file',\n description: 'Create the missing file',\n type: RecoveryActionType.REPAIR,\n canAutomate: false,\n successProbability: 0.8\n },\n {\n id: 'use_alternative_path',\n description: 'Try alternative file paths',\n type: RecoveryActionType.FALLBACK,\n canAutomate: true,\n successProbability: 0.6\n }\n ]\n });\n }\n}\n\n/**\n * Permission denied error for file/directory operations\n */\nexport class PermissionDeniedError extends SystemError {\n public readonly code = ErrorCode.SYSTEM_PERMISSION_DENIED;\n\n constructor(\n resourcePath: string,\n operation: string,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n const message = `Permission denied for ${operation} operation on: ${resourcePath}`;\n\n super(message, {\n code: ErrorCode.SYSTEM_PERMISSION_DENIED,\n context: {\n ...options?.context,\n metadata: {\n filePath: resourcePath,\n operation,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Check file/directory permissions',\n 'Run the command with elevated privileges (sudo)',\n 'Change file ownership or permissions',\n 'Check if the resource is locked by another process'\n ],\n isRetriable: false\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'check_permissions',\n description: 'Check and display current permissions',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n },\n {\n id: 'request_elevated_privileges',\n description: 'Request elevated privileges',\n type: RecoveryActionType.ESCALATE,\n canAutomate: false,\n successProbability: 0.7\n }\n ]\n });\n }\n}\n\n/**\n * Disk space insufficient error\n */\nexport class DiskFullError extends SystemError {\n public readonly code = ErrorCode.SYSTEM_DISK_FULL;\n\n constructor(\n operation: string,\n requiredSpace?: number,\n availableSpace?: number,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n let message = `Insufficient disk space for ${operation}`;\n if (requiredSpace && availableSpace) {\n message += ` (required: ${requiredSpace}, available: ${availableSpace})`;\n }\n\n super(message, {\n code: ErrorCode.SYSTEM_DISK_FULL,\n context: {\n ...options?.context,\n metadata: {\n operation,\n requiredSpace,\n availableSpace,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Free up disk space by deleting unnecessary files',\n 'Move files to external storage',\n 'Clean up temporary files',\n 'Check for large log files that can be archived'\n ],\n isRetriable: false\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'check_disk_usage',\n description: 'Check current disk usage',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n },\n {\n id: 'cleanup_temp_files',\n description: 'Clean up temporary files',\n type: RecoveryActionType.REPAIR,\n canAutomate: true,\n successProbability: 0.5\n }\n ]\n });\n }\n}\n\n/**\n * File or directory already exists error\n */\nexport class AlreadyExistsError extends SystemError {\n public readonly code = ErrorCode.SYSTEM_ALREADY_EXISTS;\n\n constructor(\n resourcePath: string,\n operation: string,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n const message = `Resource already exists for ${operation}: ${resourcePath}`;\n\n super(message, {\n code: ErrorCode.SYSTEM_ALREADY_EXISTS,\n context: {\n ...options?.context,\n metadata: {\n filePath: resourcePath,\n operation,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Use a different name for the resource',\n 'Remove the existing resource first',\n 'Use overwrite option if available',\n 'Check if the existing resource can be merged'\n ],\n isRetriable: false\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'use_different_name',\n description: 'Generate unique name for the resource',\n type: RecoveryActionType.FALLBACK,\n canAutomate: true,\n successProbability: 0.9\n },\n {\n id: 'overwrite_existing',\n description: 'Overwrite the existing resource',\n type: RecoveryActionType.REPAIR,\n canAutomate: false,\n successProbability: 0.8\n }\n ]\n });\n }\n}\n\n/**\n * General I/O error for file system operations\n */\nexport class IOError extends SystemError {\n public readonly code = ErrorCode.SYSTEM_IO_ERROR;\n\n constructor(\n operation: string,\n details?: string,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n let message = `I/O error during ${operation}`;\n if (details) {\n message += `: ${details}`;\n }\n\n super(message, {\n code: ErrorCode.SYSTEM_IO_ERROR,\n context: {\n ...options?.context,\n metadata: {\n operation,\n details,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Check system resources and disk health',\n 'Verify file system integrity',\n 'Try the operation again',\n 'Check for hardware issues'\n ],\n isRetriable: true,\n maxRetries: 3,\n retryDelay: {\n initialDelay: 1000,\n maxDelay: 5000,\n backoffMultiplier: 2,\n useJitter: true\n }\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'retry_operation',\n description: 'Retry the I/O operation',\n type: RecoveryActionType.RETRY,\n canAutomate: true,\n successProbability: 0.6\n },\n {\n id: 'check_system_health',\n description: 'Check system and disk health',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n }\n ]\n });\n }\n}\n\n/**\n * Invalid path error\n */\nexport class InvalidPathError extends SystemError {\n public readonly code = ErrorCode.SYSTEM_INVALID_PATH;\n\n constructor(\n path: string,\n reason?: string,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n let message = `Invalid path: ${path}`;\n if (reason) {\n message += ` (${reason})`;\n }\n\n super(message, {\n code: ErrorCode.SYSTEM_INVALID_PATH,\n context: {\n ...options?.context,\n metadata: {\n filePath: path,\n reason,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Check path syntax and format',\n 'Use absolute paths instead of relative paths',\n 'Ensure path doesn\\'t contain invalid characters',\n 'Verify path length is within system limits'\n ],\n isRetriable: false\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'normalize_path',\n description: 'Normalize and validate the path',\n type: RecoveryActionType.REPAIR,\n canAutomate: true,\n successProbability: 0.8\n },\n {\n id: 'suggest_alternative_path',\n description: 'Suggest alternative valid paths',\n type: RecoveryActionType.FALLBACK,\n canAutomate: true,\n successProbability: 0.6\n }\n ]\n });\n }\n}\n\n/**\n * Resource busy error (file locked, process running, etc.)\n */\nexport class ResourceBusyError extends SystemError {\n public readonly code = ErrorCode.SYSTEM_RESOURCE_BUSY;\n\n constructor(\n resource: string,\n operation: string,\n lockingProcess?: string,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n let message = `Resource busy for ${operation}: ${resource}`;\n if (lockingProcess) {\n message += ` (locked by: ${lockingProcess})`;\n }\n\n super(message, {\n code: ErrorCode.SYSTEM_RESOURCE_BUSY,\n context: {\n ...options?.context,\n metadata: {\n resource,\n operation,\n lockingProcess,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Wait for the resource to become available',\n 'Close applications that might be using the resource',\n 'Check for processes that have the resource open',\n 'Try again in a moment'\n ],\n isRetriable: true,\n maxRetries: 5,\n retryDelay: {\n initialDelay: 2000,\n maxDelay: 10000,\n backoffMultiplier: 1.5,\n useJitter: true\n }\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'wait_and_retry',\n description: 'Wait for resource to become available',\n type: RecoveryActionType.RETRY,\n canAutomate: true,\n successProbability: 0.7,\n estimatedTime: 5000\n },\n {\n id: 'find_locking_process',\n description: 'Find and display process using the resource',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n }\n ]\n });\n }\n}\n\n/**\n * System resource exhausted error (memory, handles, etc.)\n */\nexport class ResourceExhaustedError extends SystemError {\n public readonly code = ErrorCode.SYSTEM_RESOURCE_EXHAUSTED;\n\n constructor(\n resourceType: string,\n operation: string,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n const message = `System ${resourceType} exhausted during ${operation}`;\n\n super(message, {\n code: ErrorCode.SYSTEM_RESOURCE_EXHAUSTED,\n context: {\n ...options?.context,\n metadata: {\n resourceType,\n operation,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n `Free up ${resourceType} by closing applications`,\n 'Restart the application to reset resource usage',\n 'Check for memory leaks or resource leaks',\n 'Increase system resource limits if possible'\n ],\n isRetriable: true,\n maxRetries: 2,\n retryDelay: {\n initialDelay: 5000,\n maxDelay: 15000,\n backoffMultiplier: 2,\n useJitter: false\n }\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'garbage_collect',\n description: 'Force garbage collection',\n type: RecoveryActionType.REPAIR,\n canAutomate: true,\n successProbability: 0.5\n },\n {\n id: 'check_resource_usage',\n description: `Check current ${resourceType} usage`,\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n }\n ]\n });\n }\n}","/**\n * Validation Error Classes\n *\n * Handles input validation, schema validation, and data integrity errors\n * across all modules with rich context and recovery suggestions.\n */\n\nimport { JunoTaskError, RecoveryAction, RecoveryActionType } from './base';\nimport { ErrorCategory } from './categories';\nimport { ErrorCode } from './codes';\nimport type { ErrorContext } from './context';\n\n/**\n * Base class for all validation-related errors\n */\nexport abstract class ValidationError extends JunoTaskError {\n public abstract readonly code: ErrorCode;\n public readonly category = ErrorCategory.VALIDATION;\n}\n\n/**\n * Required field missing error\n */\nexport class RequiredFieldError extends ValidationError {\n public readonly code = ErrorCode.VALIDATION_REQUIRED_FIELD;\n\n constructor(\n fieldName: string,\n context?: {\n fieldPath?: string;\n expectedType?: string;\n parentObject?: string;\n validationContext?: Record<string, unknown>;\n errorContext?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n const message = context?.fieldPath\n ? `Required field '${fieldName}' is missing at path: ${context.fieldPath}`\n : `Required field '${fieldName}' is missing`;\n\n super(message, {\n code: ErrorCode.VALIDATION_REQUIRED_FIELD,\n context: {\n ...context?.errorContext,\n metadata: {\n fieldName,\n fieldPath: context?.fieldPath,\n expectedType: context?.expectedType,\n parentObject: context?.parentObject,\n validationContext: context?.validationContext,\n ...context?.errorContext?.metadata\n },\n recoverySuggestions: [\n `Provide a value for the required field '${fieldName}'`,\n context?.expectedType ? `Expected type: ${context.expectedType}` : 'Check the expected data type',\n 'Review the input data structure',\n 'Check API documentation for required fields'\n ].filter(Boolean),\n isRetriable: false\n },\n cause: context?.cause,\n recoveryActions: [\n {\n id: 'provide_default_value',\n description: `Provide default value for '${fieldName}'`,\n type: RecoveryActionType.REPAIR,\n canAutomate: true,\n successProbability: 0.7\n },\n {\n id: 'make_field_optional',\n description: `Make field '${fieldName}' optional`,\n type: RecoveryActionType.FALLBACK,\n canAutomate: false,\n successProbability: 0.9\n }\n ]\n });\n }\n}\n\n/**\n * Invalid format error for field values\n */\nexport class InvalidFormatError extends ValidationError {\n public readonly code = ErrorCode.VALIDATION_INVALID_FORMAT;\n\n constructor(\n fieldName: string,\n actualValue: unknown,\n expectedFormat: string,\n context?: {\n fieldPath?: string;\n formatPattern?: string;\n examples?: readonly string[];\n validationContext?: Record<string, unknown>;\n errorContext?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n const message = `Invalid format for field '${fieldName}': expected ${expectedFormat}, got ${typeof actualValue}`;\n\n super(message, {\n code: ErrorCode.VALIDATION_INVALID_FORMAT,\n context: {\n ...context?.errorContext,\n metadata: {\n fieldName,\n actualValue,\n expectedFormat,\n fieldPath: context?.fieldPath,\n formatPattern: context?.formatPattern,\n examples: context?.examples,\n validationContext: context?.validationContext,\n ...context?.errorContext?.metadata\n },\n recoverySuggestions: [\n `Format '${fieldName}' as ${expectedFormat}`,\n context?.formatPattern ? `Use pattern: ${context.formatPattern}` : 'Check the expected pattern',\n ...(context?.examples ? [`Examples: ${context.examples.join(', ')}`] : []),\n 'Validate input before processing'\n ].filter(Boolean),\n isRetriable: false\n },\n cause: context?.cause,\n recoveryActions: [\n {\n id: 'auto_format',\n description: `Automatically format '${fieldName}' to ${expectedFormat}`,\n type: RecoveryActionType.REPAIR,\n canAutomate: true,\n successProbability: 0.6\n },\n {\n id: 'suggest_format',\n description: 'Suggest correct format with examples',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n }\n ]\n });\n }\n}\n\n/**\n * Out of range error for numeric values\n */\nexport class OutOfRangeError extends ValidationError {\n public readonly code = ErrorCode.VALIDATION_OUT_OF_RANGE;\n\n constructor(\n fieldName: string,\n actualValue: number,\n minValue?: number,\n maxValue?: number,\n context?: {\n fieldPath?: string;\n isInclusive?: boolean;\n validationContext?: Record<string, unknown>;\n errorContext?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n let message = `Value for field '${fieldName}' is out of range: ${actualValue}`;\n if (minValue !== undefined && maxValue !== undefined) {\n message += ` (range: ${minValue} - ${maxValue})`;\n } else if (minValue !== undefined) {\n message += ` (minimum: ${minValue})`;\n } else if (maxValue !== undefined) {\n message += ` (maximum: ${maxValue})`;\n }\n\n super(message, {\n code: ErrorCode.VALIDATION_OUT_OF_RANGE,\n context: {\n ...context?.errorContext,\n metadata: {\n fieldName,\n actualValue,\n minValue,\n maxValue,\n fieldPath: context?.fieldPath,\n isInclusive: context?.isInclusive,\n validationContext: context?.validationContext,\n ...context?.errorContext?.metadata\n },\n recoverySuggestions: [\n minValue !== undefined && maxValue !== undefined\n ? `Provide a value between ${minValue} and ${maxValue}`\n : minValue !== undefined\n ? `Provide a value greater than ${context?.isInclusive ? 'or equal to ' : ''}${minValue}`\n : maxValue !== undefined\n ? `Provide a value less than ${context?.isInclusive ? 'or equal to ' : ''}${maxValue}`\n : 'Provide a value within the valid range',\n 'Check the field constraints',\n 'Use the nearest valid value'\n ].filter(Boolean),\n isRetriable: false\n },\n cause: context?.cause,\n recoveryActions: [\n {\n id: 'clamp_to_range',\n description: 'Clamp value to valid range',\n type: RecoveryActionType.REPAIR,\n canAutomate: true,\n successProbability: 0.9\n },\n {\n id: 'suggest_valid_range',\n description: 'Display valid range information',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n }\n ]\n });\n }\n}\n\n/**\n * Invalid choice error for enumerated values\n */\nexport class InvalidChoiceError extends ValidationError {\n public readonly code = ErrorCode.VALIDATION_INVALID_CHOICE;\n\n constructor(\n fieldName: string,\n actualValue: unknown,\n validChoices: readonly unknown[],\n context?: {\n fieldPath?: string;\n caseSensitive?: boolean;\n validationContext?: Record<string, unknown>;\n errorContext?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n const message = `Invalid choice for field '${fieldName}': '${actualValue}'. Valid choices: ${validChoices.join(', ')}`;\n\n super(message, {\n code: ErrorCode.VALIDATION_INVALID_CHOICE,\n context: {\n ...context?.errorContext,\n metadata: {\n fieldName,\n actualValue,\n validChoices,\n fieldPath: context?.fieldPath,\n caseSensitive: context?.caseSensitive,\n validationContext: context?.validationContext,\n ...context?.errorContext?.metadata\n },\n recoverySuggestions: [\n `Choose one of: ${validChoices.join(', ')}`,\n 'Check spelling and case sensitivity',\n 'Use exact match for the choices',\n 'Check if new choices need to be added'\n ],\n isRetriable: false\n },\n cause: context?.cause,\n recoveryActions: [\n {\n id: 'suggest_closest_match',\n description: 'Suggest closest valid choice',\n type: RecoveryActionType.FALLBACK,\n canAutomate: true,\n successProbability: 0.8\n },\n {\n id: 'list_valid_choices',\n description: 'Display all valid choices',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n }\n ]\n });\n }\n}\n\n/**\n * Schema validation error\n */\nexport class SchemaValidationError extends ValidationError {\n public readonly code = ErrorCode.VALIDATION_SCHEMA_ERROR;\n\n constructor(\n schemaPath: string,\n validationErrors: readonly string[],\n context?: {\n schemaName?: string;\n schemaVersion?: string;\n inputData?: unknown;\n validationContext?: Record<string, unknown>;\n errorContext?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n const message = `Schema validation failed at ${schemaPath}: ${validationErrors.join(', ')}`;\n\n super(message, {\n code: ErrorCode.VALIDATION_SCHEMA_ERROR,\n context: {\n ...context?.errorContext,\n metadata: {\n schemaPath,\n validationErrors,\n schemaName: context?.schemaName,\n schemaVersion: context?.schemaVersion,\n inputData: context?.inputData,\n validationContext: context?.validationContext,\n ...context?.errorContext?.metadata\n },\n recoverySuggestions: [\n 'Check data structure against schema requirements',\n 'Validate all required fields are present',\n 'Verify data types match schema definitions',\n 'Check for additional properties that are not allowed'\n ],\n isRetriable: false\n },\n cause: context?.cause,\n recoveryActions: [\n {\n id: 'auto_fix_schema',\n description: 'Automatically fix common schema issues',\n type: RecoveryActionType.REPAIR,\n canAutomate: true,\n successProbability: 0.4\n },\n {\n id: 'generate_valid_example',\n description: 'Generate example of valid data',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n }\n ]\n });\n }\n}\n\n/**\n * Type validation error\n */\nexport class TypeValidationError extends ValidationError {\n public readonly code = ErrorCode.VALIDATION_TYPE_ERROR;\n\n constructor(\n fieldName: string,\n actualType: string,\n expectedType: string,\n context?: {\n fieldPath?: string;\n actualValue?: unknown;\n allowedTypes?: readonly string[];\n validationContext?: Record<string, unknown>;\n errorContext?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n const message = `Type validation failed for field '${fieldName}': expected ${expectedType}, got ${actualType}`;\n\n super(message, {\n code: ErrorCode.VALIDATION_TYPE_ERROR,\n context: {\n ...context?.errorContext,\n metadata: {\n fieldName,\n actualType,\n expectedType,\n fieldPath: context?.fieldPath,\n actualValue: context?.actualValue,\n allowedTypes: context?.allowedTypes,\n validationContext: context?.validationContext,\n ...context?.errorContext?.metadata\n },\n recoverySuggestions: [\n `Convert value to ${expectedType}`,\n context?.allowedTypes ? `Allowed types: ${context.allowedTypes.join(', ')}` : 'Check allowed types',\n 'Validate input data types before processing',\n 'Use type conversion functions if appropriate'\n ].filter(Boolean),\n isRetriable: false\n },\n cause: context?.cause,\n recoveryActions: [\n {\n id: 'auto_convert_type',\n description: `Convert value to ${expectedType}`,\n type: RecoveryActionType.REPAIR,\n canAutomate: true,\n successProbability: 0.7\n },\n {\n id: 'suggest_conversion',\n description: 'Suggest type conversion approach',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n }\n ]\n });\n }\n}\n\n/**\n * Constraint validation error (custom validation rules)\n */\nexport class ConstraintValidationError extends ValidationError {\n public readonly code = ErrorCode.VALIDATION_CONSTRAINT_ERROR;\n\n constructor(\n constraintName: string,\n fieldName: string,\n constraintDetails: string,\n context?: {\n fieldPath?: string;\n actualValue?: unknown;\n constraintConfig?: Record<string, unknown>;\n validationContext?: Record<string, unknown>;\n errorContext?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n const message = `Constraint '${constraintName}' validation failed for field '${fieldName}': ${constraintDetails}`;\n\n super(message, {\n code: ErrorCode.VALIDATION_CONSTRAINT_ERROR,\n context: {\n ...context?.errorContext,\n metadata: {\n constraintName,\n fieldName,\n constraintDetails,\n fieldPath: context?.fieldPath,\n actualValue: context?.actualValue,\n constraintConfig: context?.constraintConfig,\n validationContext: context?.validationContext,\n ...context?.errorContext?.metadata\n },\n recoverySuggestions: [\n `Ensure field '${fieldName}' meets constraint: ${constraintName}`,\n 'Check constraint configuration and requirements',\n 'Validate data against all defined constraints',\n 'Consider adjusting constraint rules if appropriate'\n ],\n isRetriable: false\n },\n cause: context?.cause,\n recoveryActions: [\n {\n id: 'fix_constraint_violation',\n description: `Fix ${constraintName} constraint violation`,\n type: RecoveryActionType.REPAIR,\n canAutomate: false,\n successProbability: 0.5\n },\n {\n id: 'explain_constraint',\n description: `Explain ${constraintName} constraint requirements`,\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n }\n ]\n });\n }\n}\n\n/**\n * Cross-field dependency validation error\n */\nexport class DependencyValidationError extends ValidationError {\n public readonly code = ErrorCode.VALIDATION_DEPENDENCY_ERROR;\n\n constructor(\n dependentField: string,\n requiredField: string,\n dependencyRule: string,\n context?: {\n dependentValue?: unknown;\n requiredValue?: unknown;\n validationContext?: Record<string, unknown>;\n errorContext?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n const message = `Dependency validation failed: field '${dependentField}' requires '${requiredField}' to ${dependencyRule}`;\n\n super(message, {\n code: ErrorCode.VALIDATION_DEPENDENCY_ERROR,\n context: {\n ...context?.errorContext,\n metadata: {\n dependentField,\n requiredField,\n dependencyRule,\n dependentValue: context?.dependentValue,\n requiredValue: context?.requiredValue,\n validationContext: context?.validationContext,\n ...context?.errorContext?.metadata\n },\n recoverySuggestions: [\n `Ensure '${requiredField}' ${dependencyRule} when '${dependentField}' is set`,\n 'Check field dependencies and conditional requirements',\n 'Review the complete data structure for consistency',\n 'Consider making fields optional if dependencies are complex'\n ],\n isRetriable: false\n },\n cause: context?.cause,\n recoveryActions: [\n {\n id: 'fix_dependency',\n description: `Fix dependency between '${dependentField}' and '${requiredField}'`,\n type: RecoveryActionType.REPAIR,\n canAutomate: true,\n successProbability: 0.6\n },\n {\n id: 'explain_dependencies',\n description: 'Explain field dependency requirements',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n }\n ]\n });\n }\n}","/**\n * Configuration Error Classes\n */\n\nimport { JunoTaskError, RecoveryAction, RecoveryActionType } from './base';\nimport { ErrorCategory } from './categories';\nimport { ErrorCode } from './codes';\nimport type { ErrorContext } from './context';\n\nexport abstract class ConfigurationError extends JunoTaskError {\n public abstract readonly code: ErrorCode;\n public readonly category = ErrorCategory.CONFIGURATION;\n}\n\nexport class ConfigFileNotFoundError extends ConfigurationError {\n public readonly code = ErrorCode.CONFIG_FILE_NOT_FOUND;\n\n constructor(filePath: string, options?: { context?: Partial<ErrorContext>; cause?: Error }) {\n super(`Configuration file not found: ${filePath}`, {\n code: ErrorCode.CONFIG_FILE_NOT_FOUND,\n context: { ...options?.context, metadata: { filePath, ...options?.context?.metadata }},\n cause: options?.cause,\n recoveryActions: [\n { id: 'create_default_config', description: 'Create default configuration', type: RecoveryActionType.REPAIR, canAutomate: true, successProbability: 0.9 }\n ]\n });\n }\n}\n\nexport class ConfigInvalidSyntaxError extends ConfigurationError {\n public readonly code = ErrorCode.CONFIG_INVALID_SYNTAX;\n\n constructor(filePath: string, syntaxError: string, options?: { context?: Partial<ErrorContext>; cause?: Error }) {\n super(`Invalid syntax in configuration file: ${filePath} - ${syntaxError}`, {\n code: ErrorCode.CONFIG_INVALID_SYNTAX,\n context: { ...options?.context, metadata: { filePath, syntaxError, ...options?.context?.metadata }},\n cause: options?.cause,\n recoveryActions: [\n { id: 'fix_syntax', description: 'Fix configuration syntax', type: RecoveryActionType.REPAIR, canAutomate: false, successProbability: 0.8 }\n ]\n });\n }\n}","/**\n * MCP Error Classes for Unified Error Hierarchy\n *\n * Migrates and enhances existing MCP error classes to work with\n * the unified error hierarchy while preserving existing functionality.\n */\n\nimport { JunoTaskError, RecoveryAction, RecoveryActionType } from './base';\nimport { ErrorCategory } from './categories';\nimport { ErrorCode } from './codes';\nimport type { ErrorContext } from './context';\n\n/**\n * Base class for all MCP-related errors\n */\nexport abstract class MCPError extends JunoTaskError {\n public readonly category = ErrorCategory.MCP;\n public abstract readonly code: ErrorCode;\n}\n\n/**\n * MCP connection error\n */\nexport class MCPConnectionError extends MCPError {\n public readonly code = ErrorCode.MCP_CONNECTION_FAILED;\n\n constructor(\n serverName: string,\n details?: string,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n serverConfig?: Record<string, unknown>;\n }\n ) {\n let message = `Failed to connect to MCP server: ${serverName}`;\n if (details) {\n message += ` (${details})`;\n }\n\n super(message, {\n code: ErrorCode.MCP_CONNECTION_FAILED,\n context: {\n ...options?.context,\n metadata: {\n serverName,\n details,\n serverConfig: options?.serverConfig,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Check if MCP server is running',\n 'Verify server configuration and connection details',\n 'Check network connectivity',\n 'Try reconnecting after a brief delay'\n ],\n isRetriable: true,\n maxRetries: 3,\n retryDelay: {\n initialDelay: 2000,\n maxDelay: 10000,\n backoffMultiplier: 2,\n useJitter: true\n }\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'retry_connection',\n description: 'Retry MCP server connection',\n type: RecoveryActionType.RETRY,\n canAutomate: true,\n successProbability: 0.7,\n estimatedTime: 3000\n },\n {\n id: 'check_server_status',\n description: 'Check MCP server status and configuration',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n },\n {\n id: 'fallback_server',\n description: 'Try alternative MCP server if available',\n type: RecoveryActionType.FALLBACK,\n canAutomate: true,\n successProbability: 0.5\n }\n ]\n });\n }\n}\n\n/**\n * MCP tool execution error\n */\nexport class MCPToolError extends MCPError {\n public readonly code = ErrorCode.MCP_TOOL_EXECUTION_FAILED;\n\n constructor(\n toolName: string,\n errorMessage: string,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n toolArgs?: Record<string, unknown>;\n serverResponse?: unknown;\n }\n ) {\n const message = `MCP tool execution failed: ${toolName} - ${errorMessage}`;\n\n super(message, {\n code: ErrorCode.MCP_TOOL_EXECUTION_FAILED,\n context: {\n ...options?.context,\n metadata: {\n toolName,\n errorMessage,\n toolArgs: options?.toolArgs,\n serverResponse: options?.serverResponse,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Check tool arguments and parameters',\n 'Verify tool is available on MCP server',\n 'Check MCP server logs for detailed error information',\n 'Try the operation with different parameters'\n ],\n isRetriable: true,\n maxRetries: 2,\n retryDelay: {\n initialDelay: 1000,\n maxDelay: 5000,\n backoffMultiplier: 2,\n useJitter: false\n }\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'retry_tool_execution',\n description: `Retry execution of tool '${toolName}'`,\n type: RecoveryActionType.RETRY,\n canAutomate: true,\n successProbability: 0.6\n },\n {\n id: 'validate_tool_args',\n description: 'Validate and fix tool arguments',\n type: RecoveryActionType.REPAIR,\n canAutomate: true,\n successProbability: 0.7\n },\n {\n id: 'use_alternative_tool',\n description: 'Use alternative tool if available',\n type: RecoveryActionType.FALLBACK,\n canAutomate: false,\n successProbability: 0.4\n }\n ]\n });\n }\n}\n\n/**\n * MCP timeout error\n */\nexport class MCPTimeoutError extends MCPError {\n public readonly code = ErrorCode.MCP_OPERATION_TIMEOUT;\n\n constructor(\n operation: string,\n timeoutMs: number,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n serverName?: string;\n }\n ) {\n const message = `MCP operation timed out: ${operation} (${timeoutMs}ms)`;\n\n super(message, {\n code: ErrorCode.MCP_OPERATION_TIMEOUT,\n context: {\n ...options?.context,\n metadata: {\n operation,\n timeoutMs,\n serverName: options?.serverName,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Increase timeout duration for complex operations',\n 'Check MCP server performance and load',\n 'Try the operation during off-peak hours',\n 'Break down complex operations into smaller parts'\n ],\n isRetriable: true,\n maxRetries: 2,\n retryDelay: {\n initialDelay: 5000,\n maxDelay: 15000,\n backoffMultiplier: 2,\n useJitter: true\n }\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'retry_with_longer_timeout',\n description: 'Retry operation with increased timeout',\n type: RecoveryActionType.RETRY,\n canAutomate: true,\n successProbability: 0.8,\n estimatedTime: timeoutMs * 2\n },\n {\n id: 'check_server_performance',\n description: 'Check MCP server performance metrics',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n }\n ]\n });\n }\n}\n\n/**\n * MCP rate limit error\n */\nexport class MCPRateLimitError extends MCPError {\n public readonly code = ErrorCode.MCP_RATE_LIMIT_EXCEEDED;\n\n constructor(\n resetTime?: Date,\n remainingRequests?: number,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n serverName?: string;\n limitType?: string;\n }\n ) {\n let message = 'MCP rate limit exceeded';\n if (resetTime) {\n message += ` (resets at ${resetTime.toISOString()})`;\n }\n if (remainingRequests !== undefined) {\n message += ` (${remainingRequests} requests remaining)`;\n }\n\n const retryAfter = resetTime ? Math.max(0, resetTime.getTime() - Date.now()) : 60000;\n\n super(message, {\n code: ErrorCode.MCP_RATE_LIMIT_EXCEEDED,\n context: {\n ...options?.context,\n metadata: {\n resetTime,\n remainingRequests,\n serverName: options?.serverName,\n limitType: options?.limitType,\n retryAfter,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n resetTime ? `Wait until ${resetTime.toISOString()} before retrying` : 'Wait before retrying',\n 'Reduce request frequency',\n 'Implement request batching if possible',\n 'Consider using multiple MCP servers to distribute load'\n ],\n isRetriable: true,\n maxRetries: 5,\n retryDelay: {\n initialDelay: retryAfter,\n maxDelay: retryAfter * 2,\n backoffMultiplier: 1,\n useJitter: false\n }\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'wait_for_reset',\n description: 'Wait for rate limit reset',\n type: RecoveryActionType.RETRY,\n canAutomate: true,\n successProbability: 1.0,\n estimatedTime: retryAfter\n },\n {\n id: 'use_alternative_server',\n description: 'Switch to alternative MCP server',\n type: RecoveryActionType.FALLBACK,\n canAutomate: true,\n successProbability: 0.6\n },\n {\n id: 'implement_backoff',\n description: 'Implement exponential backoff strategy',\n type: RecoveryActionType.REPAIR,\n canAutomate: true,\n successProbability: 0.9\n }\n ]\n });\n }\n}\n\n/**\n * MCP authentication error\n */\nexport class MCPAuthError extends MCPError {\n public readonly code = ErrorCode.MCP_AUTH_FAILED;\n\n constructor(\n serverName: string,\n authType: string,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n credentials?: Record<string, unknown>;\n }\n ) {\n const message = `MCP authentication failed for server '${serverName}' using ${authType}`;\n\n super(message, {\n code: ErrorCode.MCP_AUTH_FAILED,\n context: {\n ...options?.context,\n metadata: {\n serverName,\n authType,\n credentials: options?.credentials,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Check authentication credentials',\n 'Verify API keys or tokens are valid',\n 'Check if credentials have expired',\n 'Contact server administrator for access'\n ],\n isRetriable: false\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'refresh_credentials',\n description: 'Refresh authentication credentials',\n type: RecoveryActionType.REPAIR,\n canAutomate: false,\n successProbability: 0.8\n },\n {\n id: 'check_credential_validity',\n description: 'Check credential validity and expiration',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n },\n {\n id: 'use_alternative_auth',\n description: 'Try alternative authentication method',\n type: RecoveryActionType.FALLBACK,\n canAutomate: false,\n successProbability: 0.5\n }\n ]\n });\n }\n}\n\n/**\n * MCP configuration error\n */\nexport class MCPConfigError extends MCPError {\n public readonly code = ErrorCode.MCP_CONFIG_INVALID;\n\n constructor(\n configPath: string,\n validationErrors: readonly string[],\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n configData?: Record<string, unknown>;\n }\n ) {\n const message = `Invalid MCP configuration at ${configPath}: ${validationErrors.join(', ')}`;\n\n super(message, {\n code: ErrorCode.MCP_CONFIG_INVALID,\n context: {\n ...options?.context,\n metadata: {\n configPath,\n validationErrors,\n configData: options?.configData,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Check MCP configuration file syntax',\n 'Verify all required configuration fields are present',\n 'Check configuration values against schema',\n 'Run juno-task init to generate a new configuration'\n ],\n isRetriable: false\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'regenerate_config',\n description: 'Generate new MCP configuration file',\n type: RecoveryActionType.REPAIR,\n canAutomate: true,\n successProbability: 0.9\n },\n {\n id: 'validate_config',\n description: 'Validate and show configuration errors',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n },\n {\n id: 'use_default_config',\n description: 'Use default MCP configuration',\n type: RecoveryActionType.FALLBACK,\n canAutomate: true,\n successProbability: 0.7\n }\n ]\n });\n }\n}\n\n/**\n * MCP server unresponsive error\n */\nexport class MCPServerUnresponsiveError extends MCPError {\n public readonly code = ErrorCode.MCP_SERVER_UNRESPONSIVE;\n\n constructor(\n serverName: string,\n lastResponseTime?: Date,\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n healthCheckFailed?: boolean;\n }\n ) {\n let message = `MCP server '${serverName}' is unresponsive`;\n if (lastResponseTime) {\n message += ` (last response: ${lastResponseTime.toISOString()})`;\n }\n\n super(message, {\n code: ErrorCode.MCP_SERVER_UNRESPONSIVE,\n context: {\n ...options?.context,\n metadata: {\n serverName,\n lastResponseTime,\n healthCheckFailed: options?.healthCheckFailed,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Check if MCP server process is running',\n 'Verify server health and resources',\n 'Try restarting the MCP server',\n 'Check server logs for errors'\n ],\n isRetriable: true,\n maxRetries: 3,\n retryDelay: {\n initialDelay: 5000,\n maxDelay: 20000,\n backoffMultiplier: 2,\n useJitter: true\n }\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'health_check',\n description: 'Perform MCP server health check',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n },\n {\n id: 'restart_server',\n description: 'Restart MCP server',\n type: RecoveryActionType.REPAIR,\n canAutomate: false,\n successProbability: 0.8\n },\n {\n id: 'use_backup_server',\n description: 'Switch to backup MCP server',\n type: RecoveryActionType.FALLBACK,\n canAutomate: true,\n successProbability: 0.6\n }\n ]\n });\n }\n}\n\n/**\n * MCP tool not found error\n */\nexport class MCPToolNotFoundError extends MCPError {\n public readonly code = ErrorCode.MCP_TOOL_NOT_FOUND;\n\n constructor(\n toolName: string,\n serverName: string,\n availableTools?: readonly string[],\n options?: {\n context?: Partial<ErrorContext>;\n cause?: Error;\n }\n ) {\n let message = `MCP tool '${toolName}' not found on server '${serverName}'`;\n if (availableTools && availableTools.length > 0) {\n message += `. Available tools: ${availableTools.join(', ')}`;\n }\n\n super(message, {\n code: ErrorCode.MCP_TOOL_NOT_FOUND,\n context: {\n ...options?.context,\n metadata: {\n toolName,\n serverName,\n availableTools,\n ...options?.context?.metadata\n },\n recoverySuggestions: [\n 'Check tool name spelling and case',\n 'Verify tool is available on the MCP server',\n 'Check if server supports the required tool version',\n 'Use list-tools command to see available tools'\n ],\n isRetriable: false\n },\n cause: options?.cause,\n recoveryActions: [\n {\n id: 'suggest_similar_tools',\n description: 'Suggest similar available tools',\n type: RecoveryActionType.FALLBACK,\n canAutomate: true,\n successProbability: 0.6\n },\n {\n id: 'list_available_tools',\n description: 'List all available tools on server',\n type: RecoveryActionType.MANUAL,\n canAutomate: true,\n successProbability: 1.0\n },\n {\n id: 'check_alternative_servers',\n description: 'Check if tool is available on other servers',\n type: RecoveryActionType.FALLBACK,\n canAutomate: true,\n successProbability: 0.4\n }\n ]\n });\n }\n}","/**\n * Template Error Classes\n */\n\nimport { JunoTaskError, RecoveryAction, RecoveryActionType } from './base';\nimport { ErrorCategory } from './categories';\nimport { ErrorCode } from './codes';\nimport type { ErrorContext } from './context';\n\nexport abstract class TemplateError extends JunoTaskError {\n public abstract readonly code: ErrorCode;\n public readonly category = ErrorCategory.TEMPLATE;\n}\n\nexport class TemplateNotFoundError extends TemplateError {\n public readonly code = ErrorCode.TEMPLATE_NOT_FOUND;\n\n constructor(templateId: string, options?: { context?: Partial<ErrorContext>; cause?: Error }) {\n super(`Template not found: ${templateId}`, {\n code: ErrorCode.TEMPLATE_NOT_FOUND,\n context: { ...options?.context, metadata: { templateId, ...options?.context?.metadata }},\n cause: options?.cause,\n recoveryActions: [\n { id: 'use_default_template', description: 'Use default template', type: RecoveryActionType.FALLBACK, canAutomate: true, successProbability: 0.7 }\n ]\n });\n }\n}\n\nexport class TemplateSyntaxError extends TemplateError {\n public readonly code = ErrorCode.TEMPLATE_SYNTAX_ERROR;\n\n constructor(templateId: string, syntaxError: string, options?: { context?: Partial<ErrorContext>; cause?: Error }) {\n super(`Template syntax error in ${templateId}: ${syntaxError}`, {\n code: ErrorCode.TEMPLATE_SYNTAX_ERROR,\n context: { ...options?.context, metadata: { templateId, syntaxError, ...options?.context?.metadata }},\n cause: options?.cause,\n recoveryActions: [\n { id: 'fix_template_syntax', description: 'Fix template syntax', type: RecoveryActionType.REPAIR, canAutomate: false, successProbability: 0.6 }\n ]\n });\n }\n}","/**\n * Session Error Classes\n */\n\nimport { JunoTaskError, RecoveryAction, RecoveryActionType } from './base';\nimport { ErrorCategory } from './categories';\nimport { ErrorCode } from './codes';\nimport type { ErrorContext } from './context';\n\nexport abstract class SessionError extends JunoTaskError {\n public abstract readonly code: ErrorCode;\n public readonly category = ErrorCategory.SESSION;\n}\n\nexport class SessionNotFoundError extends SessionError {\n public readonly code = ErrorCode.SESSION_NOT_FOUND;\n\n constructor(sessionId: string, options?: { context?: Partial<ErrorContext>; cause?: Error }) {\n super(`Session not found: ${sessionId}`, {\n code: ErrorCode.SESSION_NOT_FOUND,\n context: { ...options?.context, metadata: { sessionId, ...options?.context?.metadata }},\n cause: options?.cause,\n recoveryActions: [\n { id: 'create_new_session', description: 'Create new session', type: RecoveryActionType.REPAIR, canAutomate: true, successProbability: 0.9 }\n ]\n });\n }\n}\n\nexport class SessionExpiredError extends SessionError {\n public readonly code = ErrorCode.SESSION_EXPIRED;\n\n constructor(sessionId: string, expiredAt: Date, options?: { context?: Partial<ErrorContext>; cause?: Error }) {\n super(`Session expired: ${sessionId} at ${expiredAt.toISOString()}`, {\n code: ErrorCode.SESSION_EXPIRED,\n context: { ...options?.context, metadata: { sessionId, expiredAt, ...options?.context?.metadata }},\n cause: options?.cause,\n recoveryActions: [\n { id: 'refresh_session', description: 'Refresh session', type: RecoveryActionType.REPAIR, canAutomate: true, successProbability: 0.8 }\n ]\n });\n }\n}","/**\n * CLI Error Classes\n */\n\nimport { JunoTaskError, RecoveryAction, RecoveryActionType } from './base';\nimport { ErrorCategory } from './categories';\nimport { ErrorCode } from './codes';\nimport type { ErrorContext } from './context';\n\nexport abstract class CLIError extends JunoTaskError {\n public abstract readonly code: ErrorCode;\n public readonly category = ErrorCategory.CLI;\n}\n\nexport class CommandNotFoundError extends CLIError {\n public readonly code = ErrorCode.CLI_COMMAND_NOT_FOUND;\n\n constructor(command: string, availableCommands?: readonly string[], options?: { context?: Partial<ErrorContext>; cause?: Error }) {\n let message = `Command not found: ${command}`;\n if (availableCommands?.length) {\n message += `. Available commands: ${availableCommands.join(', ')}`;\n }\n\n super(message, {\n code: ErrorCode.CLI_COMMAND_NOT_FOUND,\n context: { ...options?.context, metadata: { command, availableCommands, ...options?.context?.metadata }},\n cause: options?.cause,\n recoveryActions: [\n { id: 'suggest_similar_command', description: 'Suggest similar commands', type: RecoveryActionType.FALLBACK, canAutomate: true, successProbability: 0.7 }\n ]\n });\n }\n}\n\nexport class InvalidArgumentsError extends CLIError {\n public readonly code = ErrorCode.CLI_INVALID_ARGUMENTS;\n\n constructor(command: string, invalidArgs: readonly string[], options?: { context?: Partial<ErrorContext>; cause?: Error }) {\n super(`Invalid arguments for command '${command}': ${invalidArgs.join(', ')}`, {\n code: ErrorCode.CLI_INVALID_ARGUMENTS,\n context: { ...options?.context, metadata: { command, invalidArgs, ...options?.context?.metadata }},\n cause: options?.cause,\n recoveryActions: [\n { id: 'show_command_help', description: 'Show command help', type: RecoveryActionType.MANUAL, canAutomate: true, successProbability: 1.0 }\n ]\n });\n }\n}","/**\n * TUI Error Classes\n */\n\nimport { JunoTaskError, RecoveryAction, RecoveryActionType } from './base';\nimport { ErrorCategory } from './categories';\nimport { ErrorCode } from './codes';\nimport type { ErrorContext } from './context';\n\nexport abstract class TUIError extends JunoTaskError {\n public abstract readonly code: ErrorCode;\n public readonly category = ErrorCategory.TUI;\n}\n\nexport class TUIRenderError extends TUIError {\n public readonly code = ErrorCode.TUI_RENDER_ERROR;\n\n constructor(component: string, renderError: string, options?: { context?: Partial<ErrorContext>; cause?: Error }) {\n super(`TUI render error in component '${component}': ${renderError}`, {\n code: ErrorCode.TUI_RENDER_ERROR,\n context: { ...options?.context, metadata: { component, renderError, ...options?.context?.metadata }},\n cause: options?.cause,\n recoveryActions: [\n { id: 'fallback_to_cli', description: 'Fallback to CLI mode', type: RecoveryActionType.FALLBACK, canAutomate: true, successProbability: 0.9 }\n ]\n });\n }\n}\n\nexport class TUINotAvailableError extends TUIError {\n public readonly code = ErrorCode.TUI_NOT_AVAILABLE;\n\n constructor(reason: string, options?: { context?: Partial<ErrorContext>; cause?: Error }) {\n super(`TUI not available: ${reason}`, {\n code: ErrorCode.TUI_NOT_AVAILABLE,\n context: { ...options?.context, metadata: { reason, ...options?.context?.metadata }},\n cause: options?.cause,\n recoveryActions: [\n { id: 'use_cli_mode', description: 'Use CLI mode instead', type: RecoveryActionType.FALLBACK, canAutomate: true, successProbability: 1.0 }\n ]\n });\n }\n}","/**\n * Error Utilities\n */\n\nimport type { JunoTaskError } from './base';\nimport type { ErrorCategory } from './categories';\nimport type { ErrorCode } from './codes';\n\nexport function isJunoTaskError(error: unknown): error is JunoTaskError {\n return error instanceof Error && 'category' in error && 'code' in error;\n}\n\nexport function hasErrorCode(error: unknown, code: ErrorCode): boolean {\n return isJunoTaskError(error) && error.code === code;\n}\n\nexport function hasErrorCategory(error: unknown, category: ErrorCategory): boolean {\n return isJunoTaskError(error) && error.category === category;\n}\n\nexport function formatError(error: unknown): string {\n if (isJunoTaskError(error)) {\n return error.getUserMessage();\n }\n return error instanceof Error ? error.message : String(error);\n}","/**\n * Error Manager - Central error handling and reporting\n */\n\nimport type { JunoTaskError } from './base';\nimport type { ErrorCategory } from './categories';\nimport { errorRecoveryManager } from './recovery';\n\nexport class ErrorManager {\n private errorHistory: JunoTaskError[] = [];\n\n public handleError(error: JunoTaskError): void {\n this.errorHistory.push(error);\n // Additional error handling logic here\n }\n\n public getErrorHistory(): readonly JunoTaskError[] {\n return this.errorHistory;\n }\n\n public getErrorsByCategory(category: ErrorCategory): readonly JunoTaskError[] {\n return this.errorHistory.filter(error => error.category === category);\n }\n}\n\nexport const errorManager = new ErrorManager();","/**\n * Error Reporter - Error reporting and analytics\n */\n\nimport type { JunoTaskError } from './base';\n\nexport class ErrorReporter {\n public report(error: JunoTaskError): void {\n // Error reporting logic here\n console.error('[ERROR]', error.toJSON());\n }\n}\n\nexport const errorReporter = new ErrorReporter();","/**\n * Legacy Compatibility Layer\n *\n * Provides compatibility with existing error patterns while\n * transitioning to the unified error hierarchy.\n */\n\n// Re-export some existing patterns for backward compatibility\nexport * from '../mcp/errors';\n\n// Legacy error type aliases\nexport type { ValidationError as LegacyValidationError } from '../utils/validation';\n\n// Migration helpers\nimport type { JunoTaskError } from './base';\n\nexport function migrateError(error: Error): JunoTaskError | Error {\n // For now, return the original error\n // In the future, this would convert legacy errors to unified errors\n return error;\n}"]}
|