@gofreego/tsutils 0.1.15 → 0.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1423,7 +1423,7 @@ var SessionManager = class _SessionManager {
1423
1423
  }
1424
1424
  };
1425
1425
 
1426
- // src/auth/AuthService.ts
1426
+ // src/auth/authService.ts
1427
1427
  var BASE_URL = "/openauth/v1";
1428
1428
  var AuthService = class _AuthService {
1429
1429
  constructor(client) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/tokens.ts","../src/theme/light.ts","../src/theme/dark.ts","../src/utils/localStorage.ts","../src/theme/ThemeProvider.tsx","../src/theme/useTheme.ts","../src/theme/ThemeToggle.tsx","../src/components/NotFoundPage.tsx","../src/http/HttpClient.ts","../src/components/LoginCallbackPage.tsx","../src/components/SidebarLayout.tsx","../src/components/ReadmeViewer/shikiHighlighter.ts","../src/components/ReadmeViewer/ReadmeViewer.tsx","../src/components/NotificationProvider/NotificationProvider.tsx","../src/components/ConfirmDialog.tsx","../src/utils/cn.ts","../src/utils/debounce.ts","../src/utils/throttle.ts","../src/utils/formatDate.ts","../src/auth/sessionManager.ts","../src/auth/AuthService.ts"],"names":["createContext","useState","useMemo","useEffect","useCallback","createTheme","jsx","jsxs","MuiThemeProvider","CssBaseline","useContext","LightMode","DarkMode","BrightnessAuto","IconButton","Tooltip","useNavigate","Box","SentimentDissatisfied","Typography","Button","useSearchParams","CircularProgress","Fragment","ListItem","ListItemButton","NavLink","ListItemIcon","ListItemText","ExpandLess","ExpandMore","Collapse","List","useLocation","Drawer","Routes","Route","Outlet","BrowserRouter","createHighlighter","ReactMarkdown","remarkGfm","remarkMath","rehypeKatex","className","CheckIcon","ContentCopyIcon","Snackbar","Alert","Dialog","DialogTitle","WarningAmberIcon","DialogContent","DialogActions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,cAAA,GAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,MAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AASO,IAAM,OAAA,GAAU;AAAA,EACrB,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA;AAAA,EACJ,KAAA,EAAO,MAAA;AAAA;AAAA,EACP,KAAA,EAAO;AAAA;AACT;AAKO,IAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,GAAA;AAAA,EACN,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,EAAA,EAAI,UAAA;AAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,KAAA,EAAO,MAAA;AAAA;AAAA,EACP,IAAA,EAAM;AACR;AAKO,IAAM,QAAA,GAAW;AAAA,EACtB,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,EAAA,EAAI,UAAA;AAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA;AAAA,EACJ,EAAA,EAAI,UAAA;AAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,KAAA,EAAO,QAAA;AAAA;AAAA,EACP,KAAA,EAAO,UAAA;AAAA;AAAA,EACP,KAAA,EAAO;AAAA;AACT;AAKO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO,KAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU,KAAA;AAAA,EACV,IAAA,EAAM;AACR;AAKO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO,MAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,OAAA,EAAS;AACX;AAKO,IAAM,SAAA,GAAY;AAAA,EACvB,IAAA,EAAM,MAAA;AAAA,EACN,EAAA,EAAI,+BAAA;AAAA,EACJ,EAAA,EAAI,kEAAA;AAAA,EACJ,EAAA,EAAI,oEAAA;AAAA,EACJ,EAAA,EAAI;AACN;AAKO,IAAM,UAAA,GAAa;AAAA,EACxB,IAAA,EAAM,OAAA;AAAA,EACN,MAAA,EAAQ,OAAA;AAAA,EACR,IAAA,EAAM;AACR;AAKO,IAAM,MAAA,GAAS;AAAA,EACpB,QAAA,EAAU,GAAA;AAAA,EACV,MAAA,EAAQ,IAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,aAAA,EAAe,IAAA;AAAA,EACf,KAAA,EAAO,IAAA;AAAA,EACP,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS;AACX;;;ACzFO,IAAM,UAAA,GAAoB;AAAA,EAC/B,MAAA,EAAQ;AAAA;AAAA,IAEN,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA;AAAA,IACd,aAAA,EAAe,SAAA;AAAA;AAAA;AAAA,IAGf,SAAA,EAAW,SAAA;AAAA,IACX,cAAA,EAAgB,SAAA;AAAA,IAChB,eAAA,EAAiB,SAAA;AAAA;AAAA,IAGjB,UAAA,EAAY,SAAA;AAAA,IACZ,mBAAA,EAAqB,SAAA;AAAA,IACrB,kBAAA,EAAoB,SAAA;AAAA;AAAA,IAGpB,OAAA,EAAS,SAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA;AAAA,IAGd,IAAA,EAAM,SAAA;AAAA;AAAA,IACN,aAAA,EAAe,SAAA;AAAA;AAAA,IACf,YAAA,EAAc,SAAA;AAAA;AAAA,IACd,YAAA,EAAc,SAAA;AAAA;AAAA;AAAA,IAGd,KAAA,EAAO,SAAA;AAAA;AAAA,IACP,UAAA,EAAY,SAAA;AAAA,IACZ,eAAA,EAAiB,SAAA;AAAA,IAEjB,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA,IACd,iBAAA,EAAmB,SAAA;AAAA,IAEnB,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA,IACd,iBAAA,EAAmB,SAAA;AAAA,IAEnB,IAAA,EAAM,SAAA;AAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,cAAA,EAAgB,SAAA;AAAA;AAAA,IAGhB,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,WAAA,EAAa,SAAA;AAAA;AAAA,IACb,WAAA,EAAa,SAAA;AAAA;AAAA;AAAA,IAGb,OAAA,EAAS,SAAA;AAAA;AAAA,IAGT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;;;AChEO,IAAM,SAAA,GAAmB;AAAA,EAC9B,MAAA,EAAQ;AAAA;AAAA,IAEN,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA;AAAA,IACd,aAAA,EAAe,SAAA;AAAA;AAAA;AAAA,IAGf,SAAA,EAAW,SAAA;AAAA,IACX,cAAA,EAAgB,SAAA;AAAA,IAChB,eAAA,EAAiB,SAAA;AAAA;AAAA,IAGjB,UAAA,EAAY,SAAA;AAAA;AAAA,IACZ,mBAAA,EAAqB,SAAA;AAAA;AAAA,IACrB,kBAAA,EAAoB,SAAA;AAAA;AAAA;AAAA,IAGpB,OAAA,EAAS,SAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA;AAAA,IAGd,IAAA,EAAM,SAAA;AAAA;AAAA,IACN,aAAA,EAAe,SAAA;AAAA;AAAA,IACf,YAAA,EAAc,SAAA;AAAA;AAAA,IACd,YAAA,EAAc,SAAA;AAAA;AAAA;AAAA,IAGd,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,SAAA;AAAA,IACZ,eAAA,EAAiB,SAAA;AAAA,IAEjB,OAAA,EAAS,SAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA,IACd,iBAAA,EAAmB,SAAA;AAAA,IAEnB,OAAA,EAAS,SAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA,IACd,iBAAA,EAAmB,SAAA;AAAA,IAEnB,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,cAAA,EAAgB,SAAA;AAAA;AAAA,IAGhB,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,WAAA,EAAa,SAAA;AAAA,IACb,WAAA,EAAa,SAAA;AAAA;AAAA;AAAA,IAGb,OAAA,EAAS,SAAA;AAAA;AAAA,IAGT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;;;ACpEO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxB,OAAO,QAAoB,GAAA,EAAuB;AAChD,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAE5C,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MACxB,CAAA,CAAA,MAAQ;AAEN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,KAAK,CAAA,CAAE,CAAA;AAC9D,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAA,CAAW,GAAA,EAAa,KAAA,EAAmB;AAChD,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAM,kBAAkB,OAAO,KAAA,KAAU,WACrC,KAAA,GACA,IAAA,CAAK,UAAU,KAAK,CAAA;AAExB,MAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,eAAe,CAAA;AAChD,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAuC,KAAK,CAAA,CAAE,CAAA;AAC5D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,WAAW,GAAA,EAAsB;AACtC,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAA,CAAO,YAAA,CAAa,WAAW,GAAG,CAAA;AAClC,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,KAAK,CAAA,CAAE,CAAA;AAC/D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,KAAA,GAAiB;AACtB,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAA,CAAO,aAAa,KAAA,EAAM;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAE,CAAA;AACrD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QAAQ,GAAA,EAAsB;AACnC,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,OAAO,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA,KAAM,IAAA;AAAA,IAC9C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAE,CAAA;AAC7D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,IAAA,GAAiB;AACtB,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA;AAAA,IACxC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,KAAK,CAAA,CAAE,CAAA;AAC9D,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AACF;AC1HO,IAAM,YAAA,GAAeA,oBAA6C,MAAS,CAAA;AAElF,IAAM,iBAAA,GAAoB,gBAAA;AAiB1B,IAAM,iBAAiB,MAAyB;AAC9C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,OAAA;AAC1C,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,UAAU,MAAA,GAAS,OAAA;AAC9E,CAAA;AAKA,IAAM,iBAAA,GAAoB,CAAC,KAAA,EAAc,YAAA,KAA0C;AACjF,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,EAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AAGtB,EAAA,IAAA,CAAK,YAAA,CAAa,cAAc,YAAY,CAAA;AAG5C,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,MAAM,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACrD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,QAAA,EAAW,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,EACzF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACtD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,UAAA,EAAa,GAAG,IAAI,KAAK,CAAA;AAAA,EAClD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,YAAY,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC3D,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,SAAA,EAAY,GAAG,IAAI,KAAK,CAAA;AAAA,EACjD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,QAAQ,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACvD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,OAAA,EAAU,GAAG,IAAI,KAAK,CAAA;AAAA,EAC/C,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,UAAU,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACzD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,OAAA,EAAU,GAAG,IAAI,KAAK,CAAA;AAAA,EAC/C,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,UAAU,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACzD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,UAAA,EAAa,GAAG,IAAI,KAAK,CAAA;AAAA,EAClD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,SAAS,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACxD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,SAAA,EAAY,GAAG,IAAI,KAAK,CAAA;AAAA,EACjD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,UAAU,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACzD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,aAAA,EAAgB,GAAG,IAAI,KAAK,CAAA;AAAA,EACrD,CAAC,CAAA;AACH,CAAA;AAEO,IAAM,gBAA8C,CAAC;AAAA,EAC1D,QAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,QAAA;AAAA,EACd,UAAA,GAAa,iBAAA;AAAA,EACb,kBAAA,GAAqB;AACvB,CAAA,KAAM;AAEJ,EAAA,MAAM,iBAAiB,MAAiB;AACtC,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,OAAA,CAAmB,UAAU,CAAA;AAC5D,IAAA,OAAO,SAAA,IAAa,WAAA;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,CAAC,SAAA,EAAW,iBAAiB,CAAA,GAAIC,eAAoB,cAAc,CAAA;AACzE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAA4B,cAAc,CAAA;AAChF,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAA4B,YAAY,CAAA;AAG9E,EAAA,MAAM,iBAAA,GAAuCC,cAAQ,MAAM;AACzD,IAAA,IAAI,SAAA,KAAc,UAAU,OAAO,WAAA;AACnC,IAAA,OAAO,SAAA;AAAA,EACT,CAAA,EAAG,CAAC,SAAA,EAAW,WAAW,CAAC,CAAA;AAG3B,EAAA,MAAM,KAAA,GAAeA,cAAQ,MAAM;AACjC,IAAA,IAAI,aAAa,OAAO,WAAA;AACxB,IAAA,OAAO,iBAAA,KAAsB,UAAU,UAAA,GAAa,SAAA;AAAA,EACtD,CAAA,EAAG,CAAC,WAAA,EAAa,iBAAiB,CAAC,CAAA;AAGnC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA;AAEnE,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAA2B;AAC/C,MAAA,cAAA,CAAe,CAAA,CAAE,OAAA,GAAU,MAAA,GAAS,OAAO,CAAA;AAAA,IAC7C,CAAA;AAGA,IAAA,IAAI,WAAW,gBAAA,EAAkB;AAC/B,MAAA,UAAA,CAAW,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAClD,MAAA,OAAO,MAAM,UAAA,CAAW,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,IACpE,CAAA,MAAA,IAES,WAAW,WAAA,EAAa;AAC/B,MAAA,UAAA,CAAW,YAAY,YAAY,CAAA;AACnC,MAAA,OAAO,MAAM,UAAA,CAAW,cAAA,CAAe,YAAY,CAAA;AAAA,IACrD;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,iBAAA,CAAkB,OAAO,iBAAiB,CAAA;AAAA,IAC5C;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,iBAAA,EAAmB,kBAAkB,CAAC,CAAA;AAGjD,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,SAAS,CAAA;AAAA,EAC5C,CAAA,EAAG,CAAC,SAAA,EAAW,UAAU,CAAC,CAAA;AAE1B,EAAA,MAAM,YAAA,GAAeC,iBAAA,CAAY,CAAC,IAAA,KAAoB;AACpD,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAWA,iBAAA,CAAY,CAAC,QAAA,KAAoB;AAChD,IAAA,cAAA,CAAe,QAAQ,CAAA;AAAA,EACzB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAcA,kBAAY,MAAM;AACpC,IAAA,iBAAA,CAAkB,CAAC,QAAA,KAAa;AAC9B,MAAA,IAAI,QAAA,KAAa,SAAS,OAAO,MAAA;AACjC,MAAA,IAAI,QAAA,KAAa,QAAQ,OAAO,QAAA;AAChC,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAkCF,cAAQ,OAAO;AAAA,IACrD,KAAA;AAAA,IACA,SAAA;AAAA,IACA,iBAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,CAAA,EAAI,CAAC,KAAA,EAAO,SAAA,EAAW,mBAAmB,QAAA,EAAU,YAAA,EAAc,WAAW,CAAC,CAAA;AAE9E,EAAA,MAAM,QAAA,GAAWA,aAAA,CAAQ,MAAMG,oBAAA,CAAY;AAAA,IACzC,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,iBAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,MAAM,MAAA,CAAO;AAAA,OACrB;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,MAAM,MAAA,CAAO;AAAA,OACrB;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,MAAM,MAAA,CAAO;AAAA,OACrB;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,MAAM,MAAA,CAAO;AAAA,OACrB;AAAA,MACA,UAAA,EAAY;AAAA,QACV,OAAA,EAAS,MAAM,MAAA,CAAO,UAAA;AAAA,QACtB,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,OACtB;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,MAAM,MAAA,CAAO,IAAA;AAAA,QACtB,SAAA,EAAW,MAAM,MAAA,CAAO;AAAA;AAC1B;AACF,GACD,CAAA,EAAG,CAAC,iBAAA,EAAmB,KAAK,CAAC,CAAA;AAE9B,EAAA,uBACEC,cAAA,CAAC,aAAa,QAAA,EAAb,EAAsB,OAAO,YAAA,EAC5B,QAAA,kBAAAC,eAAA,CAACC,sBAAA,EAAA,EAAiB,KAAA,EAAO,QAAA,EACvB,QAAA,EAAA;AAAA,oBAAAF,cAAA,CAACG,oBAAA,EAAA,EAAY,CAAA;AAAA,IACZ;AAAA,GAAA,EACH,CAAA,EACF,CAAA;AAEJ;ACzMO,IAAM,WAAW,MAAyB;AAC/C,EAAA,MAAM,OAAA,GAAUC,iBAAW,YAAY,CAAA;AAEvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO,OAAA;AACT;ACsBO,IAAM,cAA0C,CAAC;AAAA,EACtD,gBAAA,GAAmB,qBAAA;AAAA,EACnB,eAAA,GAAkB,wBAAA;AAAA,EAClB,iBAAA,GAAoB,uBAAA;AAAA,EACpB,WAAA,GAAc,IAAA;AAAA,EACd,EAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAY,GAAI,QAAA,EAAS;AAE5C,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,OAAA;AACH,QAAA,uBAAOJ,eAACK,uBAAA,EAAA,EAAU,CAAA;AAAA,MACpB,KAAK,MAAA;AACH,QAAA,uBAAOL,eAACM,sBAAA,EAAA,EAAS,CAAA;AAAA,MACnB,KAAK,QAAA;AACH,QAAA,uBAAON,eAACO,4BAAA,EAAA,EAAe,CAAA;AAAA,MACzB;AACE,QAAA,uBAAOP,eAACO,4BAAA,EAAA,EAAe,CAAA;AAAA;AAC3B,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,OAAA;AACH,QAAA,OAAO,gBAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,eAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,iBAAA;AAAA,MACT;AACE,QAAA,OAAO,gBAAA;AAAA;AACX,EACF,CAAA;AAEA,EAAA,MAAM,yBACJP,cAAAA;AAAA,IAACQ,mBAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,WAAA;AAAA,MACT,KAAA,EAAM,SAAA;AAAA,MACN,EAAA,EAAI;AAAA,QACF,YAAA,EAAc,KAAA;AAAA,QACd,GAAG;AAAA,OACL;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA,OAAA;AAAQ;AAAA,GACX;AAGF,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,uBACER,eAACS,gBAAA,EAAA,EAAQ,KAAA,EAAO,YAAW,EAAG,KAAA,EAAK,MAChC,QAAA,EAAA,MAAA,EACH,CAAA;AAEJ;ACxFO,SAAS,YAAA,GAAe;AAC7B,EAAA,MAAM,WAAWC,0BAAA,EAAY;AAC7B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,EAAA,uBACET,eAAAA;AAAA,IAACU,YAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,SAAA,EAAW,OAAA;AAAA,QACX,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,eAAA,EAAiB,MAAM,MAAA,CAAO,mBAAA;AAAA,QAC9B,GAAA,EAAK,CAAA;AAAA,QACL,SAAA,EAAW,QAAA;AAAA,QACX,EAAA,EAAI;AAAA,OACN;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAACY,uCAAsB,EAAA,EAAI,EAAE,UAAU,EAAA,EAAI,KAAA,EAAO,iBAAgB,EAAG,CAAA;AAAA,wBACrEZ,eAACa,mBAAA,EAAA,EAAW,OAAA,EAAQ,MAAK,UAAA,EAAW,MAAA,EAAO,KAAA,EAAM,cAAA,EAAe,QAAA,EAAA,KAAA,EAEhE,CAAA;AAAA,wBACAb,cAAAA,CAACa,mBAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,KAAA,EAAM,kBAAiB,QAAA,EAAA,gBAAA,EAEhD,CAAA;AAAA,wBACAb,cAAAA,CAACa,mBAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,eAAA,EAAgB,EAAA,EAAI,EAAE,QAAA,EAAU,GAAA,EAAI,EAAG,QAAA,EAAA,8DAAA,EAEzE,CAAA;AAAA,wBACAb,cAAAA;AAAA,UAACc,eAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,eAAe,MAAA,EAAO;AAAA,YACnC,SAAS,MAAM,QAAA,CAAS,KAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,YAC/C,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GACF;AAEJ;;;ACxCO,IAAM,aAAN,MAAiB;AAAA,EAKtB,WAAA,CAAY,MAAA,GAA2B,EAAC,EAAG;AACzC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,EAAA;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AACjC,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA,CAAO,OAAA,IAAW,EAAC;AAAA,EAC3C;AAAA,EAEQ,QAAA,CAAS,KAAa,MAAA,EAA4D;AACxF,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,GAAI,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA;AAEpE,IAAA,IAAI,CAAC,QAAQ,OAAO,OAAA;AAEpB,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC/C,MAAA,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACxC,CAAC,CAAA;AAED,IAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,YAAA,CAAa,UAAU,CAAA,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAc,OAAA,CACZ,GAAA,EACA,MAAA,GAAwB,EAAC,EACC;AAC1B,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAA,GAAU,IAAA,CAAK,OAAA,EAAS,OAAA,GAAU,EAAC,EAAG,GAAG,UAAA,EAAW,GAAI,MAAA;AAE9E,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,OAAO,CAAA;AAE9D,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,KAAK,QAAA,CAAS,GAAA,EAAK,MAAM,CAAA,EAAG;AAAA,QACvD,GAAG,UAAA;AAAA,QACH,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,GAAG,IAAA,CAAK,cAAA;AAAA,UACR,GAAG;AAAA,SACL;AAAA,QACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,QACpC,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,QAAmB,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AACvE,QAAA,KAAA,CAAM,SAAS,QAAA,CAAS,MAAA;AACxB,QAAA,KAAA,CAAM,aAAa,QAAA,CAAS,UAAA;AAC5B,QAAA,IAAI;AACF,UAAA,KAAA,CAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAAA,QACnC,CAAA,CAAA,MAAQ;AACN,UAAA,KAAA,CAAM,IAAA,GAAO,EAAE,IAAA,EAAM,QAAA,CAAS,QAAQ,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA,EAAK,EAAE;AAAA,QACvE;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AAEzC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,SAAS,QAAA,CAAS;AAAA,OACpB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,MACnC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,gBAAA,CAAiB,KAAa,KAAA,EAAqB;AACjD,IAAA,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,GAAI,KAAA;AAAA,EAC7B;AAAA,EAEA,oBAAoB,GAAA,EAAmB;AACrC,IAAA,OAAO,IAAA,CAAK,eAAe,GAAG,CAAA;AAAA,EAChC;AAAA,EAEA,iBAAA,GAA4C;AAC1C,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,cAAA,EAAe;AAAA,EAClC;AAAA,EAEA,GAAA,CAAa,KAAa,MAAA,EAAkD;AAC1E,IAAA,OAAO,IAAA,CAAK,QAAW,GAAA,EAAK,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC1D;AAAA,EAEA,IAAA,CAAc,GAAA,EAAa,IAAA,EAAY,MAAA,EAAkD;AACvF,IAAA,OAAO,IAAA,CAAK,QAAW,GAAA,EAAK,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,EACjE;AAAA,EAEA,GAAA,CAAa,GAAA,EAAa,IAAA,EAAY,MAAA,EAAkD;AACtF,IAAA,OAAO,IAAA,CAAK,QAAW,GAAA,EAAK,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EAChE;AAAA,EAEA,KAAA,CAAe,GAAA,EAAa,IAAA,EAAY,MAAA,EAAkD;AACxF,IAAA,OAAO,IAAA,CAAK,QAAW,GAAA,EAAK,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,CAAA;AAAA,EAClE;AAAA,EAEA,MAAA,CAAgB,KAAa,MAAA,EAAkD;AAC7E,IAAA,OAAO,IAAA,CAAK,QAAW,GAAA,EAAK,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,UAAU,CAAA;AAAA,EAC7D;AACF;AAEO,SAAS,oBAAoB,KAAA,EAAoB;AACtD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,MAAM,SAAA,GAAY,KAAA;AAClB,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,OAAO,UAAU,IAAA,CAAK,OAAA;AAAA,IACxB;AACA,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AACA,EAAA,OAAO,8BAAA;AACT;AC3GO,SAAS,kBAAkB,EAAE,WAAA,EAAa,UAAA,GAAa,GAAA,EAAK,eAAc,EAA2B;AAC1G,EAAA,MAAM,CAAC,YAAY,CAAA,GAAIC,8BAAA,EAAgB;AACvC,EAAA,MAAM,WAAWL,0BAAAA,EAAY;AAC7B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,EAAAb,gBAAU,MAAM;AACd,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,GAAA,CAAI,aAAa,CAAA;AAEjD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAA,CAAQ,MAAM,gEAAgE,CAAA;AAC9E,MAAA,aAAA,IAAgB;AAChB,MAAA;AAAA,IACF;AACA,IAAA,WAAA,CACG,qBAAqB,EAAE,UAAA,EAAY,CAAA,CACnC,KAAK,MAAM;AACV,MAAA,QAAA,CAAS,UAAA,EAAY,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,IACxC,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAiB;AACvB,MAAA,OAAA,CAAQ,KAAA,CAAM,wBAAA,EAA0B,mBAAA,CAAoB,GAAG,CAAC,CAAA;AAChE,MAAA,aAAA,IAAgB;AAAA,IAClB,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEI,eAAAA;AAAA,IAACU,YAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,SAAA,EAAW,OAAA;AAAA,QACX,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,UAAA,EAAY,2BAA2B,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,KAAA,EAAQ,KAAA,CAAM,OAAO,aAAa,CAAA,MAAA,CAAA;AAAA,QAC7F,GAAA,EAAK;AAAA,OACP;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAX,cAAAA,CAACgB,6BAAiB,EAAA,EAAI,EAAE,OAAO,KAAA,CAAM,MAAA,CAAO,SAAQ,EAAG,CAAA;AAAA,wBACvDhB,cAAAA,CAACa,mBAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,EAAA,EAAI,EAAE,KAAA,EAAO,MAAM,MAAA,CAAO,OAAA,EAAS,OAAA,EAAS,IAAA,IAAQ,QAAA,EAAA,sBAAA,EAEhF;AAAA;AAAA;AAAA,GACF;AAEJ;ACOA,IAAM,cAAA,GAKD,CAAC,EAAE,IAAA,EAAM,QAAQ,CAAA,EAAG,QAAA,EAAU,UAAS,KAAM;AAChD,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA;AAC5D,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAEvC,EAAA,uBACEZ,gBAAAgB,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAjB,cAAAA,CAACkB,iBAAA,EAAA,EAAS,cAAA,EAAc,IAAA,EACtB,QAAA,kBAAAjB,eAAAA;AAAA,MAACkB,uBAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,cAAc,KAAA,GAAQC,sBAAA;AAAA,QACjC,EAAA,EAAI,CAAC,WAAA,GAAe,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,EAAE,CAAA,CAAA,GAAM,MAAA;AAAA,QAClD,GAAA,EAAK,KAAA;AAAA,QACL,SAAS,WAAA,GAAc,MAAM,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,GAAI,MAAA;AAAA,QACjD,EAAA,EAAI;AAAA,UACF,EAAA,EAAI,IAAI,KAAA,GAAQ,CAAA;AAAA,UAChB,UAAA,EAAY;AAAA,YACV,eAAA,EAAiB,iBAAA;AAAA,YACjB,KAAA,EAAO,cAAA;AAAA,YACP,UAAA,EAAY,CAAA;AAAA,YACZ,WAAA,EAAa,cAAA;AAAA,YACb,UAAA,EAAY,QAAA;AAAA,YACZ,yBAAA,EAA2B;AAAA,cACzB,KAAA,EAAO;AAAA;AACT,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,eAAA,EAAiB;AAAA,WACnB;AAAA,UACA,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,IAAA,oBACJpB,cAAAA,CAACqB,qBAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC9B,QAAA,EAAA,IAAA,CAAK,IAAA,EACR,CAAA;AAAA,0BAEFrB,cAAAA;AAAA,YAACsB,qBAAA;AAAA,YAAA;AAAA,cACC,SAAS,IAAA,CAAK,KAAA;AAAA,cACd,sBAAA,EAAwB;AAAA,gBACtB,QAAA,EAAU;AAAA;AACZ;AAAA,WACF;AAAA,UACC,WAAA,oBACCtB,cAAAA,CAACQ,mBAAAA,EAAA,EAAW,IAAA,EAAK,OAAA,EAAQ,IAAI,EAAE,CAAA,EAAG,GAAE,EACjC,QAAA,EAAA,UAAA,mBAAaR,cAAAA,CAACuB,wBAAA,EAAA,EAAW,oBAAKvB,cAAAA,CAACwB,4BAAW,CAAA,EAC7C;AAAA;AAAA;AAAA,KAEJ,EACF,CAAA;AAAA,IACC,WAAA,oBACCxB,cAAAA,CAACyB,iBAAA,EAAA,EAAS,IAAI,UAAA,EAAY,OAAA,EAAQ,MAAA,EAAO,aAAA,EAAa,IAAA,EACpD,QAAA,kBAAAzB,eAAC0B,aAAA,EAAA,EAAK,SAAA,EAAU,OAAM,cAAA,EAAc,IAAA,EACjC,eAAK,QAAA,CAAU,GAAA,CAAI,CAAC,KAAA,qBACnB1B,cAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAM,KAAA;AAAA,QACN,OAAO,KAAA,GAAQ,CAAA;AAAA,QACf,QAAA;AAAA,QACA;AAAA,OAAA;AAAA,MAJK,KAAA,CAAM;AAAA,KAMd,GACH,CAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAA;AAKA,IAAM,iBAAA,GAAoB,CAAC,KAAA,KAAqE;AAC9F,EAAA,MAAM,SAAwD,EAAC;AAE/D,EAAA,MAAM,OAAA,GAAU,CAAC,SAAA,KAA0B;AACzC,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,SAAA,EAAW;AAC/B,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,SAAA,EAAW,IAAA,CAAK,WAAW,CAAA;AAAA,MAC5D;AACA,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,OAAA,CAAQ,KAAK,CAAA;AACb,EAAA,OAAO,MAAA;AACT,CAAA;AAMA,IAAM,2BAAyD,CAAC;AAAA,EAC9D,SAAA;AAAA,EACA,YAAA,GAAe,GAAA;AAAA,EACf,SAAA,GAAY,EAAA;AAAA,EACZ,YAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,kBAAkB;AACpB,CAAA,KAAM;AACJ,EAAA,MAAM,WAAW2B,0BAAA,EAAY;AAC7B,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAIhC,eAAsB,IAAI,GAAA,CAAI,eAAe,CAAC,CAAA;AAE9E,EAAA,MAAM,YAAA,GAAe,CAAC,EAAA,KAAe;AACnC,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAChB,QAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,MACb;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAAE,gBAAU,MAAM;AACd,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAA4C;AAClE,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,QAAA,CAAS,QAAA,KAAa,KAAK,IAAA,EAAM;AAChD,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,IAAI,KAAK,QAAA,EAAU;AACjB,YAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAC1C,YAAA,IAAI,OAAO,OAAO,KAAA;AAAA,UACpB;AAAA,QACF;AACA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAEA,MAAA,MAAM,UAAA,GAAa,eAAe,SAAS,CAAA;AAC3C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,YAAA,CAAa,WAAW,EAAE,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAA,CAAS,QAAA,EAAU,SAAA,EAAW,YAAY,CAAC,CAAA;AAG/C,EAAA,MAAM,gBAAgB,SAAA,CAAU,IAAA;AAAA,IAAK,CAAA,IAAA,KACnC,KAAK,SAAA,IAAc,IAAA,CAAK,UAAU,IAAA,CAAK,CAAA,KAAA,KAAS,MAAM,SAAS;AAAA,GACjE;AAEA,EAAA,MAAM,MAAA,GAAS,aAAA,GAAgB,iBAAA,CAAkB,SAAS,IAAI,EAAC;AAE/D,EAAA,uBACEI,eAAAA;AAAA,IAACU,YAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,MAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAO,MAAA;AAAA,QACP,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAX,cAAAA;AAAA,UAAC4B,eAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,EAAA,EAAI;AAAA,cACF,KAAA,EAAO,YAAA;AAAA,cACP,UAAA,EAAY,CAAA;AAAA,cACZ,oBAAA,EAAsB;AAAA,gBACpB,KAAA,EAAO,YAAA;AAAA,gBACP,SAAA,EAAW,YAAA;AAAA,gBACX,QAAA,EAAU,UAAA;AAAA,gBACV,WAAA,EAAa,WAAA;AAAA,gBACb,WAAA,EAAa,SAAA;AAAA,gBACb,GAAG;AAAA;AACL,aACF;AAAA,YAEA,0BAAA5B,cAAAA,CAAC0B,aAAA,EAAA,EAAK,EAAA,EAAI,EAAE,GAAG,CAAA,EAAE,EACd,QAAA,EAAA,SAAA,CAAU,MAAA,CAAO,UAAQ,IAAA,CAAK,KAAK,EAAE,GAAA,CAAI,CAAC,yBACzC1B,cAAAA;AAAA,cAAC,cAAA;AAAA,cAAA;AAAA,gBAEC,IAAA;AAAA,gBACA,QAAA;AAAA,gBACA,QAAA,EAAU;AAAA,eAAA;AAAA,cAHL,IAAA,CAAK;AAAA,aAKb,CAAA,EACH;AAAA;AAAA,SACF;AAAA,wBAEAA,cAAAA;AAAA,UAACW,YAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,MAAA;AAAA,YACV,EAAA,EAAI;AAAA,cACF,QAAA,EAAU,CAAA;AAAA,cACV,QAAA,EAAU,MAAA;AAAA,cACV,GAAG;AAAA,aACL;AAAA,YAEC,QAAA,EAAA,aAAA,mBACCX,cAAAA,CAAC6B,qBAAA,EAAA,EACE,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,SAAA,EAAU,qBAC7B7B,cAAAA;AAAA,cAAC8B,oBAAA;AAAA,cAAA;AAAA,gBAEC,IAAA;AAAA,gBACA,OAAA,EAAS;AAAA,eAAA;AAAA,cAFJ;AAAA,aAIR,CAAA,EACH,CAAA,mBAEA9B,eAAC+B,qBAAA,EAAA,EAAO;AAAA;AAAA;AAEZ;AAAA;AAAA,GACF;AAEJ,CAAA;AAKA,IAAM,uBAAA,GAAwD,CAAC,KAAA,KAAU;AACvE,EAAA;AAAA;AAAA,oBAEE/B,cAAAA,CAACgC,4BAAA,EAAA,EAAc,MAAA,EAAQ,EAAE,kBAAA,EAAoB,IAAA,EAAM,oBAAA,EAAsB,IAAA,IACvE,QAAA,kBAAAhC,cAAAA,CAAC,wBAAA,EAAA,EAA0B,GAAG,OAAO,CAAA,EACvC;AAAA;AAEJ,CAAA;AAKA,IAAM,aAAA,GAOD,CAAC,EAAE,IAAA,EAAM,UAAA,EAAY,QAAQ,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,OAAA,EAAQ,KAAM;AACrE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA;AAC5D,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,KAAK,EAAA,KAAO,UAAA;AAE7B,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEC,gBAAAgB,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAjB,cAAAA,CAACkB,iBAAA,EAAA,EAAS,cAAA,EAAc,IAAA,EACtB,QAAA,kBAAAjB,eAAAA;AAAA,MAACkB,uBAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,QAAA;AAAA,QACV,OAAA,EAAS,WAAA;AAAA,QACT,EAAA,EAAI;AAAA,UACF,EAAA,EAAI,IAAI,KAAA,GAAQ,CAAA;AAAA,UAChB,gBAAA,EAAkB;AAAA,YAChB,eAAA,EAAiB,iBAAA;AAAA,YACjB,KAAA,EAAO,cAAA;AAAA,YACP,UAAA,EAAY,CAAA;AAAA,YACZ,WAAA,EAAa,cAAA;AAAA,YACb,UAAA,EAAY,QAAA;AAAA,YACZ,yBAAA,EAA2B;AAAA,cACzB,KAAA,EAAO;AAAA,aACT;AAAA,YACA,SAAA,EAAW;AAAA,cACT,eAAA,EAAiB;AAAA;AACnB,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,eAAA,EAAiB;AAAA,WACnB;AAAA,UACA,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,IAAA,oBACJnB,cAAAA,CAACqB,qBAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC9B,QAAA,EAAA,IAAA,CAAK,IAAA,EACR,CAAA;AAAA,0BAEFrB,cAAAA;AAAA,YAACsB,qBAAA;AAAA,YAAA;AAAA,cACC,SAAS,IAAA,CAAK,KAAA;AAAA,cACd,sBAAA,EAAwB;AAAA,gBACtB,QAAA,EAAU;AAAA;AACZ;AAAA,WACF;AAAA,UACC,WAAA,oBACCtB,cAAAA,CAACQ,mBAAAA,EAAA,EAAW,IAAA,EAAK,OAAA,EAAQ,IAAI,EAAE,CAAA,EAAG,GAAE,EACjC,QAAA,EAAA,UAAA,mBAAaR,cAAAA,CAACuB,wBAAA,EAAA,EAAW,oBAAKvB,cAAAA,CAACwB,4BAAW,CAAA,EAC7C;AAAA;AAAA;AAAA,KAEJ,EACF,CAAA;AAAA,IACC,WAAA,oBACCxB,cAAAA,CAACyB,iBAAA,EAAA,EAAS,IAAI,UAAA,EAAY,OAAA,EAAQ,MAAA,EAAO,aAAA,EAAa,IAAA,EACpD,QAAA,kBAAAzB,eAAC0B,aAAA,EAAA,EAAK,SAAA,EAAU,OAAM,cAAA,EAAc,IAAA,EACjC,eAAK,QAAA,CAAU,GAAA,CAAI,CAAC,KAAA,qBACnB1B,cAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAM,KAAA;AAAA,QACN,UAAA;AAAA,QACA,OAAO,KAAA,GAAQ,CAAA;AAAA,QACf,QAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OAAA;AAAA,MANK,KAAA,CAAM;AAAA,KAQd,GACH,CAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAA;AAKA,IAAM,yBAAuD,CAAC;AAAA,EAC5D,SAAA;AAAA,EACA,YAAA,GAAe,GAAA;AAAA,EACf,SAAA,GAAY,EAAA;AAAA,EACZ,eAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,kBAAkB;AACpB,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIL,cAAAA;AAAA,IAClC,eAAA,IAAmB,SAAA,CAAU,CAAC,CAAA,EAAG;AAAA,GACnC;AACA,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAIA,eAAsB,IAAI,GAAA,CAAI,eAAe,CAAC,CAAA;AAE9E,EAAA,MAAM,YAAA,GAAe,CAAC,EAAA,KAAe;AACnC,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAChB,QAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,MACb;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,EAAA,KAAe;AACtC,IAAA,aAAA,CAAc,EAAE,CAAA;AAChB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,EAAmB,EAAA,KAAqC;AAC9E,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,EAAA,KAAO,EAAA,EAAI,OAAO,IAAA;AAC3B,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,EAAE,CAAA;AAC9C,QAAA,IAAI,OAAO,OAAO,KAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,SAAA,EAAW,UAAU,CAAA;AAEvD,EAAA,uBACEM,eAAAA;AAAA,IAACU,YAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,MAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAO,MAAA;AAAA,QACP,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAX,cAAAA;AAAA,UAAC4B,eAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,EAAA,EAAI;AAAA,cACF,KAAA,EAAO,YAAA;AAAA,cACP,UAAA,EAAY,CAAA;AAAA,cACZ,oBAAA,EAAsB;AAAA,gBACpB,KAAA,EAAO,YAAA;AAAA,gBACP,SAAA,EAAW,YAAA;AAAA,gBACX,QAAA,EAAU,UAAA;AAAA,gBACV,WAAA,EAAa,WAAA;AAAA,gBACb,WAAA,EAAa,SAAA;AAAA,gBACb,GAAG;AAAA;AACL,aACF;AAAA,YAEA,0BAAA5B,cAAAA,CAAC0B,aAAA,EAAA,EAAK,EAAA,EAAI,EAAE,GAAG,CAAA,EAAE,EACd,QAAA,EAAA,SAAA,CAAU,MAAA,CAAO,UAAQ,IAAA,CAAK,KAAK,EAAE,GAAA,CAAI,CAAC,yBACzC1B,cAAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBAEC,IAAA;AAAA,gBACA,UAAA;AAAA,gBACA,QAAA;AAAA,gBACA,QAAA,EAAU,YAAA;AAAA,gBACV,OAAA,EAAS;AAAA,eAAA;AAAA,cALJ,IAAA,CAAK;AAAA,aAOb,CAAA,EACH;AAAA;AAAA,SACF;AAAA,wBAEAA,cAAAA;AAAA,UAACW,YAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,MAAA;AAAA,YACV,EAAA,EAAI;AAAA,cACF,QAAA,EAAU,CAAA;AAAA,cACV,QAAA,EAAU,MAAA;AAAA,cACV,CAAA,EAAG,CAAA;AAAA,cACH,GAAG;AAAA,aACL;AAAA,YAEC,QAAA,EAAA,UAAA,EAAY,6BACXX,cAAAA;AAAA,cAACa,mBAAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,OAAA;AAAA,gBACR,KAAA,EAAM,gBAAA;AAAA,gBACN,EAAA,EAAI,EAAE,SAAA,EAAW,QAAA,EAAU,IAAI,CAAA,EAAE;AAAA,gBAClC,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAEJ;AAAA;AAAA,GACF;AAEJ,CAAA;AA0EO,IAAM,aAAA,GAA8C,CAAC,KAAA,KAAU;AAGpE,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,uBAAOb,cAAAA,CAAC,uBAAA,EAAA,EAAyB,GAAG,KAAA,EAAO,CAAA;AAAA,EAC7C;AAEA,EAAA,uBAAOA,cAAAA,CAAC,sBAAA,EAAA,EAAwB,GAAG,KAAA,EAAO,CAAA;AAC5C;ACxjBA,IAAI,mBAAA,GAA0C,IAAA;AAC9C,IAAI,kBAAA,GAAkD,IAAA;AAE/C,IAAM,iBAAiB,YAAkC;AAC5D,EAAA,IAAI,mBAAA,EAAqB;AACrB,IAAA,OAAO,mBAAA;AAAA,EACX;AAEA,EAAA,IAAI,kBAAA,EAAoB;AACpB,IAAA,OAAO,kBAAA;AAAA,EACX;AAEA,EAAA,kBAAA,GAAqBiC,uBAAA,CAAkB;AAAA,IACnC,MAAA,EAAQ,CAAC,cAAA,EAAgB,aAAa,CAAA;AAAA,IACtC,OAAO,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAQ,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,QAAQ,KAAA,EAAO,GAAA,EAAK,QAAQ,KAAA,EAAO,KAAA,EAAO,QAAQ,MAAM;AAAA,GAC7H,CAAA,CAAE,IAAA,CAAK,CAAA,WAAA,KAAe;AACnB,IAAA,mBAAA,GAAsB,WAAA;AACtB,IAAA,OAAO,WAAA;AAAA,EACX,CAAC,CAAA;AAED,EAAA,OAAO,kBAAA;AACX;ACDA,IAAM,eAA4C,CAAC;AAAA,EACjD,OAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,MAAA,EAAQ,UAAA;AAAA,EACR;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,SAAS,UAAA,KAAe,MAAA,GAAY,UAAA,GAAc,QAAA,EAAU,SAAS,IAAA,KAAS,MAAA;AACpF,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAItC,eAA6B,IAAI,CAAA;AACvE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,IAAIA,cAAAA,iBAAsB,IAAI,KAAK,CAAA;AAEvE,EAAAE,gBAAU,MAAM;AACd,IAAA,cAAA,EAAe,CAAE,KAAK,cAAc,CAAA;AAAA,EACtC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkB,OAAO,IAAA,EAAc,OAAA,KAAoB;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,MAAA,eAAA,CAAgB,UAAQ,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,GAAA,CAAI,OAAO,CAAC,CAAA;AAClD,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,eAAA,CAAgB,CAAA,IAAA,KAAQ;AACtB,UAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,IAAI,CAAA;AAC3B,UAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AACrB,UAAA,OAAO,MAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH,GAAG,GAAI,CAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,GAAG,CAAA;AAAA,IAC5C;AAAA,EACF,CAAA;AAGA,EAAA,uBACEI,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,4BAAA,EAA+B,SAAS,CAAA,CAAA,EACtD,QAAA,EAAA;AAAA,oBAAAD,eAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAQN,CAAA;AAAA,oBACFA,cAAAA;AAAA,MAACkC,8BAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAe,CAACC,0BAAA,EAAWC,2BAAU,CAAA;AAAA,QACrC,aAAA,EAAe,CAACC,4BAAW,CAAA;AAAA,QAC3B,UAAA,EAAY;AAAA,UACV,KAAK,EAAE,SAAA,EAAAC,YAAW,QAAA,EAAU,GAAG,OAAM,EAAG;AACtC,YAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAKA,UAAAA,IAAa,EAAE,CAAA;AAEnD,YAAA,IAAI,SAAS,WAAA,EAAa;AACxB,cAAA,MAAM,WAAW,MAAA,CAAO,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnD,cAAA,MAAM,OAAA,GAAU,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAE/D,cAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,cAAA,IAAI;AACF,gBAAA,eAAA,GAAkB,WAAA,CAAY,WAAW,QAAA,EAAU;AAAA,kBACjD,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,kBACb,KAAA,EAAO,SAAS,aAAA,GAAgB;AAAA,iBACjC,CAAA;AAAA,cACH,SAAS,CAAA,EAAG;AAEV,gBAAA,IAAI;AACF,kBAAA,eAAA,GAAkB,WAAA,CAAY,WAAW,QAAA,EAAU;AAAA,oBACjD,IAAA,EAAM,MAAA;AAAA,oBACN,KAAA,EAAO,SAAS,aAAA,GAAgB;AAAA,mBACjC,CAAA;AAAA,gBACH,SAAS,aAAA,EAAe;AAEtB,kBAAA,eAAA,GAAkB,cAAc,QAAQ,CAAA,aAAA,CAAA;AAAA,gBAC1C;AAAA,cACF;AAEA,cAAA,uBACErC,eAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,QAAA,EAAU,YAAW,EACjC,QAAA,EAAA;AAAA,gCAAAD,cAAAA,CAAC,SAAI,SAAA,EAAU,eAAA,EAAgB,yBAAyB,EAAE,MAAA,EAAQ,iBAAgB,EAAG,CAAA;AAAA,gCACrFA,cAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,MAAM,eAAA,CAAgB,QAAA,EAAU,OAAO,CAAA;AAAA,oBAChD,KAAA,EAAO;AAAA,sBACL,QAAA,EAAU,UAAA;AAAA,sBACV,GAAA,EAAK,KAAA;AAAA,sBACL,KAAA,EAAO,KAAA;AAAA,sBACP,eAAA,EAAiB,4CAAA;AAAA,sBACjB,MAAA,EAAQ,+CAAA;AAAA,sBACR,YAAA,EAAc,KAAA;AAAA,sBACd,OAAA,EAAS,KAAA;AAAA,sBACT,QAAA,EAAU,MAAA;AAAA,sBACV,MAAA,EAAQ,SAAA;AAAA,sBACR,KAAA,EAAO,wCAAA;AAAA,sBACP,UAAA,EAAY,QAAA;AAAA,sBACZ,cAAA,EAAgB,QAAA;AAAA,sBAChB,UAAA,EAAY,eAAA;AAAA,sBACZ,KAAA,EAAO,MAAA;AAAA,sBACP,MAAA,EAAQ;AAAA,qBACV;AAAA,oBACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,sBAAA,CAAA,CAAE,aAAA,CAAc,KAAA,CAAM,eAAA,GAAkB,MAAA,GACpC,+CAAA,GACA,4CAAA;AAAA,oBACN,CAAA;AAAA,oBACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,sBAAA,CAAA,CAAE,aAAA,CAAc,KAAA,CAAM,eAAA,GAAkB,MAAA,GACpC,4CAAA,GACA,+CAAA;AAAA,oBACN,CAAA;AAAA,oBACA,KAAA,EAAO,YAAA,CAAa,GAAA,CAAI,OAAO,IAAI,SAAA,GAAY,WAAA;AAAA,oBAE9C,QAAA,EAAA,YAAA,CAAa,IAAI,OAAO,CAAA,mBACvBA,cAAAA,CAACuC,0BAAA,EAAA,EAAU,OAAO,EAAE,QAAA,EAAU,QAAO,EAAG,CAAA,mBAExCvC,cAAAA,CAACwC,gCAAA,EAAA,EAAgB,OAAO,EAAE,QAAA,EAAU,QAAO,EAAG;AAAA;AAAA;AAElD,eAAA,EACF,CAAA;AAAA,YAEJ;AAEA,YAAA,uBACExC,cAAAA,CAAC,MAAA,EAAA,EAAK,WAAWsC,UAAAA,EAAY,GAAG,OAC7B,QAAA,EACH,CAAA;AAAA,UAEJ;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ,CAAA;AAEA,IAAO,oBAAA,GAAQ;AChIf,IAAM,mBAAA,GAAsB5C,oBAAmD,MAAS,CAAA;AAkCjF,IAAM,uBAA4D,CAAC;AAAA,EACtE,QAAA;AAAA,EACA,eAAA,GAAkB,GAAA;AAAA,EAClB,gBAAA,GAAmB,CAAA;AAAA,EACnB,YAAA,GAAe,EAAE,QAAA,EAAU,KAAA,EAAO,YAAY,OAAA;AAClD,CAAA,KAAM;AACF,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIC,cAAAA,CAAyB,EAAE,CAAA;AAErE,EAAA,MAAM,mBAAmBG,iBAAAA,CAAY,CACjC,OAAA,EACA,IAAA,EACA,WAAmB,eAAA,KAClB;AACD,IAAA,MAAM,EAAA,GAAK,GAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAA;AACzC,IAAA,MAAM,eAAA,GAAgC,EAAE,EAAA,EAAI,OAAA,EAAS,MAAM,QAAA,EAAS;AAEpE,IAAA,gBAAA,CAAiB,CAAC,IAAA,KAAS;AAEvB,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAA,EAAM,eAAe,CAAA;AACzC,MAAA,IAAI,OAAA,CAAQ,SAAS,gBAAA,EAAkB;AACnC,QAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,gBAAgB,CAAA;AAAA,MAC1D;AACA,MAAA,OAAO,OAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,eAAA,EAAiB,gBAAgB,CAAC,CAAA;AAEtC,EAAA,MAAM,WAAA,GAAcA,iBAAAA,CAAY,CAAC,EAAA,KAAe;AAC5C,IAAA,gBAAA,CAAiB,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EACtE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,iBAAAA,CAAY,CAAC,OAAA,EAAiB,QAAA,KAAsB;AAChE,IAAA,gBAAA,CAAiB,OAAA,EAAS,WAAW,QAAQ,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,KAAA,GAAQA,iBAAAA,CAAY,CAAC,OAAA,EAAiB,QAAA,KAAsB;AAC9D,IAAA,gBAAA,CAAiB,OAAA,EAAS,SAAS,QAAQ,CAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,OAAA,GAAUA,iBAAAA,CAAY,CAAC,OAAA,EAAiB,QAAA,KAAsB;AAChE,IAAA,gBAAA,CAAiB,OAAA,EAAS,WAAW,QAAQ,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,IAAA,GAAOA,iBAAAA,CAAY,CAAC,OAAA,EAAiB,QAAA,KAAsB;AAC7D,IAAA,gBAAA,CAAiB,OAAA,EAAS,QAAQ,QAAQ,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,YAAA,GAAwC;AAAA,IAC1C,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACJ;AAEA,EAAA,uBACIG,eAAAA,CAAC,mBAAA,CAAoB,QAAA,EAApB,EAA6B,OAAO,YAAA,EAChC,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,aAAA,CAAc,GAAA,CAAI,CAAC,YAAA,EAAc,0BAC9BD,cAAAA;AAAA,MAACyC,iBAAA;AAAA,MAAA;AAAA,QAEG,IAAA,EAAM,IAAA;AAAA,QACN,kBAAkB,YAAA,CAAa,QAAA;AAAA,QAC/B,OAAA,EAAS,MAAM,WAAA,CAAY,YAAA,CAAa,EAAE,CAAA;AAAA,QAC1C,YAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACH,WAAW,KAAA,GAAQ;AAAA;AAAA,SACvB;AAAA,QAEA,QAAA,kBAAAzC,cAAAA;AAAA,UAAC0C,cAAA;AAAA,UAAA;AAAA,YACG,OAAA,EAAS,MAAM,WAAA,CAAY,YAAA,CAAa,EAAE,CAAA;AAAA,YAC1C,UAAU,YAAA,CAAa,IAAA;AAAA,YACvB,OAAA,EAAQ,QAAA;AAAA,YACR,EAAA,EAAI,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,YAEnB,QAAA,EAAA,YAAA,CAAa;AAAA;AAAA;AAClB,OAAA;AAAA,MAhBK,YAAA,CAAa;AAAA,KAkBzB;AAAA,GAAA,EACL,CAAA;AAER;AAoBO,IAAM,kBAAkB,MAA+B;AAC1D,EAAA,MAAM,OAAA,GAAUtC,iBAAW,mBAAmB,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,OAAA;AACX;AC9IO,IAAM,gBAAgB,CAAC;AAAA,EAC5B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAc,SAAA;AAAA,EACd,UAAA,GAAa,QAAA;AAAA,EACb,YAAA,GAAe,SAAA;AAAA,EACf,SAAA;AAAA,EACA;AACF,CAAA,KAA0B;AACxB,EAAA,uBACEH,gBAAC0C,eAAA,EAAA,EAAO,IAAA,EAAY,SAAS,QAAA,EAAU,QAAA,EAAS,MAAK,SAAA,EAAS,IAAA,EAAC,WAAW,EAAE,KAAA,EAAO,EAAE,EAAA,EAAI,EAAE,cAAc,CAAA,EAAE,IAAI,EAC7G,QAAA,EAAA;AAAA,oBAAA3C,cAAAA,CAAC4C,oBAAA,EAAA,EACC,QAAA,kBAAA3C,eAAAA,CAACU,cAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,GAAE,EACvD,QAAA,EAAA;AAAA,sBAAAX,cAAAA,CAAC6C,iCAAA,EAAA,EAAiB,KAAA,EAAO,YAAA,EAAc,CAAA;AAAA,MACtC;AAAA,KAAA,EACH,CAAA,EACF,CAAA;AAAA,oBACA7C,cAAAA,CAAC8C,sBAAA,EAAA,EACC,QAAA,kBAAA9C,cAAAA,CAACa,qBAAA,EAAW,OAAA,EAAQ,OAAA,EAAS,QAAA,EAAA,OAAA,EAAQ,CAAA,EACvC,CAAA;AAAA,oBACAZ,gBAAC8C,sBAAA,EAAA,EAAc,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EAChC,QAAA,EAAA;AAAA,sBAAA/C,eAACc,eAAAA,EAAA,EAAO,SAAS,QAAA,EAAU,OAAA,EAAQ,YAChC,QAAA,EAAA,UAAA,EACH,CAAA;AAAA,sBACAd,cAAAA,CAACc,eAAAA,EAAA,EAAO,OAAA,EAAS,SAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,KAAA,EAAO,YAAA,EAAc,SAAA,EAAS,IAAA,EAC3E,QAAA,EAAA,WAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;ACjDO,SAAS,MAAM,OAAA,EAAwD;AAC5E,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACzC;;;ACFO,SAAS,QAAA,CACd,MACA,IAAA,EACkC;AAClC,EAAA,IAAI,SAAA,GAAkD,IAAA;AAEtD,EAAA,OAAO,YAAwB,IAAA,EAAqB;AAClD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAEA,IAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,MAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,IACvB,GAAG,IAAI,CAAA;AAAA,EACT,CAAA;AACF;;;AChBO,SAAS,QAAA,CACd,MACA,IAAA,EACkC;AAClC,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,OAAO,YAAwB,IAAA,EAAqB;AAClD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,GAAA,GAAM,YAAY,IAAA,EAAM;AAC1B,MAAA,QAAA,GAAW,GAAA;AACX,MAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AACF;;;ACdO,SAAS,UAAA,CACd,MACA,OAAA,GAAsC;AAAA,EACpC,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAA,EACQ;AACR,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,SAAS,QAAA,GACxD,IAAI,IAAA,CAAK,IAAI,CAAA,GACb,IAAA;AAEJ,EAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,SAAS,OAAO,CAAA,CAAE,OAAO,OAAO,CAAA;AACjE;;;ACZA,IAAM,WAAA,GAAc,iBAAA;AAuBb,IAAM,cAAA,GAAN,MAAM,eAAA,CAA0C;AAAA,EAM3C,WAAA,CAAY,MAAA,EAAoB,GAAA,GAAM,WAAA,EAAa;AAF3D,IAAA,IAAA,CAAQ,KAAA,GAA+B,IAAA;AAGnC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACf;AAAA,EAEA,OAAO,YAAY,MAAA,EAAoC;AACnD,IAAA,IAAI,CAAC,gBAAe,QAAA,EAAU;AAC1B,MAAA,eAAA,CAAe,QAAA,GAAW,IAAI,eAAA,CAAe,MAAM,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,eAAA,CAAe,QAAA;AAAA,EAC1B;AAAA,EAEA,KAAK,OAAA,EAA+B;AAChC,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA;AACb,IAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AACtC,IAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,WAAW,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,OAAA,EAAwC;AAC1C,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,GAAG,OAAA,EAAQ;AACzC,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA;AACb,IAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AACtC,IAAA,IAAI,QAAQ,WAAA,EAAa;AACrB,MAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,WAAW,CAAA;AAAA,IACzC;AAAA,EACJ;AAAA,EAEA,KAAA,GAAc;AACV,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,YAAA,CAAa,UAAA,CAAW,KAAK,GAAG,CAAA;AAChC,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACxB;AAAA,EAEA,GAAA,GAA6B;AACzB,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA;AACrC,IAAA,IAAA,CAAK,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAwB,IAAA,CAAK,GAAG,CAAA;AAC1D,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,cAAA,GAAqC;AACjC,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,EAAG,WAAA,IAAe,MAAA;AAAA,EACtC;AAAA,EAEA,eAAA,GAAsC;AAClC,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,EAAG,YAAA,IAAgB,MAAA;AAAA,EACvC;AAAA,EAEA,YAAA,GAAmC;AAC/B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,EAAG,SAAA,IAAa,MAAA;AAAA,EACpC;AAAA,EAEA,eAAA,GAA2B;AACvB,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,IAAI,CAAC,OAAA,EAAS,WAAA,EAAa,OAAO,KAAA;AAClC,IAAA,OAAO,OAAO,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA,CAAK,KAAI,GAAI,GAAA;AAAA,EACpD;AAAA,EAEA,UAAA,GAAmB;AACf,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,IAAI,OAAA,EAAS,eAAe,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA,EAAM;AACvE,MAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,WAAW,CAAA;AAAA,IACzC,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACf;AAAA,EACJ;AAAA,EAEQ,aAAa,KAAA,EAAqB;AACtC,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,eAAA,EAAiB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AAAA,EACnE;AAAA,EAEQ,cAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,oBAAoB,eAAe,CAAA;AAAA,EACnD;AAEJ;;;AC/FA,IAAM,QAAA,GAAW,cAAA;AAeV,IAAM,WAAA,GAAN,MAAM,YAAA,CAAoC;AAAA,EAKvC,YAAY,MAAA,EAAoB;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA,CAAe,WAAA,CAAY,MAAM,CAAA;AAAA,EACzD;AAAA,EAEA,OAAO,YAAY,MAAA,EAAiC;AAClD,IAAA,IAAI,CAAC,aAAY,QAAA,EAAU;AACzB,MAAA,YAAA,CAAY,QAAA,GAAW,IAAI,YAAA,CAAY,MAAM,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,YAAA,CAAY,QAAA;AAAA,EACrB;AAAA,EAEA,MAAM,OAAO,OAAA,EAAiD;AAC5D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACjC,GAAG,QAAQ,CAAA,YAAA,CAAA;AAAA,MACX;AAAA,KACF;AACA,IAAA,IAAI,QAAA,CAAS,KAAK,WAAA,EAAa;AAC7B,MAAA,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,aAAa,OAAA,EAAuE;AACxF,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,cAAA,CAAe,eAAA,EAAgB;AACzD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACjC,GAAG,QAAQ,CAAA,aAAA,CAAA;AAAA,MACX,EAAE,YAAA,EAAc,GAAG,OAAA;AAAQ,KAC7B;AAEA,IAAA,IAAI,QAAA,CAAS,KAAK,WAAA,EAAa;AAC7B,MAAA,IAAA,CAAK,eAAe,KAAA,CAAM;AAAA,QACxB,WAAA,EAAa,SAAS,IAAA,CAAK,WAAA;AAAA,QAC3B,YAAA,EAAc,SAAS,IAAA,CAAK;AAAA,OAC7B,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,OAAO,OAAA,EAAiD;AAC5D,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,YAAA,EAAa;AACrD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACjC,GAAG,QAAQ,CAAA,YAAA,CAAA;AAAA,QACX,WAAW;AAAC,OACd;AACA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,OAAA,EAA0E;AACjG,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,MACjC,GAAG,QAAQ,CAAA,iBAAA,CAAA;AAAA,MACX,WAAW;AAAC,KACd;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,qBAAqB,OAAA,EAA+D;AACxF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACjC,GAAG,QAAQ,CAAA,uBAAA,CAAA;AAAA,MACX;AAAA,KACF;AACA,IAAA,IAAI,QAAA,CAAS,KAAK,WAAA,EAAa;AAC7B,MAAA,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,eAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,eAAe,eAAA,EAAgB;AAAA,EAC7C;AAAA,EAEA,cAAA,GAAqC;AACnC,IAAA,OAAO,IAAA,CAAK,eAAe,cAAA,EAAe;AAAA,EAC5C;AAAA,EAEA,iBAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,eAAe,GAAA,EAAI;AAAA,EACjC;AAAA,EAEA,YAAA,GAAmC;AACjC,IAAA,OAAO,IAAA,CAAK,eAAe,YAAA,EAAa;AAAA,EAC1C;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,eAAe,UAAA,EAAW;AAAA,EACjC;AACF","file":"index.js","sourcesContent":["/**\n * Design Tokens - Theme-agnostic values\n * These tokens serve as the foundation for light and dark themes\n * Following Material Design 3 principles\n */\n\n/**\n * Spacing scale based on 4px grid system\n */\nexport const spacing = {\n xs: '0.25rem', // 4px\n sm: '0.5rem', // 8px\n md: '1rem', // 16px\n lg: '1.5rem', // 24px\n xl: '2rem', // 32px\n '2xl': '3rem', // 48px\n '3xl': '4rem', // 64px\n} as const\n\n/**\n * Border radius tokens\n */\nexport const borderRadius = {\n none: '0',\n sm: '0.25rem', // 4px\n md: '0.375rem', // 6px\n lg: '0.5rem', // 8px\n xl: '0.75rem', // 12px\n '2xl': '1rem', // 16px\n full: '9999px',\n} as const\n\n/**\n * Typography scale\n */\nexport const fontSize = {\n xs: '0.75rem', // 12px\n sm: '0.875rem', // 14px\n md: '1rem', // 16px\n lg: '1.125rem', // 18px\n xl: '1.25rem', // 20px\n '2xl': '1.5rem', // 24px\n '3xl': '1.875rem', // 30px\n '4xl': '2.25rem', // 36px\n} as const\n\n/**\n * Font weights\n */\nexport const fontWeight = {\n light: '300',\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n} as const\n\n/**\n * Line heights\n */\nexport const lineHeight = {\n tight: '1.25',\n normal: '1.5',\n relaxed: '1.75',\n} as const\n\n/**\n * Elevation (box shadows) for depth perception\n */\nexport const elevation = {\n none: 'none',\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n} as const\n\n/**\n * Transition durations\n */\nexport const transition = {\n fast: '150ms',\n normal: '250ms',\n slow: '350ms',\n} as const\n\n/**\n * Z-index scale for layering\n */\nexport const zIndex = {\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n modalBackdrop: 1040,\n modal: 1050,\n popover: 1060,\n tooltip: 1070,\n} as const\n","import { spacing, borderRadius, fontSize, fontWeight, lineHeight, elevation, transition, zIndex } from './tokens'\nimport { Theme } from './types'\n\n/**\n * Light theme configuration\n * Colors are WCAG AA compliant with minimum contrast ratio of 4.5:1 for normal text\n * and 3:1 for large text\n */\nexport const lightTheme: Theme = {\n colors: {\n // Primary - Vibrant Indigo (Works beautifully on light backgrounds)\n primary: '#6366f1', // Indigo 500\n primaryHover: '#4f46e5', // Indigo 600\n primaryActive: '#4338ca', // Indigo 700\n\n // Secondary - Gray 600 (WCAG AAA compliant: 7.66:1 on white)\n secondary: '#4b5563',\n secondaryHover: '#374151',\n secondaryActive: '#1f2937',\n\n // Background colors\n background: '#ffffff',\n backgroundSecondary: '#f9fafb',\n backgroundTertiary: '#f3f4f6',\n\n // Surface colors (for cards, modals, etc.)\n surface: '#ffffff',\n surfaceHover: '#f9fafb',\n\n // Text colors (WCAG AAA compliant)\n text: '#111827', // Gray 900 (16.26:1 on white)\n textSecondary: '#4b5563', // Gray 600 (7.66:1 on white)\n textTertiary: '#6b7280', // Gray 500 (4.92:1 on white - AA compliant)\n textDisabled: '#9ca3af', // Gray 400\n\n // Semantic colors\n error: '#dc2626', // Red 600 (6.05:1 on white - AAA compliant)\n errorHover: '#b91c1c',\n errorBackground: '#fef2f2',\n\n success: '#16a34a', // Green 600 (5.15:1 on white - AAA compliant)\n successHover: '#15803d',\n successBackground: '#f0fdf4',\n\n warning: '#d97706', // Amber 600 (5.33:1 on white - AAA compliant)\n warningHover: '#b45309',\n warningBackground: '#fffbeb',\n\n info: '#2563eb', // Blue 600 (6.64:1 on white - AAA compliant)\n infoHover: '#1d4ed8',\n infoBackground: '#eff6ff',\n\n // Border colors\n border: '#e5e7eb', // Gray 200\n borderHover: '#d1d5db', // Gray 300\n borderFocus: '#6366f1', // Primary\n\n // Divider\n divider: '#e5e7eb',\n\n // Overlay (for modals, dropdowns)\n overlay: 'rgba(0, 0, 0, 0.5)',\n },\n\n spacing,\n borderRadius,\n fontSize,\n fontWeight,\n lineHeight,\n elevation,\n transition,\n zIndex,\n}\n","import { spacing, borderRadius, fontSize, fontWeight, lineHeight, elevation, transition, zIndex } from './tokens'\nimport { Theme } from './types'\n\n/**\n * Dark theme configuration\n * Colors are WCAG AA compliant with minimum contrast ratio of 4.5:1 for normal text\n * and 3:1 for large text on dark backgrounds\n */\nexport const darkTheme: Theme = {\n colors: {\n // Primary - Vibrant Indigo (Striking on VSCode Black)\n primary: '#a5b4fc', // Indigo 300 (lighter for better dark mode visibility)\n primaryHover: '#818cf8', // Indigo 400\n primaryActive: '#6366f1', // Indigo 500\n\n // Secondary - VSCode Gray\n secondary: '#858585',\n secondaryHover: '#a6a6a6',\n secondaryActive: '#cccccc',\n\n // Background colors\n background: '#1e1e1e', // Main editor/workspace background\n backgroundSecondary: '#252526', // Sidebar, panels\n backgroundTertiary: '#2d2d2d', // Highlights, smaller surfaces\n\n // Surface colors (for cards, modals, etc.)\n surface: '#252526',\n surfaceHover: '#2a2d2e',\n\n // Text colors\n text: '#cccccc', // Primary text\n textSecondary: '#999999', // Secondary text, comments\n textTertiary: '#6b6b6b', // Disabled/tertiary\n textDisabled: '#4d4d4d', // Disabled\n\n // Semantic colors\n error: '#f48771',\n errorHover: '#fca5a5',\n errorBackground: '#5a1d1d',\n\n success: '#89d185',\n successHover: '#86efac',\n successBackground: '#1e401e',\n\n warning: '#cca700',\n warningHover: '#d7ba7d',\n warningBackground: '#5c4d00',\n\n info: '#75beff',\n infoHover: '#9cdcfe',\n infoBackground: '#0a3254',\n\n // Border colors\n border: '#3c3c3c', // VSCode borders\n borderHover: '#444444',\n borderFocus: '#a5b4fc', // Focus border\n\n // Divider\n divider: '#333333',\n\n // Overlay (for modals, dropdowns)\n overlay: 'rgba(0, 0, 0, 0.4)',\n },\n\n spacing,\n borderRadius,\n fontSize,\n fontWeight,\n lineHeight,\n elevation,\n transition,\n zIndex,\n}\n","/**\n * LocalStorage utility for safely storing and retrieving data\n */\n\nexport class LocalStorage {\n /**\n * Get an item from localStorage\n * @param key - The key to retrieve\n * @returns The value or null if not found or error occurs\n */\n static getItem<T = string>(key: string): T | null {\n try {\n if (typeof window === 'undefined') {\n return null\n }\n \n const item = window.localStorage.getItem(key)\n \n if (item === null) {\n return null\n }\n \n try {\n return JSON.parse(item) as T\n } catch {\n // If JSON parse fails, return as string\n return item as T\n }\n } catch (error) {\n console.error(`Error getting item from localStorage: ${error}`)\n return null\n }\n }\n\n /**\n * Set an item in localStorage\n * @param key - The key to store\n * @param value - The value to store\n * @returns true if successful, false otherwise\n */\n static setItem<T>(key: string, value: T): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n const serializedValue = typeof value === 'string' \n ? value \n : JSON.stringify(value)\n \n window.localStorage.setItem(key, serializedValue)\n return true\n } catch (error) {\n console.error(`Error setting item in localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Remove an item from localStorage\n * @param key - The key to remove\n * @returns true if successful, false otherwise\n */\n static removeItem(key: string): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n window.localStorage.removeItem(key)\n return true\n } catch (error) {\n console.error(`Error removing item from localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Clear all items from localStorage\n * @returns true if successful, false otherwise\n */\n static clear(): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n window.localStorage.clear()\n return true\n } catch (error) {\n console.error(`Error clearing localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Check if a key exists in localStorage\n * @param key - The key to check\n * @returns true if key exists, false otherwise\n */\n static hasItem(key: string): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n return window.localStorage.getItem(key) !== null\n } catch (error) {\n console.error(`Error checking item in localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Get all keys from localStorage\n * @returns Array of keys\n */\n static keys(): string[] {\n try {\n if (typeof window === 'undefined') {\n return []\n }\n \n return Object.keys(window.localStorage)\n } catch (error) {\n console.error(`Error getting keys from localStorage: ${error}`)\n return []\n }\n }\n}\n","import React, { createContext, useState, ReactNode, useCallback, useEffect, useMemo } from 'react'\nimport { Theme, ThemeContextValue, ThemeMode, ResolvedThemeMode } from './types'\nimport { lightTheme } from './light'\nimport { darkTheme } from './dark'\nimport { LocalStorage } from '../utils/localStorage'\nimport { ThemeProvider as MuiThemeProvider, createTheme, CssBaseline } from '@mui/material'\n\nexport const ThemeContext = createContext<ThemeContextValue | undefined>(undefined)\n\nconst THEME_STORAGE_KEY = 'app-theme-mode'\n\nexport interface ThemeProviderProps {\n children: ReactNode\n /** Custom theme object (overrides default light/dark themes) */\n initialTheme?: Theme\n /** Initial theme mode */\n initialMode?: ThemeMode\n /** localStorage key for persisting theme preference */\n storageKey?: string\n /** Enable CSS variables injection */\n enableCssVariables?: boolean\n}\n\n/**\n * Detects system color scheme preference\n */\nconst getSystemTheme = (): ResolvedThemeMode => {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\n/**\n * Applies theme as CSS variables to document root\n */\nconst applyCssVariables = (theme: Theme, resolvedMode: ResolvedThemeMode): void => {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n\n // Set data attribute for theme mode\n root.setAttribute('data-theme', resolvedMode)\n\n // Apply color variables\n Object.entries(theme.colors).forEach(([key, value]) => {\n root.style.setProperty(`--color-${key.replace(/([A-Z])/g, '-$1').toLowerCase()}`, value)\n })\n\n // Apply spacing variables\n Object.entries(theme.spacing).forEach(([key, value]) => {\n root.style.setProperty(`--spacing-${key}`, value)\n })\n\n // Apply border radius variables\n Object.entries(theme.borderRadius).forEach(([key, value]) => {\n root.style.setProperty(`--radius-${key}`, value)\n })\n\n // Apply font size variables\n Object.entries(theme.fontSize).forEach(([key, value]) => {\n root.style.setProperty(`--text-${key}`, value)\n })\n\n // Apply font weight variables\n Object.entries(theme.fontWeight).forEach(([key, value]) => {\n root.style.setProperty(`--font-${key}`, value)\n })\n\n // Apply line height variables\n Object.entries(theme.lineHeight).forEach(([key, value]) => {\n root.style.setProperty(`--leading-${key}`, value)\n })\n\n // Apply elevation variables\n Object.entries(theme.elevation).forEach(([key, value]) => {\n root.style.setProperty(`--shadow-${key}`, value)\n })\n\n // Apply transition variables\n Object.entries(theme.transition).forEach(([key, value]) => {\n root.style.setProperty(`--transition-${key}`, value)\n })\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n initialTheme,\n initialMode = 'system',\n storageKey = THEME_STORAGE_KEY,\n enableCssVariables = true,\n}) => {\n // Load theme mode from localStorage or use initialMode\n const getInitialMode = (): ThemeMode => {\n const savedMode = LocalStorage.getItem<ThemeMode>(storageKey)\n return savedMode || initialMode\n }\n\n const [themeMode, setThemeModeState] = useState<ThemeMode>(getInitialMode)\n const [systemTheme, setSystemTheme] = useState<ResolvedThemeMode>(getSystemTheme)\n const [customTheme, setCustomTheme] = useState<Theme | undefined>(initialTheme)\n\n // Calculate resolved theme mode\n const resolvedThemeMode: ResolvedThemeMode = useMemo(() => {\n if (themeMode === 'system') return systemTheme\n return themeMode as ResolvedThemeMode\n }, [themeMode, systemTheme])\n\n // Get current theme\n const theme: Theme = useMemo(() => {\n if (customTheme) return customTheme\n return resolvedThemeMode === 'light' ? lightTheme : darkTheme\n }, [customTheme, resolvedThemeMode])\n\n // Listen for system theme changes\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n\n const handleChange = (e: MediaQueryListEvent) => {\n setSystemTheme(e.matches ? 'dark' : 'light')\n }\n\n // Modern browsers\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange)\n return () => mediaQuery.removeEventListener('change', handleChange)\n }\n // Legacy browsers\n else if (mediaQuery.addListener) {\n mediaQuery.addListener(handleChange)\n return () => mediaQuery.removeListener(handleChange)\n }\n }, [])\n\n // Apply CSS variables when theme changes\n useEffect(() => {\n if (enableCssVariables) {\n applyCssVariables(theme, resolvedThemeMode)\n }\n }, [theme, resolvedThemeMode, enableCssVariables])\n\n // Save theme mode to localStorage whenever it changes\n useEffect(() => {\n LocalStorage.setItem(storageKey, themeMode)\n }, [themeMode, storageKey])\n\n const setThemeMode = useCallback((mode: ThemeMode) => {\n setThemeModeState(mode)\n }, [])\n\n const setTheme = useCallback((newTheme: Theme) => {\n setCustomTheme(newTheme)\n }, [])\n\n const toggleTheme = useCallback(() => {\n setThemeModeState((prevMode) => {\n if (prevMode === 'light') return 'dark'\n if (prevMode === 'dark') return 'system'\n return 'light'\n })\n }, [])\n\n const contextValue: ThemeContextValue = useMemo(() => ({\n theme,\n themeMode,\n resolvedThemeMode,\n setTheme,\n setThemeMode,\n toggleTheme,\n }), [theme, themeMode, resolvedThemeMode, setTheme, setThemeMode, toggleTheme])\n\n const muiTheme = useMemo(() => createTheme({\n palette: {\n mode: resolvedThemeMode,\n primary: {\n main: theme.colors.primary,\n },\n secondary: {\n main: theme.colors.secondary,\n },\n error: {\n main: theme.colors.error,\n },\n success: {\n main: theme.colors.success,\n },\n background: {\n default: theme.colors.background,\n paper: theme.colors.backgroundSecondary,\n },\n text: {\n primary: theme.colors.text,\n secondary: theme.colors.textSecondary,\n }\n },\n }), [resolvedThemeMode, theme])\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <MuiThemeProvider theme={muiTheme}>\n <CssBaseline />\n {children}\n </MuiThemeProvider>\n </ThemeContext.Provider>\n )\n}\n","import { useContext } from 'react'\nimport { ThemeContext } from './ThemeProvider'\nimport { ThemeContextValue } from './types'\n\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext)\n \n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n \n return context\n}\n","import React from 'react'\nimport { IconButton, IconButtonProps, Tooltip } from '@mui/material'\nimport { DarkMode, LightMode, BrightnessAuto } from '@mui/icons-material'\nimport { useTheme } from './useTheme'\n\nexport interface ThemeToggleProps extends Omit<IconButtonProps, 'onClick'> {\n /**\n * Tooltip text for light mode\n * @default \"Switch to dark mode\"\n */\n lightModeTooltip?: string\n\n /**\n * Tooltip text for dark mode\n * @default \"Switch to system mode\"\n */\n darkModeTooltip?: string\n\n /**\n * Tooltip text for system mode\n * @default \"Switch to light mode\"\n */\n systemModeTooltip?: string\n\n /**\n * Whether to show tooltip\n * @default true\n */\n showTooltip?: boolean\n}\n\n/**\n * A round button component for toggling between light, dark, and system themes\n */\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({\n lightModeTooltip = 'Switch to dark mode',\n darkModeTooltip = 'Switch to system theme',\n systemModeTooltip = 'Switch to light theme',\n showTooltip = true,\n sx,\n ...props\n}) => {\n const { themeMode, toggleTheme } = useTheme()\n\n const getIcon = () => {\n switch (themeMode) {\n case 'light':\n return <LightMode />\n case 'dark':\n return <DarkMode />\n case 'system':\n return <BrightnessAuto />\n default:\n return <BrightnessAuto />\n }\n }\n\n const getTooltip = () => {\n switch (themeMode) {\n case 'light':\n return lightModeTooltip\n case 'dark':\n return darkModeTooltip\n case 'system':\n return systemModeTooltip\n default:\n return lightModeTooltip\n }\n }\n\n const button = (\n <IconButton\n onClick={toggleTheme}\n color=\"inherit\"\n sx={{\n borderRadius: '50%',\n ...sx\n }}\n {...props}\n >\n {getIcon()}\n </IconButton>\n )\n\n if (!showTooltip) {\n return button\n }\n\n return (\n <Tooltip title={getTooltip()} arrow>\n {button}\n </Tooltip>\n )\n}\n","import { Box, Typography, Button } from '@mui/material'\nimport { SentimentDissatisfied } from '@mui/icons-material'\nimport { useNavigate } from 'react-router-dom'\nimport { useTheme } from '../theme'\n\nexport function NotFoundPage() {\n const navigate = useNavigate()\n const { theme } = useTheme()\n\n return (\n <Box\n sx={{\n minHeight: '100vh',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.colors.backgroundSecondary,\n gap: 2,\n textAlign: 'center',\n px: 2,\n }}\n >\n <SentimentDissatisfied sx={{ fontSize: 72, color: 'text.disabled' }} />\n <Typography variant=\"h2\" fontWeight=\"bold\" color=\"text.primary\">\n 404\n </Typography>\n <Typography variant=\"h6\" color=\"text.secondary\">\n Page not found\n </Typography>\n <Typography variant=\"body2\" color=\"text.disabled\" sx={{ maxWidth: 360 }}>\n The page you're looking for doesn't exist or has been moved.\n </Typography>\n <Button\n variant=\"contained\"\n sx={{ mt: 2, textTransform: 'none' }}\n onClick={() => navigate('/', { replace: true })}\n >\n Go to Home\n </Button>\n </Box>\n )\n}\n","import { HttpClientConfig, RequestConfig, HttpResponse, HttpError } from './types'\n\nexport class HttpClient {\n private baseURL: string\n private timeout: number\n private defaultHeaders: Record<string, string>\n\n constructor(config: HttpClientConfig = {}) {\n this.baseURL = config.baseURL || ''\n this.timeout = config.timeout || 30000\n this.defaultHeaders = config.headers || {}\n }\n\n private buildURL(url: string, params?: Record<string, string | number | boolean>): string {\n const fullURL = url.startsWith('http') ? url : `${this.baseURL}${url}`\n \n if (!params) return fullURL\n \n const searchParams = new URLSearchParams()\n Object.entries(params).forEach(([key, value]) => {\n searchParams.append(key, String(value))\n })\n \n return `${fullURL}?${searchParams.toString()}`\n }\n\n private async request<T = any>(\n url: string,\n config: RequestConfig = {}\n ): Promise<HttpResponse<T>> {\n const { params, data, timeout = this.timeout, headers = {}, ...restConfig } = config\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(this.buildURL(url, params), {\n ...restConfig,\n headers: {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...headers,\n },\n body: data ? JSON.stringify(data) : undefined,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const error: HttpError = new Error(`HTTP Error: ${response.statusText}`)\n error.status = response.status\n error.statusText = response.statusText\n try {\n error.data = await response.json()\n } catch {\n error.data = { code: response.status, message: await response.text() }\n }\n throw error\n }\n\n const responseData = await response.json()\n\n return {\n data: responseData as T,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n }\n } catch (error) {\n clearTimeout(timeoutId)\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error('Request timeout')\n }\n throw error\n }\n }\n\n setDefaultHeader(key: string, value: string): void {\n this.defaultHeaders[key] = value\n }\n\n removeDefaultHeader(key: string): void {\n delete this.defaultHeaders[key]\n }\n\n getDefaultHeaders(): Record<string, string> {\n return { ...this.defaultHeaders }\n }\n\n get<T = any>(url: string, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, method: 'GET' })\n }\n\n post<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'POST' })\n }\n\n put<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'PUT' })\n }\n\n patch<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'PATCH' })\n }\n\n delete<T = any>(url: string, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, method: 'DELETE' })\n }\n}\n\nexport function extractErrorMessage(error: any): string {\n if (error instanceof Error) {\n const httpError = error as HttpError\n if (httpError.data) {\n return httpError.data.message\n }\n return error.message\n }\n return 'An unexpected error occurred'\n}\n","import { useEffect } from 'react'\nimport { Box, CircularProgress, Typography } from '@mui/material'\nimport { useNavigate, useSearchParams } from 'react-router-dom'\nimport { extractErrorMessage } from '../http'\nimport { useTheme } from '../theme'\nimport type { IAuthService } from '../auth'\n\nexport interface LoginCallbackPageProps {\n authService: IAuthService\n navigateTo?: string\n onLoginFailed?: () => void\n}\n\nexport function LoginCallbackPage({ authService, navigateTo = '/', onLoginFailed }: LoginCallbackPageProps) {\n const [searchParams] = useSearchParams()\n const navigate = useNavigate()\n const { theme } = useTheme()\n\n useEffect(() => {\n const loginToken = searchParams.get('login_token')\n\n if (!loginToken) {\n console.error('Login callback failed: Missing login_token in query parameters')\n onLoginFailed?.()\n return\n }\n authService\n .signInWithLoginToken({ loginToken })\n .then(() => {\n navigate(navigateTo, { replace: true })\n })\n .catch((err: unknown) => {\n console.error('Login callback failed:', extractErrorMessage(err))\n onLoginFailed?.()\n })\n }, [])\n\n return (\n <Box\n sx={{\n minHeight: '100vh',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n background: `linear-gradient(135deg, ${theme.colors.primary} 0%, ${theme.colors.primaryActive} 100%)`,\n gap: 2,\n }}\n >\n <CircularProgress sx={{ color: theme.colors.surface }} />\n <Typography variant=\"body2\" sx={{ color: theme.colors.surface, opacity: 0.85 }}>\n Signing you in…\n </Typography>\n </Box>\n )\n}\n","import React, { useState, useEffect, ReactNode, CSSProperties } from 'react'\nimport {\n Drawer,\n List,\n ListItem,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n Box,\n Typography,\n Collapse,\n IconButton\n} from '@mui/material'\nimport { ExpandLess, ExpandMore } from '@mui/icons-material'\nimport { BrowserRouter, NavLink, Outlet, useLocation, Routes, Route } from 'react-router-dom'\n\n/**\n * Menu item configuration\n */\nexport interface MenuItem {\n /** Unique identifier */\n id: string\n /** Display label */\n label: string\n /** Optional icon element */\n icon?: ReactNode\n /** Route path (for router mode) */\n path?: string\n /** Component to render (for non-router mode) */\n component?: ReactNode\n /** Optional submenu items */\n children?: MenuItem[]\n}\n\nexport interface SidebarLayoutProps {\n /** Array of menu items */\n menuItems: MenuItem[]\n /** Width of the sidebar */\n sidebarWidth?: string | number\n /** Additional CSS class for container */\n className?: string\n /** Default selected menu item ID (for non-router mode) */\n defaultSelected?: string\n /** Callback when menu changes */\n onMenuChange?: (id: string) => void\n /** Custom styles for container */\n style?: CSSProperties\n /** Custom styles for sidebar */\n sidebarStyle?: CSSProperties\n /** Custom styles for body */\n bodyStyle?: CSSProperties\n /** Default expanded submenu IDs */\n defaultExpanded?: string[]\n /** If true, wraps SidebarLayout in BrowserRouter and enables router-based navigation */\n isRouter?: boolean\n}\n\n\n\n/**\n * Recursive menu item renderer for router mode\n */\nconst RouterMenuItem: React.FC<{\n item: MenuItem\n depth?: number\n expanded: Set<string>\n onToggle: (id: string) => void\n}> = ({ item, depth = 0, expanded, onToggle }) => {\n const hasChildren = item.children && item.children.length > 0\n const isExpanded = expanded.has(item.id)\n\n return (\n <>\n <ListItem disablePadding>\n <ListItemButton\n component={hasChildren ? 'div' : NavLink}\n to={!hasChildren ? (item.path || `/${item.id}`) : undefined}\n end={false}\n onClick={hasChildren ? () => onToggle(item.id) : undefined}\n sx={{\n pl: 2 + depth * 2,\n '&.active': {\n backgroundColor: 'action.selected',\n color: 'primary.main',\n borderLeft: 3,\n borderColor: 'primary.main',\n fontWeight: 'medium',\n '& .MuiListItemIcon-root': {\n color: 'primary.main',\n },\n },\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n transition: 'all 0.15s',\n }}\n >\n {item.icon && (\n <ListItemIcon sx={{ minWidth: 40 }}>\n {item.icon}\n </ListItemIcon>\n )}\n <ListItemText\n primary={item.label}\n primaryTypographyProps={{\n fontSize: '0.875rem',\n }}\n />\n {hasChildren && (\n <IconButton size=\"small\" sx={{ p: 0 }}>\n {isExpanded ? <ExpandLess /> : <ExpandMore />}\n </IconButton>\n )}\n </ListItemButton>\n </ListItem>\n {hasChildren && (\n <Collapse in={isExpanded} timeout=\"auto\" unmountOnExit>\n <List component=\"div\" disablePadding>\n {item.children!.map((child) => (\n <RouterMenuItem\n key={child.id}\n item={child}\n depth={depth + 1}\n expanded={expanded}\n onToggle={onToggle}\n />\n ))}\n </List>\n </Collapse>\n )}\n </>\n )\n}\n\n/**\n * Helper to flatten menu items into routes\n */\nconst flattenMenuRoutes = (items: MenuItem[]): Array<{ path: string; component: ReactNode }> => {\n const routes: Array<{ path: string; component: ReactNode }> = []\n\n const flatten = (menuItems: MenuItem[]) => {\n for (const item of menuItems) {\n if (item.path && item.component) {\n routes.push({ path: item.path, component: item.component })\n }\n if (item.children) {\n flatten(item.children)\n }\n }\n }\n\n flatten(items)\n return routes\n}\n\n/**\n * Inner component for Router-based Sidebar Layout\n * (Must be rendered inside a Router context to use useLocation)\n */\nconst SidebarLayoutRouterInner: React.FC<SidebarLayoutProps> = ({\n menuItems,\n sidebarWidth = 250,\n className = '',\n onMenuChange,\n style,\n sidebarStyle,\n bodyStyle,\n defaultExpanded = [],\n}) => {\n const location = useLocation()\n const [expanded, setExpanded] = useState<Set<string>>(new Set(defaultExpanded))\n\n const handleToggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }\n\n useEffect(() => {\n if (onMenuChange) {\n const findActiveItem = (items: MenuItem[]): MenuItem | undefined => {\n for (const item of items) {\n if (item.path && location.pathname === item.path) {\n return item\n }\n if (item.children) {\n const found = findActiveItem(item.children)\n if (found) return found\n }\n }\n return undefined\n }\n\n const activeItem = findActiveItem(menuItems)\n if (activeItem) {\n onMenuChange(activeItem.id)\n }\n }\n }, [location.pathname, menuItems, onMenuChange])\n\n // Check if menu items have components - if so, render routes internally\n const hasComponents = menuItems.some(item =>\n item.component || (item.children?.some(child => child.component))\n )\n\n const routes = hasComponents ? flattenMenuRoutes(menuItems) : []\n\n return (\n <Box\n className={className}\n sx={{\n display: 'flex',\n height: '100%',\n width: '100%',\n ...style,\n }}\n >\n <Drawer\n variant=\"permanent\"\n sx={{\n width: sidebarWidth,\n flexShrink: 0,\n '& .MuiDrawer-paper': {\n width: sidebarWidth,\n boxSizing: 'border-box',\n position: 'relative',\n borderRight: '1px solid',\n borderColor: 'divider',\n ...sidebarStyle,\n },\n }}\n >\n <List sx={{ p: 0 }}>\n {menuItems.filter(item => item.label).map((item) => (\n <RouterMenuItem\n key={item.id}\n item={item}\n expanded={expanded}\n onToggle={handleToggle}\n />\n ))}\n </List>\n </Drawer>\n\n <Box\n component=\"main\"\n sx={{\n flexGrow: 1,\n overflow: 'auto',\n ...bodyStyle,\n }}\n >\n {hasComponents ? (\n <Routes>\n {routes.map(({ path, component }) => (\n <Route\n key={path}\n path={path}\n element={component}\n />\n ))}\n </Routes>\n ) : (\n <Outlet />\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * Wrapper for Router-based Sidebar Layout\n */\nconst SidebarLayoutWithRouter: React.FC<SidebarLayoutProps> = (props) => {\n return (\n // @ts-expect-error - future prop exists in v6 for v7 migration, but is removed from v7 types\n <BrowserRouter future={{ v7_startTransition: true, v7_relativeSplatPath: true }}>\n <SidebarLayoutRouterInner {...props} />\n </BrowserRouter>\n )\n}\n\n/**\n * Recursive menu item renderer for state mode\n */\nconst StateMenuItem: React.FC<{\n item: MenuItem\n selectedId: string\n depth?: number\n expanded: Set<string>\n onToggle: (id: string) => void\n onClick: (id: string) => void\n}> = ({ item, selectedId, depth = 0, expanded, onToggle, onClick }) => {\n const hasChildren = item.children && item.children.length > 0\n const isExpanded = expanded.has(item.id)\n const isActive = item.id === selectedId\n\n const handleClick = () => {\n if (hasChildren) {\n onToggle(item.id)\n } else {\n onClick(item.id)\n }\n }\n\n return (\n <>\n <ListItem disablePadding>\n <ListItemButton\n selected={isActive}\n onClick={handleClick}\n sx={{\n pl: 2 + depth * 2,\n '&.Mui-selected': {\n backgroundColor: 'action.selected',\n color: 'primary.main',\n borderLeft: 3,\n borderColor: 'primary.main',\n fontWeight: 'medium',\n '& .MuiListItemIcon-root': {\n color: 'primary.main',\n },\n '&:hover': {\n backgroundColor: 'action.selected',\n },\n },\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n transition: 'all 0.15s',\n }}\n >\n {item.icon && (\n <ListItemIcon sx={{ minWidth: 40 }}>\n {item.icon}\n </ListItemIcon>\n )}\n <ListItemText\n primary={item.label}\n primaryTypographyProps={{\n fontSize: '0.875rem',\n }}\n />\n {hasChildren && (\n <IconButton size=\"small\" sx={{ p: 0 }}>\n {isExpanded ? <ExpandLess /> : <ExpandMore />}\n </IconButton>\n )}\n </ListItemButton>\n </ListItem>\n {hasChildren && (\n <Collapse in={isExpanded} timeout=\"auto\" unmountOnExit>\n <List component=\"div\" disablePadding>\n {item.children!.map((child) => (\n <StateMenuItem\n key={child.id}\n item={child}\n selectedId={selectedId}\n depth={depth + 1}\n expanded={expanded}\n onToggle={onToggle}\n onClick={onClick}\n />\n ))}\n </List>\n </Collapse>\n )}\n </>\n )\n}\n\n/**\n * State-based Sidebar Layout Component (Fallback)\n */\nconst SidebarLayoutWithState: React.FC<SidebarLayoutProps> = ({\n menuItems,\n sidebarWidth = 250,\n className = '',\n defaultSelected,\n onMenuChange,\n style,\n sidebarStyle,\n bodyStyle,\n defaultExpanded = [],\n}) => {\n const [selectedId, setSelectedId] = useState<string>(\n defaultSelected || menuItems[0]?.id\n )\n const [expanded, setExpanded] = useState<Set<string>>(new Set(defaultExpanded))\n\n const handleToggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }\n\n const handleMenuClick = (id: string) => {\n setSelectedId(id)\n if (onMenuChange) {\n onMenuChange(id)\n }\n }\n\n const findActiveItem = (items: MenuItem[], id: string): MenuItem | undefined => {\n for (const item of items) {\n if (item.id === id) return item\n if (item.children) {\n const found = findActiveItem(item.children, id)\n if (found) return found\n }\n }\n return undefined\n }\n\n const activeItem = findActiveItem(menuItems, selectedId)\n\n return (\n <Box\n className={className}\n sx={{\n display: 'flex',\n height: '100%',\n width: '100%',\n ...style,\n }}\n >\n <Drawer\n variant=\"permanent\"\n sx={{\n width: sidebarWidth,\n flexShrink: 0,\n '& .MuiDrawer-paper': {\n width: sidebarWidth,\n boxSizing: 'border-box',\n position: 'relative',\n borderRight: '1px solid',\n borderColor: 'divider',\n ...sidebarStyle,\n },\n }}\n >\n <List sx={{ p: 0 }}>\n {menuItems.filter(item => item.label).map((item) => (\n <StateMenuItem\n key={item.id}\n item={item}\n selectedId={selectedId}\n expanded={expanded}\n onToggle={handleToggle}\n onClick={handleMenuClick}\n />\n ))}\n </List>\n </Drawer>\n\n <Box\n component=\"main\"\n sx={{\n flexGrow: 1,\n overflow: 'auto',\n p: 3,\n ...bodyStyle,\n }}\n >\n {activeItem?.component || (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ textAlign: 'center', mt: 4 }}\n >\n No content available for this menu item\n </Typography>\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * SidebarLayout Component\n * \n * A flexible sidebar-body layout component built with Material UI that supports \n * both router-based and state-based navigation with nested submenu support.\n * \n * **Uses Material UI Components:**\n * - Drawer (permanent variant)\n * - List, ListItem, ListItemButton\n * - ListItemIcon, ListItemText\n * - Collapse (for submenus)\n * - Box for layout\n * \n * **Features:**\n * - Nested submenu support with expand/collapse\n * - Material UI icons (ExpandMore/ExpandLess)\n * - Recursive rendering for deep nesting\n * - Automatic indentation based on depth\n * \n * **Router Mode** (when react-router-dom is available):\n * - Uses NavLink for navigation\n * - Renders child routes via Outlet\n * - Supports URL-based navigation\n * - Browser back/forward works\n * \n * **State Mode** (fallback):\n * - Uses internal state\n * - Renders components from menuItems\n * - Simple navigation without routing\n * \n * @example\n * // With nested submenus\n * <SidebarLayout\n * menuItems={[\n * {\n * id: 'products',\n * label: 'Products',\n * icon: <ShoppingCartIcon />,\n * children: [\n * { id: 'all-products', label: 'All Products', path: '/products/all' },\n * { id: 'categories', label: 'Categories', path: '/products/categories' }\n * ]\n * },\n * { id: 'dashboard', label: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> }\n * ]}\n * defaultExpanded={['products']}\n * />\n * \n * @example\n * // With React Router\n * <Routes>\n * <Route path=\"/\" element={\n * <SidebarLayout menuItems={[\n * { id: 'dashboard', label: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> },\n * { id: 'settings', label: 'Settings', path: '/settings', icon: <SettingsIcon /> }\n * ]} />\n * }>\n * <Route path=\"dashboard\" element={<Dashboard />} />\n * <Route path=\"settings\" element={<Settings />} />\n * </Route>\n * </Routes>\n * \n * @example\n * // Without React Router (State-based)\n * <SidebarLayout\n * menuItems={[\n * { id: 'dashboard', label: 'Dashboard', component: <Dashboard /> },\n * { id: 'settings', label: 'Settings', component: <Settings /> }\n * ]}\n * defaultSelected=\"dashboard\"\n * />\n */\nexport const SidebarLayout: React.FC<SidebarLayoutProps> = (props) => {\n // If explicitly requested to be a router, or implicitly requested because items have paths\n // AND NOT explicitly disabling the router.\n if (props.isRouter) {\n return <SidebarLayoutWithRouter {...props} />\n }\n\n return <SidebarLayoutWithState {...props} />\n}\n","import { createHighlighter, Highlighter } from 'shiki';\n\nlet highlighterInstance: Highlighter | null = null;\nlet highlighterPromise: Promise<Highlighter> | null = null;\n\nexport const getHighlighter = async (): Promise<Highlighter> => {\n if (highlighterInstance) {\n return highlighterInstance;\n }\n\n if (highlighterPromise) {\n return highlighterPromise;\n }\n\n highlighterPromise = createHighlighter({\n themes: ['github-light', 'github-dark'],\n langs: ['js', 'ts', 'go', 'json', 'bash', 'yaml', 'md', 'python', 'java', 'cpp', 'c', 'html', 'css', 'sql', 'http', 'text'],\n }).then(highlighter => {\n highlighterInstance = highlighter;\n return highlighter;\n });\n\n return highlighterPromise;\n};\n","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport { Highlighter } from 'shiki';\nimport './github-markdown.css';\nimport 'katex/dist/katex.min.css';\n\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { getHighlighter } from './shikiHighlighter';\n\ninterface ReadmeViewerProps {\n content: string;\n className?: string;\n isDark?: boolean;\n muiTheme?: any;\n}\n\nconst ReadmeViewer: React.FC<ReadmeViewerProps> = ({\n content,\n className = '',\n isDark: propIsDark,\n muiTheme,\n}) => {\n const isDark = propIsDark !== undefined ? propIsDark : (muiTheme?.palette?.mode === 'dark');\n const [highlighter, setHighlighter] = useState<Highlighter | null>(null);\n const [copiedBlocks, setCopiedBlocks] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n getHighlighter().then(setHighlighter);\n }, []);\n\n const copyToClipboard = async (text: string, blockId: string) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopiedBlocks(prev => new Set(prev).add(blockId));\n setTimeout(() => {\n setCopiedBlocks(prev => {\n const newSet = new Set(prev);\n newSet.delete(blockId);\n return newSet;\n });\n }, 2000);\n } catch (err) {\n console.error('Failed to copy text: ', err);\n }\n };\n\n\n return (\n <div className={`readme-viewer markdown-body ${className}`}>\n <style>{`\n .shiki-wrapper pre.shiki {\n padding: 16px !important;\n border-radius: 8px !important;\n overflow-x: auto;\n margin-bottom: 16px;\n border: 1px solid var(--md-sys-color-outline-variant, #e0e0e0);\n }\n `}</style>\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeKatex]}\n components={{\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || '');\n\n if (match && highlighter) {\n const codeText = String(children).replace(/\\n$/, '');\n const blockId = `code-${Math.random().toString(36).substr(2, 9)}`;\n\n let highlightedHtml = '';\n try {\n highlightedHtml = highlighter.codeToHtml(codeText, {\n lang: match[1],\n theme: isDark ? 'github-dark' : 'github-light',\n });\n } catch (e) {\n // Graceful fallback if language is unsupported by shiki\n try {\n highlightedHtml = highlighter.codeToHtml(codeText, {\n lang: 'text',\n theme: isDark ? 'github-dark' : 'github-light',\n });\n } catch (fallbackError) {\n // Ultimate fallback to just safely escaping text\n highlightedHtml = `<pre><code>${codeText}</code></pre>`;\n }\n }\n\n return (\n <div style={{ position: 'relative' }}>\n <div className=\"shiki-wrapper\" dangerouslySetInnerHTML={{ __html: highlightedHtml }} />\n <button\n onClick={() => copyToClipboard(codeText, blockId)}\n style={{\n position: 'absolute',\n top: '8px',\n right: '8px',\n backgroundColor: 'var(--md-sys-color-surface-container-high)',\n border: '1px solid var(--md-sys-color-outline-variant)',\n borderRadius: '4px',\n padding: '6px',\n fontSize: '14px',\n cursor: 'pointer',\n color: 'var(--md-sys-color-on-surface-variant)',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s ease',\n width: '32px',\n height: '32px',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = isDark\n ? 'var(--md-sys-color-surface-container-highest)'\n : 'var(--md-sys-color-surface-container-high)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = isDark\n ? 'var(--md-sys-color-surface-container-high)'\n : 'var(--md-sys-color-surface-container-highest)';\n }}\n title={copiedBlocks.has(blockId) ? 'Copied!' : 'Copy code'}\n >\n {copiedBlocks.has(blockId) ? (\n <CheckIcon style={{ fontSize: '16px' }} />\n ) : (\n <ContentCopyIcon style={{ fontSize: '16px' }} />\n )}\n </button>\n </div>\n );\n }\n\n return (\n <code className={className} {...props}>\n {children}\n </code>\n );\n },\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n};\n\nexport default ReadmeViewer;\n","import React, { createContext, useContext, useState, ReactNode, useCallback } from 'react'\nimport { Snackbar, Alert, AlertColor } from '@mui/material'\n\n/**\n * Notification type representing a toast message\n */\nexport interface Notification {\n id: string\n message: string\n type: AlertColor\n duration?: number\n}\n\n/**\n * Context interface for notification management\n */\nexport interface NotificationContextType {\n showNotification: (message: string, type: AlertColor, duration?: number) => void\n success: (message: string, duration?: number) => void\n error: (message: string, duration?: number) => void\n warning: (message: string, duration?: number) => void\n info: (message: string, duration?: number) => void\n}\n\nconst NotificationContext = createContext<NotificationContextType | undefined>(undefined)\n\nexport interface NotificationProviderProps {\n /** Components to wrap with notification context */\n children: ReactNode\n /** Default duration for notifications in milliseconds. Defaults to 6000ms */\n defaultDuration?: number\n /** Maximum number of notifications to show at once. Defaults to 3 */\n maxNotifications?: number\n /** Position of the notifications. Defaults to top-right */\n anchorOrigin?: {\n vertical: 'top' | 'bottom'\n horizontal: 'left' | 'center' | 'right'\n }\n}\n\n/**\n * NotificationProvider manages toast notifications using Material-UI Snackbar and Alert.\n * Provides methods to show success, error, warning, and info notifications.\n * \n * @example\n * ```tsx\n * <NotificationProvider>\n * <App />\n * </NotificationProvider>\n * ```\n * \n * // In a component:\n * ```tsx\n * const { success, error } = useNotification()\n * success('Operation completed!')\n * error('Something went wrong')\n * ```\n */\nexport const NotificationProvider: React.FC<NotificationProviderProps> = ({\n children,\n defaultDuration = 6000,\n maxNotifications = 3,\n anchorOrigin = { vertical: 'top', horizontal: 'right' }\n}) => {\n const [notifications, setNotifications] = useState<Notification[]>([])\n\n const showNotification = useCallback((\n message: string,\n type: AlertColor,\n duration: number = defaultDuration\n ) => {\n const id = `${Date.now()}-${Math.random()}`\n const newNotification: Notification = { id, message, type, duration }\n\n setNotifications((prev) => {\n // Limit the number of notifications\n const updated = [...prev, newNotification]\n if (updated.length > maxNotifications) {\n return updated.slice(updated.length - maxNotifications)\n }\n return updated\n })\n }, [defaultDuration, maxNotifications])\n\n const handleClose = useCallback((id: string) => {\n setNotifications((prev) => prev.filter((notif) => notif.id !== id))\n }, [])\n\n const success = useCallback((message: string, duration?: number) => {\n showNotification(message, 'success', duration)\n }, [showNotification])\n\n const error = useCallback((message: string, duration?: number) => {\n showNotification(message, 'error', duration)\n }, [showNotification])\n\n const warning = useCallback((message: string, duration?: number) => {\n showNotification(message, 'warning', duration)\n }, [showNotification])\n\n const info = useCallback((message: string, duration?: number) => {\n showNotification(message, 'info', duration)\n }, [showNotification])\n\n const contextValue: NotificationContextType = {\n showNotification,\n success,\n error,\n warning,\n info\n }\n\n return (\n <NotificationContext.Provider value={contextValue}>\n {children}\n {notifications.map((notification, index) => (\n <Snackbar\n key={notification.id}\n open={true}\n autoHideDuration={notification.duration}\n onClose={() => handleClose(notification.id)}\n anchorOrigin={anchorOrigin}\n style={{\n marginTop: index * 70 // Stack notifications vertically\n }}\n >\n <Alert\n onClose={() => handleClose(notification.id)}\n severity={notification.type}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {notification.message}\n </Alert>\n </Snackbar>\n ))}\n </NotificationContext.Provider>\n )\n}\n\n/**\n * Hook to access notification context\n * Must be used within a NotificationProvider\n * \n * @example\n * ```tsx\n * const { success, error, warning, info } = useNotification()\n * \n * // Show notifications\n * success('Data saved successfully!')\n * error('Failed to save data')\n * warning('This action cannot be undone')\n * info('New update available')\n * \n * // With custom duration\n * success('Quick message', 3000)\n * ```\n */\nexport const useNotification = (): NotificationContextType => {\n const context = useContext(NotificationContext)\n if (!context) {\n throw new Error('useNotification must be used within a NotificationProvider')\n }\n return context\n}\n","import {\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Typography,\n} from '@mui/material'\nimport WarningAmberIcon from '@mui/icons-material/WarningAmber'\nimport { Box } from '@mui/material'\n\nexport interface ConfirmDialogProps {\n open: boolean\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n confirmColor?: 'primary' | 'error' | 'warning' | 'success'\n onConfirm: () => void\n onCancel: () => void\n}\n\nexport const ConfirmDialog = ({\n open,\n title,\n message,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n confirmColor = 'primary',\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) => {\n return (\n <Dialog open={open} onClose={onCancel} maxWidth=\"xs\" fullWidth slotProps={{ paper: { sx: { borderRadius: 4 } } }}>\n <DialogTitle>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <WarningAmberIcon color={confirmColor} />\n {title}\n </Box>\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\">{message}</Typography>\n </DialogContent>\n <DialogActions sx={{ px: 3, pb: 2 }}>\n <Button onClick={onCancel} variant=\"outlined\">\n {cancelText}\n </Button>\n <Button onClick={onConfirm} variant=\"contained\" color={confirmColor} autoFocus>\n {confirmText}\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n\nexport default ConfirmDialog\n","/**\n * Merges class names together\n * Useful for conditional className composition\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n","/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n timeoutId = setTimeout(() => {\n func.apply(this, args)\n }, wait)\n }\n}\n","/**\n * Creates a throttled function that only invokes func at most once per every wait milliseconds\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now()\n \n if (now - lastCall >= wait) {\n lastCall = now\n func.apply(this, args)\n }\n }\n}\n","/**\n * Formats a date to a readable string\n */\nexport function formatDate(\n date: Date | string | number,\n options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n }\n): string {\n const dateObj = typeof date === 'string' || typeof date === 'number' \n ? new Date(date) \n : date\n\n return new Intl.DateTimeFormat('en-US', options).format(dateObj)\n}\n","import { LocalStorage } from \"../utils\";\nimport { HttpClient } from '../http'\nimport type { SignInResponse } from './struct'\n\nconst SESSION_KEY = 'session_details'\n\nexport interface ISessionManager {\n /** Persist session to localStorage and set the auth header. */\n save(session: SignInResponse): void\n /** Partially update stored session fields (e.g. after token refresh). */\n patch(updates: Partial<SignInResponse>): void\n /** Clear session from localStorage and remove the auth header. */\n clear(): void\n /** Return the full stored session, or null if absent / unparseable. */\n get(): SignInResponse | null\n /** Return the stored access token, or undefined. */\n getAccessToken(): string | undefined\n /** Return the stored refresh token, or undefined. */\n getRefreshToken(): string | undefined\n /** Return the session UUID, or undefined. */\n getSessionId(): string | undefined\n /** True when a non-expired access token is stored. */\n isAuthenticated(): boolean\n /** Called on app startup: restore the auth header or wipe an expired session. */\n initialize(): void\n}\n\nexport class SessionManager implements ISessionManager {\n private static instance: SessionManager\n private readonly key: string\n private readonly client: HttpClient\n private cache: SignInResponse | null = null\n\n private constructor(client: HttpClient, key = SESSION_KEY) {\n this.client = client\n this.key = key\n }\n\n static getInstance(client: HttpClient): SessionManager {\n if (!SessionManager.instance) {\n SessionManager.instance = new SessionManager(client)\n }\n return SessionManager.instance\n }\n\n save(session: SignInResponse): void {\n this.cache = session\n LocalStorage.setItem(this.key, session)\n this.setAuthToken(session.accessToken)\n }\n\n patch(updates: Partial<SignInResponse>): void {\n const current = this.get()\n if (!current) return\n const updated = { ...current, ...updates }\n this.cache = updated\n LocalStorage.setItem(this.key, updated)\n if (updates.accessToken) {\n this.setAuthToken(updates.accessToken)\n }\n }\n\n clear(): void {\n this.cache = null\n LocalStorage.removeItem(this.key)\n this.clearAuthToken()\n }\n\n get(): SignInResponse | null {\n if (this.cache !== null) return this.cache\n this.cache = LocalStorage.getItem<SignInResponse>(this.key)\n return this.cache\n }\n\n getAccessToken(): string | undefined {\n return this.get()?.accessToken || undefined\n }\n\n getRefreshToken(): string | undefined {\n return this.get()?.refreshToken || undefined\n }\n\n getSessionId(): string | undefined {\n return this.get()?.sessionId || undefined\n }\n\n isAuthenticated(): boolean {\n const session = this.get()\n if (!session?.accessToken) return false\n return Number(session.expiresAt) > Date.now() / 1000\n }\n\n initialize(): void {\n const session = this.get()\n if (session?.accessToken && Number(session.expiresAt) > Date.now() / 1000) {\n this.setAuthToken(session.accessToken)\n } else {\n this.clear()\n }\n }\n\n private setAuthToken(token: string): void {\n this.client.setDefaultHeader('Authorization', `Bearer ${token}`)\n }\n\n private clearAuthToken(): void {\n this.client.removeDefaultHeader('Authorization')\n }\n\n}\n","import { HttpClient } from '../http'\nimport { SessionManager } from './sessionManager'\nimport type {\n SignInRequest,\n SignInResponse,\n RefreshTokenRequest,\n RefreshTokenResponse,\n LogoutRequest,\n LogoutResponse,\n GenerateLoginTokenRequest,\n GenerateLoginTokenResponse,\n SignInWithLoginTokenRequest,\n} from './struct'\n\nconst BASE_URL = '/openauth/v1'\n\nexport interface IAuthService {\n signIn(request: SignInRequest): Promise<SignInResponse>\n refreshToken(request?: Partial<RefreshTokenRequest>): Promise<RefreshTokenResponse>\n logout(request: LogoutRequest): Promise<LogoutResponse>\n generateLoginToken(request?: GenerateLoginTokenRequest): Promise<GenerateLoginTokenResponse>\n signInWithLoginToken(request: SignInWithLoginTokenRequest): Promise<SignInResponse>\n isAuthenticated(): boolean\n getAccessToken(): string | undefined\n getSessionDetails(): SignInResponse | null\n getSessionId(): string | undefined\n initializeAuth(): void\n}\n\nexport class AuthService implements IAuthService {\n private static instance: AuthService\n private readonly client: HttpClient\n private readonly sessionManager: SessionManager\n\n private constructor(client: HttpClient) {\n this.client = client\n this.sessionManager = SessionManager.getInstance(client)\n }\n\n static getInstance(client: HttpClient): AuthService {\n if (!AuthService.instance) {\n AuthService.instance = new AuthService(client)\n }\n return AuthService.instance\n }\n\n async signIn(request: SignInRequest): Promise<SignInResponse> {\n const response = await this.client.post<SignInResponse>(\n `${BASE_URL}/auth/signin`,\n request\n )\n if (response.data.accessToken) {\n this.sessionManager.save(response.data)\n }\n return response.data\n }\n\n async refreshToken(request?: Partial<RefreshTokenRequest>): Promise<RefreshTokenResponse> {\n const refreshToken = this.sessionManager.getRefreshToken()\n if (!refreshToken) {\n throw new Error('No refresh token available')\n }\n\n const response = await this.client.post<RefreshTokenResponse>(\n `${BASE_URL}/auth/refresh`,\n { refreshToken, ...request }\n )\n\n if (response.data.accessToken) {\n this.sessionManager.patch({\n accessToken: response.data.accessToken,\n refreshToken: response.data.refreshToken,\n })\n }\n\n return response.data\n }\n\n async logout(request: LogoutRequest): Promise<LogoutResponse> {\n try {\n request.sessionId = this.sessionManager.getSessionId()\n const response = await this.client.post<LogoutResponse>(\n `${BASE_URL}/auth/logout`,\n request || {}\n )\n return response.data\n } finally {\n this.sessionManager.clear()\n }\n }\n\n async generateLoginToken(request?: GenerateLoginTokenRequest): Promise<GenerateLoginTokenResponse> {\n const response = await this.client.put<GenerateLoginTokenResponse>(\n `${BASE_URL}/auth/login-token`,\n request ?? {}\n )\n return response.data\n }\n\n async signInWithLoginToken(request: SignInWithLoginTokenRequest): Promise<SignInResponse> {\n const response = await this.client.post<SignInResponse>(\n `${BASE_URL}/auth/signin-with-token`,\n request\n )\n if (response.data.accessToken) {\n this.sessionManager.save(response.data)\n }\n return response.data\n }\n\n isAuthenticated(): boolean {\n return this.sessionManager.isAuthenticated()\n }\n\n getAccessToken(): string | undefined {\n return this.sessionManager.getAccessToken()\n }\n\n getSessionDetails(): SignInResponse | null {\n return this.sessionManager.get()\n }\n\n getSessionId(): string | undefined {\n return this.sessionManager.getSessionId()\n }\n\n initializeAuth(): void {\n this.sessionManager.initialize()\n }\n}"]}
1
+ {"version":3,"sources":["../src/theme/tokens.ts","../src/theme/light.ts","../src/theme/dark.ts","../src/utils/localStorage.ts","../src/theme/ThemeProvider.tsx","../src/theme/useTheme.ts","../src/theme/ThemeToggle.tsx","../src/components/NotFoundPage.tsx","../src/http/HttpClient.ts","../src/components/LoginCallbackPage.tsx","../src/components/SidebarLayout.tsx","../src/components/ReadmeViewer/shikiHighlighter.ts","../src/components/ReadmeViewer/ReadmeViewer.tsx","../src/components/NotificationProvider/NotificationProvider.tsx","../src/components/ConfirmDialog.tsx","../src/utils/cn.ts","../src/utils/debounce.ts","../src/utils/throttle.ts","../src/utils/formatDate.ts","../src/auth/sessionManager.ts","../src/auth/authService.ts"],"names":["createContext","useState","useMemo","useEffect","useCallback","createTheme","jsx","jsxs","MuiThemeProvider","CssBaseline","useContext","LightMode","DarkMode","BrightnessAuto","IconButton","Tooltip","useNavigate","Box","SentimentDissatisfied","Typography","Button","useSearchParams","CircularProgress","Fragment","ListItem","ListItemButton","NavLink","ListItemIcon","ListItemText","ExpandLess","ExpandMore","Collapse","List","useLocation","Drawer","Routes","Route","Outlet","BrowserRouter","createHighlighter","ReactMarkdown","remarkGfm","remarkMath","rehypeKatex","className","CheckIcon","ContentCopyIcon","Snackbar","Alert","Dialog","DialogTitle","WarningAmberIcon","DialogContent","DialogActions"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Design Tokens - Theme-agnostic values\n * These tokens serve as the foundation for light and dark themes\n * Following Material Design 3 principles\n */\n\n/**\n * Spacing scale based on 4px grid system\n */\nexport const spacing = {\n xs: '0.25rem', // 4px\n sm: '0.5rem', // 8px\n md: '1rem', // 16px\n lg: '1.5rem', // 24px\n xl: '2rem', // 32px\n '2xl': '3rem', // 48px\n '3xl': '4rem', // 64px\n} as const\n\n/**\n * Border radius tokens\n */\nexport const borderRadius = {\n none: '0',\n sm: '0.25rem', // 4px\n md: '0.375rem', // 6px\n lg: '0.5rem', // 8px\n xl: '0.75rem', // 12px\n '2xl': '1rem', // 16px\n full: '9999px',\n} as const\n\n/**\n * Typography scale\n */\nexport const fontSize = {\n xs: '0.75rem', // 12px\n sm: '0.875rem', // 14px\n md: '1rem', // 16px\n lg: '1.125rem', // 18px\n xl: '1.25rem', // 20px\n '2xl': '1.5rem', // 24px\n '3xl': '1.875rem', // 30px\n '4xl': '2.25rem', // 36px\n} as const\n\n/**\n * Font weights\n */\nexport const fontWeight = {\n light: '300',\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n} as const\n\n/**\n * Line heights\n */\nexport const lineHeight = {\n tight: '1.25',\n normal: '1.5',\n relaxed: '1.75',\n} as const\n\n/**\n * Elevation (box shadows) for depth perception\n */\nexport const elevation = {\n none: 'none',\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n} as const\n\n/**\n * Transition durations\n */\nexport const transition = {\n fast: '150ms',\n normal: '250ms',\n slow: '350ms',\n} as const\n\n/**\n * Z-index scale for layering\n */\nexport const zIndex = {\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n modalBackdrop: 1040,\n modal: 1050,\n popover: 1060,\n tooltip: 1070,\n} as const\n","import { spacing, borderRadius, fontSize, fontWeight, lineHeight, elevation, transition, zIndex } from './tokens'\nimport { Theme } from './types'\n\n/**\n * Light theme configuration\n * Colors are WCAG AA compliant with minimum contrast ratio of 4.5:1 for normal text\n * and 3:1 for large text\n */\nexport const lightTheme: Theme = {\n colors: {\n // Primary - Vibrant Indigo (Works beautifully on light backgrounds)\n primary: '#6366f1', // Indigo 500\n primaryHover: '#4f46e5', // Indigo 600\n primaryActive: '#4338ca', // Indigo 700\n\n // Secondary - Gray 600 (WCAG AAA compliant: 7.66:1 on white)\n secondary: '#4b5563',\n secondaryHover: '#374151',\n secondaryActive: '#1f2937',\n\n // Background colors\n background: '#ffffff',\n backgroundSecondary: '#f9fafb',\n backgroundTertiary: '#f3f4f6',\n\n // Surface colors (for cards, modals, etc.)\n surface: '#ffffff',\n surfaceHover: '#f9fafb',\n\n // Text colors (WCAG AAA compliant)\n text: '#111827', // Gray 900 (16.26:1 on white)\n textSecondary: '#4b5563', // Gray 600 (7.66:1 on white)\n textTertiary: '#6b7280', // Gray 500 (4.92:1 on white - AA compliant)\n textDisabled: '#9ca3af', // Gray 400\n\n // Semantic colors\n error: '#dc2626', // Red 600 (6.05:1 on white - AAA compliant)\n errorHover: '#b91c1c',\n errorBackground: '#fef2f2',\n\n success: '#16a34a', // Green 600 (5.15:1 on white - AAA compliant)\n successHover: '#15803d',\n successBackground: '#f0fdf4',\n\n warning: '#d97706', // Amber 600 (5.33:1 on white - AAA compliant)\n warningHover: '#b45309',\n warningBackground: '#fffbeb',\n\n info: '#2563eb', // Blue 600 (6.64:1 on white - AAA compliant)\n infoHover: '#1d4ed8',\n infoBackground: '#eff6ff',\n\n // Border colors\n border: '#e5e7eb', // Gray 200\n borderHover: '#d1d5db', // Gray 300\n borderFocus: '#6366f1', // Primary\n\n // Divider\n divider: '#e5e7eb',\n\n // Overlay (for modals, dropdowns)\n overlay: 'rgba(0, 0, 0, 0.5)',\n },\n\n spacing,\n borderRadius,\n fontSize,\n fontWeight,\n lineHeight,\n elevation,\n transition,\n zIndex,\n}\n","import { spacing, borderRadius, fontSize, fontWeight, lineHeight, elevation, transition, zIndex } from './tokens'\nimport { Theme } from './types'\n\n/**\n * Dark theme configuration\n * Colors are WCAG AA compliant with minimum contrast ratio of 4.5:1 for normal text\n * and 3:1 for large text on dark backgrounds\n */\nexport const darkTheme: Theme = {\n colors: {\n // Primary - Vibrant Indigo (Striking on VSCode Black)\n primary: '#a5b4fc', // Indigo 300 (lighter for better dark mode visibility)\n primaryHover: '#818cf8', // Indigo 400\n primaryActive: '#6366f1', // Indigo 500\n\n // Secondary - VSCode Gray\n secondary: '#858585',\n secondaryHover: '#a6a6a6',\n secondaryActive: '#cccccc',\n\n // Background colors\n background: '#1e1e1e', // Main editor/workspace background\n backgroundSecondary: '#252526', // Sidebar, panels\n backgroundTertiary: '#2d2d2d', // Highlights, smaller surfaces\n\n // Surface colors (for cards, modals, etc.)\n surface: '#252526',\n surfaceHover: '#2a2d2e',\n\n // Text colors\n text: '#cccccc', // Primary text\n textSecondary: '#999999', // Secondary text, comments\n textTertiary: '#6b6b6b', // Disabled/tertiary\n textDisabled: '#4d4d4d', // Disabled\n\n // Semantic colors\n error: '#f48771',\n errorHover: '#fca5a5',\n errorBackground: '#5a1d1d',\n\n success: '#89d185',\n successHover: '#86efac',\n successBackground: '#1e401e',\n\n warning: '#cca700',\n warningHover: '#d7ba7d',\n warningBackground: '#5c4d00',\n\n info: '#75beff',\n infoHover: '#9cdcfe',\n infoBackground: '#0a3254',\n\n // Border colors\n border: '#3c3c3c', // VSCode borders\n borderHover: '#444444',\n borderFocus: '#a5b4fc', // Focus border\n\n // Divider\n divider: '#333333',\n\n // Overlay (for modals, dropdowns)\n overlay: 'rgba(0, 0, 0, 0.4)',\n },\n\n spacing,\n borderRadius,\n fontSize,\n fontWeight,\n lineHeight,\n elevation,\n transition,\n zIndex,\n}\n","/**\n * LocalStorage utility for safely storing and retrieving data\n */\n\nexport class LocalStorage {\n /**\n * Get an item from localStorage\n * @param key - The key to retrieve\n * @returns The value or null if not found or error occurs\n */\n static getItem<T = string>(key: string): T | null {\n try {\n if (typeof window === 'undefined') {\n return null\n }\n \n const item = window.localStorage.getItem(key)\n \n if (item === null) {\n return null\n }\n \n try {\n return JSON.parse(item) as T\n } catch {\n // If JSON parse fails, return as string\n return item as T\n }\n } catch (error) {\n console.error(`Error getting item from localStorage: ${error}`)\n return null\n }\n }\n\n /**\n * Set an item in localStorage\n * @param key - The key to store\n * @param value - The value to store\n * @returns true if successful, false otherwise\n */\n static setItem<T>(key: string, value: T): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n const serializedValue = typeof value === 'string' \n ? value \n : JSON.stringify(value)\n \n window.localStorage.setItem(key, serializedValue)\n return true\n } catch (error) {\n console.error(`Error setting item in localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Remove an item from localStorage\n * @param key - The key to remove\n * @returns true if successful, false otherwise\n */\n static removeItem(key: string): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n window.localStorage.removeItem(key)\n return true\n } catch (error) {\n console.error(`Error removing item from localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Clear all items from localStorage\n * @returns true if successful, false otherwise\n */\n static clear(): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n window.localStorage.clear()\n return true\n } catch (error) {\n console.error(`Error clearing localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Check if a key exists in localStorage\n * @param key - The key to check\n * @returns true if key exists, false otherwise\n */\n static hasItem(key: string): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n return window.localStorage.getItem(key) !== null\n } catch (error) {\n console.error(`Error checking item in localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Get all keys from localStorage\n * @returns Array of keys\n */\n static keys(): string[] {\n try {\n if (typeof window === 'undefined') {\n return []\n }\n \n return Object.keys(window.localStorage)\n } catch (error) {\n console.error(`Error getting keys from localStorage: ${error}`)\n return []\n }\n }\n}\n","import React, { createContext, useState, ReactNode, useCallback, useEffect, useMemo } from 'react'\nimport { Theme, ThemeContextValue, ThemeMode, ResolvedThemeMode } from './types'\nimport { lightTheme } from './light'\nimport { darkTheme } from './dark'\nimport { LocalStorage } from '../utils/localStorage'\nimport { ThemeProvider as MuiThemeProvider, createTheme, CssBaseline } from '@mui/material'\n\nexport const ThemeContext = createContext<ThemeContextValue | undefined>(undefined)\n\nconst THEME_STORAGE_KEY = 'app-theme-mode'\n\nexport interface ThemeProviderProps {\n children: ReactNode\n /** Custom theme object (overrides default light/dark themes) */\n initialTheme?: Theme\n /** Initial theme mode */\n initialMode?: ThemeMode\n /** localStorage key for persisting theme preference */\n storageKey?: string\n /** Enable CSS variables injection */\n enableCssVariables?: boolean\n}\n\n/**\n * Detects system color scheme preference\n */\nconst getSystemTheme = (): ResolvedThemeMode => {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\n/**\n * Applies theme as CSS variables to document root\n */\nconst applyCssVariables = (theme: Theme, resolvedMode: ResolvedThemeMode): void => {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n\n // Set data attribute for theme mode\n root.setAttribute('data-theme', resolvedMode)\n\n // Apply color variables\n Object.entries(theme.colors).forEach(([key, value]) => {\n root.style.setProperty(`--color-${key.replace(/([A-Z])/g, '-$1').toLowerCase()}`, value)\n })\n\n // Apply spacing variables\n Object.entries(theme.spacing).forEach(([key, value]) => {\n root.style.setProperty(`--spacing-${key}`, value)\n })\n\n // Apply border radius variables\n Object.entries(theme.borderRadius).forEach(([key, value]) => {\n root.style.setProperty(`--radius-${key}`, value)\n })\n\n // Apply font size variables\n Object.entries(theme.fontSize).forEach(([key, value]) => {\n root.style.setProperty(`--text-${key}`, value)\n })\n\n // Apply font weight variables\n Object.entries(theme.fontWeight).forEach(([key, value]) => {\n root.style.setProperty(`--font-${key}`, value)\n })\n\n // Apply line height variables\n Object.entries(theme.lineHeight).forEach(([key, value]) => {\n root.style.setProperty(`--leading-${key}`, value)\n })\n\n // Apply elevation variables\n Object.entries(theme.elevation).forEach(([key, value]) => {\n root.style.setProperty(`--shadow-${key}`, value)\n })\n\n // Apply transition variables\n Object.entries(theme.transition).forEach(([key, value]) => {\n root.style.setProperty(`--transition-${key}`, value)\n })\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n initialTheme,\n initialMode = 'system',\n storageKey = THEME_STORAGE_KEY,\n enableCssVariables = true,\n}) => {\n // Load theme mode from localStorage or use initialMode\n const getInitialMode = (): ThemeMode => {\n const savedMode = LocalStorage.getItem<ThemeMode>(storageKey)\n return savedMode || initialMode\n }\n\n const [themeMode, setThemeModeState] = useState<ThemeMode>(getInitialMode)\n const [systemTheme, setSystemTheme] = useState<ResolvedThemeMode>(getSystemTheme)\n const [customTheme, setCustomTheme] = useState<Theme | undefined>(initialTheme)\n\n // Calculate resolved theme mode\n const resolvedThemeMode: ResolvedThemeMode = useMemo(() => {\n if (themeMode === 'system') return systemTheme\n return themeMode as ResolvedThemeMode\n }, [themeMode, systemTheme])\n\n // Get current theme\n const theme: Theme = useMemo(() => {\n if (customTheme) return customTheme\n return resolvedThemeMode === 'light' ? lightTheme : darkTheme\n }, [customTheme, resolvedThemeMode])\n\n // Listen for system theme changes\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n\n const handleChange = (e: MediaQueryListEvent) => {\n setSystemTheme(e.matches ? 'dark' : 'light')\n }\n\n // Modern browsers\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange)\n return () => mediaQuery.removeEventListener('change', handleChange)\n }\n // Legacy browsers\n else if (mediaQuery.addListener) {\n mediaQuery.addListener(handleChange)\n return () => mediaQuery.removeListener(handleChange)\n }\n }, [])\n\n // Apply CSS variables when theme changes\n useEffect(() => {\n if (enableCssVariables) {\n applyCssVariables(theme, resolvedThemeMode)\n }\n }, [theme, resolvedThemeMode, enableCssVariables])\n\n // Save theme mode to localStorage whenever it changes\n useEffect(() => {\n LocalStorage.setItem(storageKey, themeMode)\n }, [themeMode, storageKey])\n\n const setThemeMode = useCallback((mode: ThemeMode) => {\n setThemeModeState(mode)\n }, [])\n\n const setTheme = useCallback((newTheme: Theme) => {\n setCustomTheme(newTheme)\n }, [])\n\n const toggleTheme = useCallback(() => {\n setThemeModeState((prevMode) => {\n if (prevMode === 'light') return 'dark'\n if (prevMode === 'dark') return 'system'\n return 'light'\n })\n }, [])\n\n const contextValue: ThemeContextValue = useMemo(() => ({\n theme,\n themeMode,\n resolvedThemeMode,\n setTheme,\n setThemeMode,\n toggleTheme,\n }), [theme, themeMode, resolvedThemeMode, setTheme, setThemeMode, toggleTheme])\n\n const muiTheme = useMemo(() => createTheme({\n palette: {\n mode: resolvedThemeMode,\n primary: {\n main: theme.colors.primary,\n },\n secondary: {\n main: theme.colors.secondary,\n },\n error: {\n main: theme.colors.error,\n },\n success: {\n main: theme.colors.success,\n },\n background: {\n default: theme.colors.background,\n paper: theme.colors.backgroundSecondary,\n },\n text: {\n primary: theme.colors.text,\n secondary: theme.colors.textSecondary,\n }\n },\n }), [resolvedThemeMode, theme])\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <MuiThemeProvider theme={muiTheme}>\n <CssBaseline />\n {children}\n </MuiThemeProvider>\n </ThemeContext.Provider>\n )\n}\n","import { useContext } from 'react'\nimport { ThemeContext } from './ThemeProvider'\nimport { ThemeContextValue } from './types'\n\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext)\n \n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n \n return context\n}\n","import React from 'react'\nimport { IconButton, IconButtonProps, Tooltip } from '@mui/material'\nimport { DarkMode, LightMode, BrightnessAuto } from '@mui/icons-material'\nimport { useTheme } from './useTheme'\n\nexport interface ThemeToggleProps extends Omit<IconButtonProps, 'onClick'> {\n /**\n * Tooltip text for light mode\n * @default \"Switch to dark mode\"\n */\n lightModeTooltip?: string\n\n /**\n * Tooltip text for dark mode\n * @default \"Switch to system mode\"\n */\n darkModeTooltip?: string\n\n /**\n * Tooltip text for system mode\n * @default \"Switch to light mode\"\n */\n systemModeTooltip?: string\n\n /**\n * Whether to show tooltip\n * @default true\n */\n showTooltip?: boolean\n}\n\n/**\n * A round button component for toggling between light, dark, and system themes\n */\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({\n lightModeTooltip = 'Switch to dark mode',\n darkModeTooltip = 'Switch to system theme',\n systemModeTooltip = 'Switch to light theme',\n showTooltip = true,\n sx,\n ...props\n}) => {\n const { themeMode, toggleTheme } = useTheme()\n\n const getIcon = () => {\n switch (themeMode) {\n case 'light':\n return <LightMode />\n case 'dark':\n return <DarkMode />\n case 'system':\n return <BrightnessAuto />\n default:\n return <BrightnessAuto />\n }\n }\n\n const getTooltip = () => {\n switch (themeMode) {\n case 'light':\n return lightModeTooltip\n case 'dark':\n return darkModeTooltip\n case 'system':\n return systemModeTooltip\n default:\n return lightModeTooltip\n }\n }\n\n const button = (\n <IconButton\n onClick={toggleTheme}\n color=\"inherit\"\n sx={{\n borderRadius: '50%',\n ...sx\n }}\n {...props}\n >\n {getIcon()}\n </IconButton>\n )\n\n if (!showTooltip) {\n return button\n }\n\n return (\n <Tooltip title={getTooltip()} arrow>\n {button}\n </Tooltip>\n )\n}\n","import { Box, Typography, Button } from '@mui/material'\nimport { SentimentDissatisfied } from '@mui/icons-material'\nimport { useNavigate } from 'react-router-dom'\nimport { useTheme } from '../theme'\n\nexport function NotFoundPage() {\n const navigate = useNavigate()\n const { theme } = useTheme()\n\n return (\n <Box\n sx={{\n minHeight: '100vh',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.colors.backgroundSecondary,\n gap: 2,\n textAlign: 'center',\n px: 2,\n }}\n >\n <SentimentDissatisfied sx={{ fontSize: 72, color: 'text.disabled' }} />\n <Typography variant=\"h2\" fontWeight=\"bold\" color=\"text.primary\">\n 404\n </Typography>\n <Typography variant=\"h6\" color=\"text.secondary\">\n Page not found\n </Typography>\n <Typography variant=\"body2\" color=\"text.disabled\" sx={{ maxWidth: 360 }}>\n The page you're looking for doesn't exist or has been moved.\n </Typography>\n <Button\n variant=\"contained\"\n sx={{ mt: 2, textTransform: 'none' }}\n onClick={() => navigate('/', { replace: true })}\n >\n Go to Home\n </Button>\n </Box>\n )\n}\n","import { HttpClientConfig, RequestConfig, HttpResponse, HttpError } from './types'\n\nexport class HttpClient {\n private baseURL: string\n private timeout: number\n private defaultHeaders: Record<string, string>\n\n constructor(config: HttpClientConfig = {}) {\n this.baseURL = config.baseURL || ''\n this.timeout = config.timeout || 30000\n this.defaultHeaders = config.headers || {}\n }\n\n private buildURL(url: string, params?: Record<string, string | number | boolean>): string {\n const fullURL = url.startsWith('http') ? url : `${this.baseURL}${url}`\n \n if (!params) return fullURL\n \n const searchParams = new URLSearchParams()\n Object.entries(params).forEach(([key, value]) => {\n searchParams.append(key, String(value))\n })\n \n return `${fullURL}?${searchParams.toString()}`\n }\n\n private async request<T = any>(\n url: string,\n config: RequestConfig = {}\n ): Promise<HttpResponse<T>> {\n const { params, data, timeout = this.timeout, headers = {}, ...restConfig } = config\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(this.buildURL(url, params), {\n ...restConfig,\n headers: {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...headers,\n },\n body: data ? JSON.stringify(data) : undefined,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const error: HttpError = new Error(`HTTP Error: ${response.statusText}`)\n error.status = response.status\n error.statusText = response.statusText\n try {\n error.data = await response.json()\n } catch {\n error.data = { code: response.status, message: await response.text() }\n }\n throw error\n }\n\n const responseData = await response.json()\n\n return {\n data: responseData as T,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n }\n } catch (error) {\n clearTimeout(timeoutId)\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error('Request timeout')\n }\n throw error\n }\n }\n\n setDefaultHeader(key: string, value: string): void {\n this.defaultHeaders[key] = value\n }\n\n removeDefaultHeader(key: string): void {\n delete this.defaultHeaders[key]\n }\n\n getDefaultHeaders(): Record<string, string> {\n return { ...this.defaultHeaders }\n }\n\n get<T = any>(url: string, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, method: 'GET' })\n }\n\n post<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'POST' })\n }\n\n put<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'PUT' })\n }\n\n patch<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'PATCH' })\n }\n\n delete<T = any>(url: string, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, method: 'DELETE' })\n }\n}\n\nexport function extractErrorMessage(error: any): string {\n if (error instanceof Error) {\n const httpError = error as HttpError\n if (httpError.data) {\n return httpError.data.message\n }\n return error.message\n }\n return 'An unexpected error occurred'\n}\n","import { useEffect } from 'react'\nimport { Box, CircularProgress, Typography } from '@mui/material'\nimport { useNavigate, useSearchParams } from 'react-router-dom'\nimport { extractErrorMessage } from '../http'\nimport { useTheme } from '../theme'\nimport type { IAuthService } from '../auth'\n\nexport interface LoginCallbackPageProps {\n authService: IAuthService\n navigateTo?: string\n onLoginFailed?: () => void\n}\n\nexport function LoginCallbackPage({ authService, navigateTo = '/', onLoginFailed }: LoginCallbackPageProps) {\n const [searchParams] = useSearchParams()\n const navigate = useNavigate()\n const { theme } = useTheme()\n\n useEffect(() => {\n const loginToken = searchParams.get('login_token')\n\n if (!loginToken) {\n console.error('Login callback failed: Missing login_token in query parameters')\n onLoginFailed?.()\n return\n }\n authService\n .signInWithLoginToken({ loginToken })\n .then(() => {\n navigate(navigateTo, { replace: true })\n })\n .catch((err: unknown) => {\n console.error('Login callback failed:', extractErrorMessage(err))\n onLoginFailed?.()\n })\n }, [])\n\n return (\n <Box\n sx={{\n minHeight: '100vh',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n background: `linear-gradient(135deg, ${theme.colors.primary} 0%, ${theme.colors.primaryActive} 100%)`,\n gap: 2,\n }}\n >\n <CircularProgress sx={{ color: theme.colors.surface }} />\n <Typography variant=\"body2\" sx={{ color: theme.colors.surface, opacity: 0.85 }}>\n Signing you in…\n </Typography>\n </Box>\n )\n}\n","import React, { useState, useEffect, ReactNode, CSSProperties } from 'react'\nimport {\n Drawer,\n List,\n ListItem,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n Box,\n Typography,\n Collapse,\n IconButton\n} from '@mui/material'\nimport { ExpandLess, ExpandMore } from '@mui/icons-material'\nimport { BrowserRouter, NavLink, Outlet, useLocation, Routes, Route } from 'react-router-dom'\n\n/**\n * Menu item configuration\n */\nexport interface MenuItem {\n /** Unique identifier */\n id: string\n /** Display label */\n label: string\n /** Optional icon element */\n icon?: ReactNode\n /** Route path (for router mode) */\n path?: string\n /** Component to render (for non-router mode) */\n component?: ReactNode\n /** Optional submenu items */\n children?: MenuItem[]\n}\n\nexport interface SidebarLayoutProps {\n /** Array of menu items */\n menuItems: MenuItem[]\n /** Width of the sidebar */\n sidebarWidth?: string | number\n /** Additional CSS class for container */\n className?: string\n /** Default selected menu item ID (for non-router mode) */\n defaultSelected?: string\n /** Callback when menu changes */\n onMenuChange?: (id: string) => void\n /** Custom styles for container */\n style?: CSSProperties\n /** Custom styles for sidebar */\n sidebarStyle?: CSSProperties\n /** Custom styles for body */\n bodyStyle?: CSSProperties\n /** Default expanded submenu IDs */\n defaultExpanded?: string[]\n /** If true, wraps SidebarLayout in BrowserRouter and enables router-based navigation */\n isRouter?: boolean\n}\n\n\n\n/**\n * Recursive menu item renderer for router mode\n */\nconst RouterMenuItem: React.FC<{\n item: MenuItem\n depth?: number\n expanded: Set<string>\n onToggle: (id: string) => void\n}> = ({ item, depth = 0, expanded, onToggle }) => {\n const hasChildren = item.children && item.children.length > 0\n const isExpanded = expanded.has(item.id)\n\n return (\n <>\n <ListItem disablePadding>\n <ListItemButton\n component={hasChildren ? 'div' : NavLink}\n to={!hasChildren ? (item.path || `/${item.id}`) : undefined}\n end={false}\n onClick={hasChildren ? () => onToggle(item.id) : undefined}\n sx={{\n pl: 2 + depth * 2,\n '&.active': {\n backgroundColor: 'action.selected',\n color: 'primary.main',\n borderLeft: 3,\n borderColor: 'primary.main',\n fontWeight: 'medium',\n '& .MuiListItemIcon-root': {\n color: 'primary.main',\n },\n },\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n transition: 'all 0.15s',\n }}\n >\n {item.icon && (\n <ListItemIcon sx={{ minWidth: 40 }}>\n {item.icon}\n </ListItemIcon>\n )}\n <ListItemText\n primary={item.label}\n primaryTypographyProps={{\n fontSize: '0.875rem',\n }}\n />\n {hasChildren && (\n <IconButton size=\"small\" sx={{ p: 0 }}>\n {isExpanded ? <ExpandLess /> : <ExpandMore />}\n </IconButton>\n )}\n </ListItemButton>\n </ListItem>\n {hasChildren && (\n <Collapse in={isExpanded} timeout=\"auto\" unmountOnExit>\n <List component=\"div\" disablePadding>\n {item.children!.map((child) => (\n <RouterMenuItem\n key={child.id}\n item={child}\n depth={depth + 1}\n expanded={expanded}\n onToggle={onToggle}\n />\n ))}\n </List>\n </Collapse>\n )}\n </>\n )\n}\n\n/**\n * Helper to flatten menu items into routes\n */\nconst flattenMenuRoutes = (items: MenuItem[]): Array<{ path: string; component: ReactNode }> => {\n const routes: Array<{ path: string; component: ReactNode }> = []\n\n const flatten = (menuItems: MenuItem[]) => {\n for (const item of menuItems) {\n if (item.path && item.component) {\n routes.push({ path: item.path, component: item.component })\n }\n if (item.children) {\n flatten(item.children)\n }\n }\n }\n\n flatten(items)\n return routes\n}\n\n/**\n * Inner component for Router-based Sidebar Layout\n * (Must be rendered inside a Router context to use useLocation)\n */\nconst SidebarLayoutRouterInner: React.FC<SidebarLayoutProps> = ({\n menuItems,\n sidebarWidth = 250,\n className = '',\n onMenuChange,\n style,\n sidebarStyle,\n bodyStyle,\n defaultExpanded = [],\n}) => {\n const location = useLocation()\n const [expanded, setExpanded] = useState<Set<string>>(new Set(defaultExpanded))\n\n const handleToggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }\n\n useEffect(() => {\n if (onMenuChange) {\n const findActiveItem = (items: MenuItem[]): MenuItem | undefined => {\n for (const item of items) {\n if (item.path && location.pathname === item.path) {\n return item\n }\n if (item.children) {\n const found = findActiveItem(item.children)\n if (found) return found\n }\n }\n return undefined\n }\n\n const activeItem = findActiveItem(menuItems)\n if (activeItem) {\n onMenuChange(activeItem.id)\n }\n }\n }, [location.pathname, menuItems, onMenuChange])\n\n // Check if menu items have components - if so, render routes internally\n const hasComponents = menuItems.some(item =>\n item.component || (item.children?.some(child => child.component))\n )\n\n const routes = hasComponents ? flattenMenuRoutes(menuItems) : []\n\n return (\n <Box\n className={className}\n sx={{\n display: 'flex',\n height: '100%',\n width: '100%',\n ...style,\n }}\n >\n <Drawer\n variant=\"permanent\"\n sx={{\n width: sidebarWidth,\n flexShrink: 0,\n '& .MuiDrawer-paper': {\n width: sidebarWidth,\n boxSizing: 'border-box',\n position: 'relative',\n borderRight: '1px solid',\n borderColor: 'divider',\n ...sidebarStyle,\n },\n }}\n >\n <List sx={{ p: 0 }}>\n {menuItems.filter(item => item.label).map((item) => (\n <RouterMenuItem\n key={item.id}\n item={item}\n expanded={expanded}\n onToggle={handleToggle}\n />\n ))}\n </List>\n </Drawer>\n\n <Box\n component=\"main\"\n sx={{\n flexGrow: 1,\n overflow: 'auto',\n ...bodyStyle,\n }}\n >\n {hasComponents ? (\n <Routes>\n {routes.map(({ path, component }) => (\n <Route\n key={path}\n path={path}\n element={component}\n />\n ))}\n </Routes>\n ) : (\n <Outlet />\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * Wrapper for Router-based Sidebar Layout\n */\nconst SidebarLayoutWithRouter: React.FC<SidebarLayoutProps> = (props) => {\n return (\n // @ts-expect-error - future prop exists in v6 for v7 migration, but is removed from v7 types\n <BrowserRouter future={{ v7_startTransition: true, v7_relativeSplatPath: true }}>\n <SidebarLayoutRouterInner {...props} />\n </BrowserRouter>\n )\n}\n\n/**\n * Recursive menu item renderer for state mode\n */\nconst StateMenuItem: React.FC<{\n item: MenuItem\n selectedId: string\n depth?: number\n expanded: Set<string>\n onToggle: (id: string) => void\n onClick: (id: string) => void\n}> = ({ item, selectedId, depth = 0, expanded, onToggle, onClick }) => {\n const hasChildren = item.children && item.children.length > 0\n const isExpanded = expanded.has(item.id)\n const isActive = item.id === selectedId\n\n const handleClick = () => {\n if (hasChildren) {\n onToggle(item.id)\n } else {\n onClick(item.id)\n }\n }\n\n return (\n <>\n <ListItem disablePadding>\n <ListItemButton\n selected={isActive}\n onClick={handleClick}\n sx={{\n pl: 2 + depth * 2,\n '&.Mui-selected': {\n backgroundColor: 'action.selected',\n color: 'primary.main',\n borderLeft: 3,\n borderColor: 'primary.main',\n fontWeight: 'medium',\n '& .MuiListItemIcon-root': {\n color: 'primary.main',\n },\n '&:hover': {\n backgroundColor: 'action.selected',\n },\n },\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n transition: 'all 0.15s',\n }}\n >\n {item.icon && (\n <ListItemIcon sx={{ minWidth: 40 }}>\n {item.icon}\n </ListItemIcon>\n )}\n <ListItemText\n primary={item.label}\n primaryTypographyProps={{\n fontSize: '0.875rem',\n }}\n />\n {hasChildren && (\n <IconButton size=\"small\" sx={{ p: 0 }}>\n {isExpanded ? <ExpandLess /> : <ExpandMore />}\n </IconButton>\n )}\n </ListItemButton>\n </ListItem>\n {hasChildren && (\n <Collapse in={isExpanded} timeout=\"auto\" unmountOnExit>\n <List component=\"div\" disablePadding>\n {item.children!.map((child) => (\n <StateMenuItem\n key={child.id}\n item={child}\n selectedId={selectedId}\n depth={depth + 1}\n expanded={expanded}\n onToggle={onToggle}\n onClick={onClick}\n />\n ))}\n </List>\n </Collapse>\n )}\n </>\n )\n}\n\n/**\n * State-based Sidebar Layout Component (Fallback)\n */\nconst SidebarLayoutWithState: React.FC<SidebarLayoutProps> = ({\n menuItems,\n sidebarWidth = 250,\n className = '',\n defaultSelected,\n onMenuChange,\n style,\n sidebarStyle,\n bodyStyle,\n defaultExpanded = [],\n}) => {\n const [selectedId, setSelectedId] = useState<string>(\n defaultSelected || menuItems[0]?.id\n )\n const [expanded, setExpanded] = useState<Set<string>>(new Set(defaultExpanded))\n\n const handleToggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }\n\n const handleMenuClick = (id: string) => {\n setSelectedId(id)\n if (onMenuChange) {\n onMenuChange(id)\n }\n }\n\n const findActiveItem = (items: MenuItem[], id: string): MenuItem | undefined => {\n for (const item of items) {\n if (item.id === id) return item\n if (item.children) {\n const found = findActiveItem(item.children, id)\n if (found) return found\n }\n }\n return undefined\n }\n\n const activeItem = findActiveItem(menuItems, selectedId)\n\n return (\n <Box\n className={className}\n sx={{\n display: 'flex',\n height: '100%',\n width: '100%',\n ...style,\n }}\n >\n <Drawer\n variant=\"permanent\"\n sx={{\n width: sidebarWidth,\n flexShrink: 0,\n '& .MuiDrawer-paper': {\n width: sidebarWidth,\n boxSizing: 'border-box',\n position: 'relative',\n borderRight: '1px solid',\n borderColor: 'divider',\n ...sidebarStyle,\n },\n }}\n >\n <List sx={{ p: 0 }}>\n {menuItems.filter(item => item.label).map((item) => (\n <StateMenuItem\n key={item.id}\n item={item}\n selectedId={selectedId}\n expanded={expanded}\n onToggle={handleToggle}\n onClick={handleMenuClick}\n />\n ))}\n </List>\n </Drawer>\n\n <Box\n component=\"main\"\n sx={{\n flexGrow: 1,\n overflow: 'auto',\n p: 3,\n ...bodyStyle,\n }}\n >\n {activeItem?.component || (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ textAlign: 'center', mt: 4 }}\n >\n No content available for this menu item\n </Typography>\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * SidebarLayout Component\n * \n * A flexible sidebar-body layout component built with Material UI that supports \n * both router-based and state-based navigation with nested submenu support.\n * \n * **Uses Material UI Components:**\n * - Drawer (permanent variant)\n * - List, ListItem, ListItemButton\n * - ListItemIcon, ListItemText\n * - Collapse (for submenus)\n * - Box for layout\n * \n * **Features:**\n * - Nested submenu support with expand/collapse\n * - Material UI icons (ExpandMore/ExpandLess)\n * - Recursive rendering for deep nesting\n * - Automatic indentation based on depth\n * \n * **Router Mode** (when react-router-dom is available):\n * - Uses NavLink for navigation\n * - Renders child routes via Outlet\n * - Supports URL-based navigation\n * - Browser back/forward works\n * \n * **State Mode** (fallback):\n * - Uses internal state\n * - Renders components from menuItems\n * - Simple navigation without routing\n * \n * @example\n * // With nested submenus\n * <SidebarLayout\n * menuItems={[\n * {\n * id: 'products',\n * label: 'Products',\n * icon: <ShoppingCartIcon />,\n * children: [\n * { id: 'all-products', label: 'All Products', path: '/products/all' },\n * { id: 'categories', label: 'Categories', path: '/products/categories' }\n * ]\n * },\n * { id: 'dashboard', label: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> }\n * ]}\n * defaultExpanded={['products']}\n * />\n * \n * @example\n * // With React Router\n * <Routes>\n * <Route path=\"/\" element={\n * <SidebarLayout menuItems={[\n * { id: 'dashboard', label: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> },\n * { id: 'settings', label: 'Settings', path: '/settings', icon: <SettingsIcon /> }\n * ]} />\n * }>\n * <Route path=\"dashboard\" element={<Dashboard />} />\n * <Route path=\"settings\" element={<Settings />} />\n * </Route>\n * </Routes>\n * \n * @example\n * // Without React Router (State-based)\n * <SidebarLayout\n * menuItems={[\n * { id: 'dashboard', label: 'Dashboard', component: <Dashboard /> },\n * { id: 'settings', label: 'Settings', component: <Settings /> }\n * ]}\n * defaultSelected=\"dashboard\"\n * />\n */\nexport const SidebarLayout: React.FC<SidebarLayoutProps> = (props) => {\n // If explicitly requested to be a router, or implicitly requested because items have paths\n // AND NOT explicitly disabling the router.\n if (props.isRouter) {\n return <SidebarLayoutWithRouter {...props} />\n }\n\n return <SidebarLayoutWithState {...props} />\n}\n","import { createHighlighter, Highlighter } from 'shiki';\n\nlet highlighterInstance: Highlighter | null = null;\nlet highlighterPromise: Promise<Highlighter> | null = null;\n\nexport const getHighlighter = async (): Promise<Highlighter> => {\n if (highlighterInstance) {\n return highlighterInstance;\n }\n\n if (highlighterPromise) {\n return highlighterPromise;\n }\n\n highlighterPromise = createHighlighter({\n themes: ['github-light', 'github-dark'],\n langs: ['js', 'ts', 'go', 'json', 'bash', 'yaml', 'md', 'python', 'java', 'cpp', 'c', 'html', 'css', 'sql', 'http', 'text'],\n }).then(highlighter => {\n highlighterInstance = highlighter;\n return highlighter;\n });\n\n return highlighterPromise;\n};\n","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport { Highlighter } from 'shiki';\nimport './github-markdown.css';\nimport 'katex/dist/katex.min.css';\n\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { getHighlighter } from './shikiHighlighter';\n\ninterface ReadmeViewerProps {\n content: string;\n className?: string;\n isDark?: boolean;\n muiTheme?: any;\n}\n\nconst ReadmeViewer: React.FC<ReadmeViewerProps> = ({\n content,\n className = '',\n isDark: propIsDark,\n muiTheme,\n}) => {\n const isDark = propIsDark !== undefined ? propIsDark : (muiTheme?.palette?.mode === 'dark');\n const [highlighter, setHighlighter] = useState<Highlighter | null>(null);\n const [copiedBlocks, setCopiedBlocks] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n getHighlighter().then(setHighlighter);\n }, []);\n\n const copyToClipboard = async (text: string, blockId: string) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopiedBlocks(prev => new Set(prev).add(blockId));\n setTimeout(() => {\n setCopiedBlocks(prev => {\n const newSet = new Set(prev);\n newSet.delete(blockId);\n return newSet;\n });\n }, 2000);\n } catch (err) {\n console.error('Failed to copy text: ', err);\n }\n };\n\n\n return (\n <div className={`readme-viewer markdown-body ${className}`}>\n <style>{`\n .shiki-wrapper pre.shiki {\n padding: 16px !important;\n border-radius: 8px !important;\n overflow-x: auto;\n margin-bottom: 16px;\n border: 1px solid var(--md-sys-color-outline-variant, #e0e0e0);\n }\n `}</style>\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeKatex]}\n components={{\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || '');\n\n if (match && highlighter) {\n const codeText = String(children).replace(/\\n$/, '');\n const blockId = `code-${Math.random().toString(36).substr(2, 9)}`;\n\n let highlightedHtml = '';\n try {\n highlightedHtml = highlighter.codeToHtml(codeText, {\n lang: match[1],\n theme: isDark ? 'github-dark' : 'github-light',\n });\n } catch (e) {\n // Graceful fallback if language is unsupported by shiki\n try {\n highlightedHtml = highlighter.codeToHtml(codeText, {\n lang: 'text',\n theme: isDark ? 'github-dark' : 'github-light',\n });\n } catch (fallbackError) {\n // Ultimate fallback to just safely escaping text\n highlightedHtml = `<pre><code>${codeText}</code></pre>`;\n }\n }\n\n return (\n <div style={{ position: 'relative' }}>\n <div className=\"shiki-wrapper\" dangerouslySetInnerHTML={{ __html: highlightedHtml }} />\n <button\n onClick={() => copyToClipboard(codeText, blockId)}\n style={{\n position: 'absolute',\n top: '8px',\n right: '8px',\n backgroundColor: 'var(--md-sys-color-surface-container-high)',\n border: '1px solid var(--md-sys-color-outline-variant)',\n borderRadius: '4px',\n padding: '6px',\n fontSize: '14px',\n cursor: 'pointer',\n color: 'var(--md-sys-color-on-surface-variant)',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s ease',\n width: '32px',\n height: '32px',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = isDark\n ? 'var(--md-sys-color-surface-container-highest)'\n : 'var(--md-sys-color-surface-container-high)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = isDark\n ? 'var(--md-sys-color-surface-container-high)'\n : 'var(--md-sys-color-surface-container-highest)';\n }}\n title={copiedBlocks.has(blockId) ? 'Copied!' : 'Copy code'}\n >\n {copiedBlocks.has(blockId) ? (\n <CheckIcon style={{ fontSize: '16px' }} />\n ) : (\n <ContentCopyIcon style={{ fontSize: '16px' }} />\n )}\n </button>\n </div>\n );\n }\n\n return (\n <code className={className} {...props}>\n {children}\n </code>\n );\n },\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n};\n\nexport default ReadmeViewer;\n","import React, { createContext, useContext, useState, ReactNode, useCallback } from 'react'\nimport { Snackbar, Alert, AlertColor } from '@mui/material'\n\n/**\n * Notification type representing a toast message\n */\nexport interface Notification {\n id: string\n message: string\n type: AlertColor\n duration?: number\n}\n\n/**\n * Context interface for notification management\n */\nexport interface NotificationContextType {\n showNotification: (message: string, type: AlertColor, duration?: number) => void\n success: (message: string, duration?: number) => void\n error: (message: string, duration?: number) => void\n warning: (message: string, duration?: number) => void\n info: (message: string, duration?: number) => void\n}\n\nconst NotificationContext = createContext<NotificationContextType | undefined>(undefined)\n\nexport interface NotificationProviderProps {\n /** Components to wrap with notification context */\n children: ReactNode\n /** Default duration for notifications in milliseconds. Defaults to 6000ms */\n defaultDuration?: number\n /** Maximum number of notifications to show at once. Defaults to 3 */\n maxNotifications?: number\n /** Position of the notifications. Defaults to top-right */\n anchorOrigin?: {\n vertical: 'top' | 'bottom'\n horizontal: 'left' | 'center' | 'right'\n }\n}\n\n/**\n * NotificationProvider manages toast notifications using Material-UI Snackbar and Alert.\n * Provides methods to show success, error, warning, and info notifications.\n * \n * @example\n * ```tsx\n * <NotificationProvider>\n * <App />\n * </NotificationProvider>\n * ```\n * \n * // In a component:\n * ```tsx\n * const { success, error } = useNotification()\n * success('Operation completed!')\n * error('Something went wrong')\n * ```\n */\nexport const NotificationProvider: React.FC<NotificationProviderProps> = ({\n children,\n defaultDuration = 6000,\n maxNotifications = 3,\n anchorOrigin = { vertical: 'top', horizontal: 'right' }\n}) => {\n const [notifications, setNotifications] = useState<Notification[]>([])\n\n const showNotification = useCallback((\n message: string,\n type: AlertColor,\n duration: number = defaultDuration\n ) => {\n const id = `${Date.now()}-${Math.random()}`\n const newNotification: Notification = { id, message, type, duration }\n\n setNotifications((prev) => {\n // Limit the number of notifications\n const updated = [...prev, newNotification]\n if (updated.length > maxNotifications) {\n return updated.slice(updated.length - maxNotifications)\n }\n return updated\n })\n }, [defaultDuration, maxNotifications])\n\n const handleClose = useCallback((id: string) => {\n setNotifications((prev) => prev.filter((notif) => notif.id !== id))\n }, [])\n\n const success = useCallback((message: string, duration?: number) => {\n showNotification(message, 'success', duration)\n }, [showNotification])\n\n const error = useCallback((message: string, duration?: number) => {\n showNotification(message, 'error', duration)\n }, [showNotification])\n\n const warning = useCallback((message: string, duration?: number) => {\n showNotification(message, 'warning', duration)\n }, [showNotification])\n\n const info = useCallback((message: string, duration?: number) => {\n showNotification(message, 'info', duration)\n }, [showNotification])\n\n const contextValue: NotificationContextType = {\n showNotification,\n success,\n error,\n warning,\n info\n }\n\n return (\n <NotificationContext.Provider value={contextValue}>\n {children}\n {notifications.map((notification, index) => (\n <Snackbar\n key={notification.id}\n open={true}\n autoHideDuration={notification.duration}\n onClose={() => handleClose(notification.id)}\n anchorOrigin={anchorOrigin}\n style={{\n marginTop: index * 70 // Stack notifications vertically\n }}\n >\n <Alert\n onClose={() => handleClose(notification.id)}\n severity={notification.type}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {notification.message}\n </Alert>\n </Snackbar>\n ))}\n </NotificationContext.Provider>\n )\n}\n\n/**\n * Hook to access notification context\n * Must be used within a NotificationProvider\n * \n * @example\n * ```tsx\n * const { success, error, warning, info } = useNotification()\n * \n * // Show notifications\n * success('Data saved successfully!')\n * error('Failed to save data')\n * warning('This action cannot be undone')\n * info('New update available')\n * \n * // With custom duration\n * success('Quick message', 3000)\n * ```\n */\nexport const useNotification = (): NotificationContextType => {\n const context = useContext(NotificationContext)\n if (!context) {\n throw new Error('useNotification must be used within a NotificationProvider')\n }\n return context\n}\n","import {\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Typography,\n} from '@mui/material'\nimport WarningAmberIcon from '@mui/icons-material/WarningAmber'\nimport { Box } from '@mui/material'\n\nexport interface ConfirmDialogProps {\n open: boolean\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n confirmColor?: 'primary' | 'error' | 'warning' | 'success'\n onConfirm: () => void\n onCancel: () => void\n}\n\nexport const ConfirmDialog = ({\n open,\n title,\n message,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n confirmColor = 'primary',\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) => {\n return (\n <Dialog open={open} onClose={onCancel} maxWidth=\"xs\" fullWidth slotProps={{ paper: { sx: { borderRadius: 4 } } }}>\n <DialogTitle>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <WarningAmberIcon color={confirmColor} />\n {title}\n </Box>\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\">{message}</Typography>\n </DialogContent>\n <DialogActions sx={{ px: 3, pb: 2 }}>\n <Button onClick={onCancel} variant=\"outlined\">\n {cancelText}\n </Button>\n <Button onClick={onConfirm} variant=\"contained\" color={confirmColor} autoFocus>\n {confirmText}\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n\nexport default ConfirmDialog\n","/**\n * Merges class names together\n * Useful for conditional className composition\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n","/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n timeoutId = setTimeout(() => {\n func.apply(this, args)\n }, wait)\n }\n}\n","/**\n * Creates a throttled function that only invokes func at most once per every wait milliseconds\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now()\n \n if (now - lastCall >= wait) {\n lastCall = now\n func.apply(this, args)\n }\n }\n}\n","/**\n * Formats a date to a readable string\n */\nexport function formatDate(\n date: Date | string | number,\n options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n }\n): string {\n const dateObj = typeof date === 'string' || typeof date === 'number' \n ? new Date(date) \n : date\n\n return new Intl.DateTimeFormat('en-US', options).format(dateObj)\n}\n","import { LocalStorage } from \"../utils\";\nimport { HttpClient } from '../http'\nimport type { SignInResponse } from './struct'\n\nconst SESSION_KEY = 'session_details'\n\nexport interface ISessionManager {\n /** Persist session to localStorage and set the auth header. */\n save(session: SignInResponse): void\n /** Partially update stored session fields (e.g. after token refresh). */\n patch(updates: Partial<SignInResponse>): void\n /** Clear session from localStorage and remove the auth header. */\n clear(): void\n /** Return the full stored session, or null if absent / unparseable. */\n get(): SignInResponse | null\n /** Return the stored access token, or undefined. */\n getAccessToken(): string | undefined\n /** Return the stored refresh token, or undefined. */\n getRefreshToken(): string | undefined\n /** Return the session UUID, or undefined. */\n getSessionId(): string | undefined\n /** True when a non-expired access token is stored. */\n isAuthenticated(): boolean\n /** Called on app startup: restore the auth header or wipe an expired session. */\n initialize(): void\n}\n\nexport class SessionManager implements ISessionManager {\n private static instance: SessionManager\n private readonly key: string\n private readonly client: HttpClient\n private cache: SignInResponse | null = null\n\n private constructor(client: HttpClient, key = SESSION_KEY) {\n this.client = client\n this.key = key\n }\n\n static getInstance(client: HttpClient): SessionManager {\n if (!SessionManager.instance) {\n SessionManager.instance = new SessionManager(client)\n }\n return SessionManager.instance\n }\n\n save(session: SignInResponse): void {\n this.cache = session\n LocalStorage.setItem(this.key, session)\n this.setAuthToken(session.accessToken)\n }\n\n patch(updates: Partial<SignInResponse>): void {\n const current = this.get()\n if (!current) return\n const updated = { ...current, ...updates }\n this.cache = updated\n LocalStorage.setItem(this.key, updated)\n if (updates.accessToken) {\n this.setAuthToken(updates.accessToken)\n }\n }\n\n clear(): void {\n this.cache = null\n LocalStorage.removeItem(this.key)\n this.clearAuthToken()\n }\n\n get(): SignInResponse | null {\n if (this.cache !== null) return this.cache\n this.cache = LocalStorage.getItem<SignInResponse>(this.key)\n return this.cache\n }\n\n getAccessToken(): string | undefined {\n return this.get()?.accessToken || undefined\n }\n\n getRefreshToken(): string | undefined {\n return this.get()?.refreshToken || undefined\n }\n\n getSessionId(): string | undefined {\n return this.get()?.sessionId || undefined\n }\n\n isAuthenticated(): boolean {\n const session = this.get()\n if (!session?.accessToken) return false\n return Number(session.expiresAt) > Date.now() / 1000\n }\n\n initialize(): void {\n const session = this.get()\n if (session?.accessToken && Number(session.expiresAt) > Date.now() / 1000) {\n this.setAuthToken(session.accessToken)\n } else {\n this.clear()\n }\n }\n\n private setAuthToken(token: string): void {\n this.client.setDefaultHeader('Authorization', `Bearer ${token}`)\n }\n\n private clearAuthToken(): void {\n this.client.removeDefaultHeader('Authorization')\n }\n\n}\n","import { HttpClient } from '../http'\nimport { SessionManager } from './sessionManager'\nimport type {\n SignInRequest,\n SignInResponse,\n RefreshTokenRequest,\n RefreshTokenResponse,\n LogoutRequest,\n LogoutResponse,\n GenerateLoginTokenRequest,\n GenerateLoginTokenResponse,\n SignInWithLoginTokenRequest,\n} from './struct'\n\nconst BASE_URL = '/openauth/v1'\n\nexport interface IAuthService {\n signIn(request: SignInRequest): Promise<SignInResponse>\n refreshToken(request?: Partial<RefreshTokenRequest>): Promise<RefreshTokenResponse>\n logout(request: LogoutRequest): Promise<LogoutResponse>\n generateLoginToken(request?: GenerateLoginTokenRequest): Promise<GenerateLoginTokenResponse>\n signInWithLoginToken(request: SignInWithLoginTokenRequest): Promise<SignInResponse>\n isAuthenticated(): boolean\n getAccessToken(): string | undefined\n getSessionDetails(): SignInResponse | null\n getSessionId(): string | undefined\n initializeAuth(): void\n}\n\nexport class AuthService implements IAuthService {\n private static instance: AuthService\n private readonly client: HttpClient\n private readonly sessionManager: SessionManager\n\n private constructor(client: HttpClient) {\n this.client = client\n this.sessionManager = SessionManager.getInstance(client)\n }\n\n static getInstance(client: HttpClient): AuthService {\n if (!AuthService.instance) {\n AuthService.instance = new AuthService(client)\n }\n return AuthService.instance\n }\n\n async signIn(request: SignInRequest): Promise<SignInResponse> {\n const response = await this.client.post<SignInResponse>(\n `${BASE_URL}/auth/signin`,\n request\n )\n if (response.data.accessToken) {\n this.sessionManager.save(response.data)\n }\n return response.data\n }\n\n async refreshToken(request?: Partial<RefreshTokenRequest>): Promise<RefreshTokenResponse> {\n const refreshToken = this.sessionManager.getRefreshToken()\n if (!refreshToken) {\n throw new Error('No refresh token available')\n }\n\n const response = await this.client.post<RefreshTokenResponse>(\n `${BASE_URL}/auth/refresh`,\n { refreshToken, ...request }\n )\n\n if (response.data.accessToken) {\n this.sessionManager.patch({\n accessToken: response.data.accessToken,\n refreshToken: response.data.refreshToken,\n })\n }\n\n return response.data\n }\n\n async logout(request: LogoutRequest): Promise<LogoutResponse> {\n try {\n request.sessionId = this.sessionManager.getSessionId()\n const response = await this.client.post<LogoutResponse>(\n `${BASE_URL}/auth/logout`,\n request || {}\n )\n return response.data\n } finally {\n this.sessionManager.clear()\n }\n }\n\n async generateLoginToken(request?: GenerateLoginTokenRequest): Promise<GenerateLoginTokenResponse> {\n const response = await this.client.put<GenerateLoginTokenResponse>(\n `${BASE_URL}/auth/login-token`,\n request ?? {}\n )\n return response.data\n }\n\n async signInWithLoginToken(request: SignInWithLoginTokenRequest): Promise<SignInResponse> {\n const response = await this.client.post<SignInResponse>(\n `${BASE_URL}/auth/signin-with-token`,\n request\n )\n if (response.data.accessToken) {\n this.sessionManager.save(response.data)\n }\n return response.data\n }\n\n isAuthenticated(): boolean {\n return this.sessionManager.isAuthenticated()\n }\n\n getAccessToken(): string | undefined {\n return this.sessionManager.getAccessToken()\n }\n\n getSessionDetails(): SignInResponse | null {\n return this.sessionManager.get()\n }\n\n getSessionId(): string | undefined {\n return this.sessionManager.getSessionId()\n }\n\n initializeAuth(): void {\n this.sessionManager.initialize()\n }\n}"]}
package/dist/index.mjs CHANGED
@@ -1411,7 +1411,7 @@ var SessionManager = class _SessionManager {
1411
1411
  }
1412
1412
  };
1413
1413
 
1414
- // src/auth/AuthService.ts
1414
+ // src/auth/authService.ts
1415
1415
  var BASE_URL = "/openauth/v1";
1416
1416
  var AuthService = class _AuthService {
1417
1417
  constructor(client) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/theme/tokens.ts","../src/theme/light.ts","../src/theme/dark.ts","../src/utils/localStorage.ts","../src/theme/ThemeProvider.tsx","../src/theme/useTheme.ts","../src/theme/ThemeToggle.tsx","../src/components/NotFoundPage.tsx","../src/http/HttpClient.ts","../src/components/LoginCallbackPage.tsx","../src/components/SidebarLayout.tsx","../src/components/ReadmeViewer/shikiHighlighter.ts","../src/components/ReadmeViewer/ReadmeViewer.tsx","../src/components/NotificationProvider/NotificationProvider.tsx","../src/components/ConfirmDialog.tsx","../src/utils/cn.ts","../src/utils/debounce.ts","../src/utils/throttle.ts","../src/utils/formatDate.ts","../src/auth/sessionManager.ts","../src/auth/AuthService.ts"],"names":["MuiThemeProvider","jsx","jsxs","useNavigate","useEffect","Box","Typography","IconButton","useState","className","createContext","useCallback","useContext","Button"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Design Tokens - Theme-agnostic values\n * These tokens serve as the foundation for light and dark themes\n * Following Material Design 3 principles\n */\n\n/**\n * Spacing scale based on 4px grid system\n */\nexport const spacing = {\n xs: '0.25rem', // 4px\n sm: '0.5rem', // 8px\n md: '1rem', // 16px\n lg: '1.5rem', // 24px\n xl: '2rem', // 32px\n '2xl': '3rem', // 48px\n '3xl': '4rem', // 64px\n} as const\n\n/**\n * Border radius tokens\n */\nexport const borderRadius = {\n none: '0',\n sm: '0.25rem', // 4px\n md: '0.375rem', // 6px\n lg: '0.5rem', // 8px\n xl: '0.75rem', // 12px\n '2xl': '1rem', // 16px\n full: '9999px',\n} as const\n\n/**\n * Typography scale\n */\nexport const fontSize = {\n xs: '0.75rem', // 12px\n sm: '0.875rem', // 14px\n md: '1rem', // 16px\n lg: '1.125rem', // 18px\n xl: '1.25rem', // 20px\n '2xl': '1.5rem', // 24px\n '3xl': '1.875rem', // 30px\n '4xl': '2.25rem', // 36px\n} as const\n\n/**\n * Font weights\n */\nexport const fontWeight = {\n light: '300',\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n} as const\n\n/**\n * Line heights\n */\nexport const lineHeight = {\n tight: '1.25',\n normal: '1.5',\n relaxed: '1.75',\n} as const\n\n/**\n * Elevation (box shadows) for depth perception\n */\nexport const elevation = {\n none: 'none',\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n} as const\n\n/**\n * Transition durations\n */\nexport const transition = {\n fast: '150ms',\n normal: '250ms',\n slow: '350ms',\n} as const\n\n/**\n * Z-index scale for layering\n */\nexport const zIndex = {\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n modalBackdrop: 1040,\n modal: 1050,\n popover: 1060,\n tooltip: 1070,\n} as const\n","import { spacing, borderRadius, fontSize, fontWeight, lineHeight, elevation, transition, zIndex } from './tokens'\nimport { Theme } from './types'\n\n/**\n * Light theme configuration\n * Colors are WCAG AA compliant with minimum contrast ratio of 4.5:1 for normal text\n * and 3:1 for large text\n */\nexport const lightTheme: Theme = {\n colors: {\n // Primary - Vibrant Indigo (Works beautifully on light backgrounds)\n primary: '#6366f1', // Indigo 500\n primaryHover: '#4f46e5', // Indigo 600\n primaryActive: '#4338ca', // Indigo 700\n\n // Secondary - Gray 600 (WCAG AAA compliant: 7.66:1 on white)\n secondary: '#4b5563',\n secondaryHover: '#374151',\n secondaryActive: '#1f2937',\n\n // Background colors\n background: '#ffffff',\n backgroundSecondary: '#f9fafb',\n backgroundTertiary: '#f3f4f6',\n\n // Surface colors (for cards, modals, etc.)\n surface: '#ffffff',\n surfaceHover: '#f9fafb',\n\n // Text colors (WCAG AAA compliant)\n text: '#111827', // Gray 900 (16.26:1 on white)\n textSecondary: '#4b5563', // Gray 600 (7.66:1 on white)\n textTertiary: '#6b7280', // Gray 500 (4.92:1 on white - AA compliant)\n textDisabled: '#9ca3af', // Gray 400\n\n // Semantic colors\n error: '#dc2626', // Red 600 (6.05:1 on white - AAA compliant)\n errorHover: '#b91c1c',\n errorBackground: '#fef2f2',\n\n success: '#16a34a', // Green 600 (5.15:1 on white - AAA compliant)\n successHover: '#15803d',\n successBackground: '#f0fdf4',\n\n warning: '#d97706', // Amber 600 (5.33:1 on white - AAA compliant)\n warningHover: '#b45309',\n warningBackground: '#fffbeb',\n\n info: '#2563eb', // Blue 600 (6.64:1 on white - AAA compliant)\n infoHover: '#1d4ed8',\n infoBackground: '#eff6ff',\n\n // Border colors\n border: '#e5e7eb', // Gray 200\n borderHover: '#d1d5db', // Gray 300\n borderFocus: '#6366f1', // Primary\n\n // Divider\n divider: '#e5e7eb',\n\n // Overlay (for modals, dropdowns)\n overlay: 'rgba(0, 0, 0, 0.5)',\n },\n\n spacing,\n borderRadius,\n fontSize,\n fontWeight,\n lineHeight,\n elevation,\n transition,\n zIndex,\n}\n","import { spacing, borderRadius, fontSize, fontWeight, lineHeight, elevation, transition, zIndex } from './tokens'\nimport { Theme } from './types'\n\n/**\n * Dark theme configuration\n * Colors are WCAG AA compliant with minimum contrast ratio of 4.5:1 for normal text\n * and 3:1 for large text on dark backgrounds\n */\nexport const darkTheme: Theme = {\n colors: {\n // Primary - Vibrant Indigo (Striking on VSCode Black)\n primary: '#a5b4fc', // Indigo 300 (lighter for better dark mode visibility)\n primaryHover: '#818cf8', // Indigo 400\n primaryActive: '#6366f1', // Indigo 500\n\n // Secondary - VSCode Gray\n secondary: '#858585',\n secondaryHover: '#a6a6a6',\n secondaryActive: '#cccccc',\n\n // Background colors\n background: '#1e1e1e', // Main editor/workspace background\n backgroundSecondary: '#252526', // Sidebar, panels\n backgroundTertiary: '#2d2d2d', // Highlights, smaller surfaces\n\n // Surface colors (for cards, modals, etc.)\n surface: '#252526',\n surfaceHover: '#2a2d2e',\n\n // Text colors\n text: '#cccccc', // Primary text\n textSecondary: '#999999', // Secondary text, comments\n textTertiary: '#6b6b6b', // Disabled/tertiary\n textDisabled: '#4d4d4d', // Disabled\n\n // Semantic colors\n error: '#f48771',\n errorHover: '#fca5a5',\n errorBackground: '#5a1d1d',\n\n success: '#89d185',\n successHover: '#86efac',\n successBackground: '#1e401e',\n\n warning: '#cca700',\n warningHover: '#d7ba7d',\n warningBackground: '#5c4d00',\n\n info: '#75beff',\n infoHover: '#9cdcfe',\n infoBackground: '#0a3254',\n\n // Border colors\n border: '#3c3c3c', // VSCode borders\n borderHover: '#444444',\n borderFocus: '#a5b4fc', // Focus border\n\n // Divider\n divider: '#333333',\n\n // Overlay (for modals, dropdowns)\n overlay: 'rgba(0, 0, 0, 0.4)',\n },\n\n spacing,\n borderRadius,\n fontSize,\n fontWeight,\n lineHeight,\n elevation,\n transition,\n zIndex,\n}\n","/**\n * LocalStorage utility for safely storing and retrieving data\n */\n\nexport class LocalStorage {\n /**\n * Get an item from localStorage\n * @param key - The key to retrieve\n * @returns The value or null if not found or error occurs\n */\n static getItem<T = string>(key: string): T | null {\n try {\n if (typeof window === 'undefined') {\n return null\n }\n \n const item = window.localStorage.getItem(key)\n \n if (item === null) {\n return null\n }\n \n try {\n return JSON.parse(item) as T\n } catch {\n // If JSON parse fails, return as string\n return item as T\n }\n } catch (error) {\n console.error(`Error getting item from localStorage: ${error}`)\n return null\n }\n }\n\n /**\n * Set an item in localStorage\n * @param key - The key to store\n * @param value - The value to store\n * @returns true if successful, false otherwise\n */\n static setItem<T>(key: string, value: T): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n const serializedValue = typeof value === 'string' \n ? value \n : JSON.stringify(value)\n \n window.localStorage.setItem(key, serializedValue)\n return true\n } catch (error) {\n console.error(`Error setting item in localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Remove an item from localStorage\n * @param key - The key to remove\n * @returns true if successful, false otherwise\n */\n static removeItem(key: string): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n window.localStorage.removeItem(key)\n return true\n } catch (error) {\n console.error(`Error removing item from localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Clear all items from localStorage\n * @returns true if successful, false otherwise\n */\n static clear(): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n window.localStorage.clear()\n return true\n } catch (error) {\n console.error(`Error clearing localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Check if a key exists in localStorage\n * @param key - The key to check\n * @returns true if key exists, false otherwise\n */\n static hasItem(key: string): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n return window.localStorage.getItem(key) !== null\n } catch (error) {\n console.error(`Error checking item in localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Get all keys from localStorage\n * @returns Array of keys\n */\n static keys(): string[] {\n try {\n if (typeof window === 'undefined') {\n return []\n }\n \n return Object.keys(window.localStorage)\n } catch (error) {\n console.error(`Error getting keys from localStorage: ${error}`)\n return []\n }\n }\n}\n","import React, { createContext, useState, ReactNode, useCallback, useEffect, useMemo } from 'react'\nimport { Theme, ThemeContextValue, ThemeMode, ResolvedThemeMode } from './types'\nimport { lightTheme } from './light'\nimport { darkTheme } from './dark'\nimport { LocalStorage } from '../utils/localStorage'\nimport { ThemeProvider as MuiThemeProvider, createTheme, CssBaseline } from '@mui/material'\n\nexport const ThemeContext = createContext<ThemeContextValue | undefined>(undefined)\n\nconst THEME_STORAGE_KEY = 'app-theme-mode'\n\nexport interface ThemeProviderProps {\n children: ReactNode\n /** Custom theme object (overrides default light/dark themes) */\n initialTheme?: Theme\n /** Initial theme mode */\n initialMode?: ThemeMode\n /** localStorage key for persisting theme preference */\n storageKey?: string\n /** Enable CSS variables injection */\n enableCssVariables?: boolean\n}\n\n/**\n * Detects system color scheme preference\n */\nconst getSystemTheme = (): ResolvedThemeMode => {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\n/**\n * Applies theme as CSS variables to document root\n */\nconst applyCssVariables = (theme: Theme, resolvedMode: ResolvedThemeMode): void => {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n\n // Set data attribute for theme mode\n root.setAttribute('data-theme', resolvedMode)\n\n // Apply color variables\n Object.entries(theme.colors).forEach(([key, value]) => {\n root.style.setProperty(`--color-${key.replace(/([A-Z])/g, '-$1').toLowerCase()}`, value)\n })\n\n // Apply spacing variables\n Object.entries(theme.spacing).forEach(([key, value]) => {\n root.style.setProperty(`--spacing-${key}`, value)\n })\n\n // Apply border radius variables\n Object.entries(theme.borderRadius).forEach(([key, value]) => {\n root.style.setProperty(`--radius-${key}`, value)\n })\n\n // Apply font size variables\n Object.entries(theme.fontSize).forEach(([key, value]) => {\n root.style.setProperty(`--text-${key}`, value)\n })\n\n // Apply font weight variables\n Object.entries(theme.fontWeight).forEach(([key, value]) => {\n root.style.setProperty(`--font-${key}`, value)\n })\n\n // Apply line height variables\n Object.entries(theme.lineHeight).forEach(([key, value]) => {\n root.style.setProperty(`--leading-${key}`, value)\n })\n\n // Apply elevation variables\n Object.entries(theme.elevation).forEach(([key, value]) => {\n root.style.setProperty(`--shadow-${key}`, value)\n })\n\n // Apply transition variables\n Object.entries(theme.transition).forEach(([key, value]) => {\n root.style.setProperty(`--transition-${key}`, value)\n })\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n initialTheme,\n initialMode = 'system',\n storageKey = THEME_STORAGE_KEY,\n enableCssVariables = true,\n}) => {\n // Load theme mode from localStorage or use initialMode\n const getInitialMode = (): ThemeMode => {\n const savedMode = LocalStorage.getItem<ThemeMode>(storageKey)\n return savedMode || initialMode\n }\n\n const [themeMode, setThemeModeState] = useState<ThemeMode>(getInitialMode)\n const [systemTheme, setSystemTheme] = useState<ResolvedThemeMode>(getSystemTheme)\n const [customTheme, setCustomTheme] = useState<Theme | undefined>(initialTheme)\n\n // Calculate resolved theme mode\n const resolvedThemeMode: ResolvedThemeMode = useMemo(() => {\n if (themeMode === 'system') return systemTheme\n return themeMode as ResolvedThemeMode\n }, [themeMode, systemTheme])\n\n // Get current theme\n const theme: Theme = useMemo(() => {\n if (customTheme) return customTheme\n return resolvedThemeMode === 'light' ? lightTheme : darkTheme\n }, [customTheme, resolvedThemeMode])\n\n // Listen for system theme changes\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n\n const handleChange = (e: MediaQueryListEvent) => {\n setSystemTheme(e.matches ? 'dark' : 'light')\n }\n\n // Modern browsers\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange)\n return () => mediaQuery.removeEventListener('change', handleChange)\n }\n // Legacy browsers\n else if (mediaQuery.addListener) {\n mediaQuery.addListener(handleChange)\n return () => mediaQuery.removeListener(handleChange)\n }\n }, [])\n\n // Apply CSS variables when theme changes\n useEffect(() => {\n if (enableCssVariables) {\n applyCssVariables(theme, resolvedThemeMode)\n }\n }, [theme, resolvedThemeMode, enableCssVariables])\n\n // Save theme mode to localStorage whenever it changes\n useEffect(() => {\n LocalStorage.setItem(storageKey, themeMode)\n }, [themeMode, storageKey])\n\n const setThemeMode = useCallback((mode: ThemeMode) => {\n setThemeModeState(mode)\n }, [])\n\n const setTheme = useCallback((newTheme: Theme) => {\n setCustomTheme(newTheme)\n }, [])\n\n const toggleTheme = useCallback(() => {\n setThemeModeState((prevMode) => {\n if (prevMode === 'light') return 'dark'\n if (prevMode === 'dark') return 'system'\n return 'light'\n })\n }, [])\n\n const contextValue: ThemeContextValue = useMemo(() => ({\n theme,\n themeMode,\n resolvedThemeMode,\n setTheme,\n setThemeMode,\n toggleTheme,\n }), [theme, themeMode, resolvedThemeMode, setTheme, setThemeMode, toggleTheme])\n\n const muiTheme = useMemo(() => createTheme({\n palette: {\n mode: resolvedThemeMode,\n primary: {\n main: theme.colors.primary,\n },\n secondary: {\n main: theme.colors.secondary,\n },\n error: {\n main: theme.colors.error,\n },\n success: {\n main: theme.colors.success,\n },\n background: {\n default: theme.colors.background,\n paper: theme.colors.backgroundSecondary,\n },\n text: {\n primary: theme.colors.text,\n secondary: theme.colors.textSecondary,\n }\n },\n }), [resolvedThemeMode, theme])\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <MuiThemeProvider theme={muiTheme}>\n <CssBaseline />\n {children}\n </MuiThemeProvider>\n </ThemeContext.Provider>\n )\n}\n","import { useContext } from 'react'\nimport { ThemeContext } from './ThemeProvider'\nimport { ThemeContextValue } from './types'\n\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext)\n \n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n \n return context\n}\n","import React from 'react'\nimport { IconButton, IconButtonProps, Tooltip } from '@mui/material'\nimport { DarkMode, LightMode, BrightnessAuto } from '@mui/icons-material'\nimport { useTheme } from './useTheme'\n\nexport interface ThemeToggleProps extends Omit<IconButtonProps, 'onClick'> {\n /**\n * Tooltip text for light mode\n * @default \"Switch to dark mode\"\n */\n lightModeTooltip?: string\n\n /**\n * Tooltip text for dark mode\n * @default \"Switch to system mode\"\n */\n darkModeTooltip?: string\n\n /**\n * Tooltip text for system mode\n * @default \"Switch to light mode\"\n */\n systemModeTooltip?: string\n\n /**\n * Whether to show tooltip\n * @default true\n */\n showTooltip?: boolean\n}\n\n/**\n * A round button component for toggling between light, dark, and system themes\n */\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({\n lightModeTooltip = 'Switch to dark mode',\n darkModeTooltip = 'Switch to system theme',\n systemModeTooltip = 'Switch to light theme',\n showTooltip = true,\n sx,\n ...props\n}) => {\n const { themeMode, toggleTheme } = useTheme()\n\n const getIcon = () => {\n switch (themeMode) {\n case 'light':\n return <LightMode />\n case 'dark':\n return <DarkMode />\n case 'system':\n return <BrightnessAuto />\n default:\n return <BrightnessAuto />\n }\n }\n\n const getTooltip = () => {\n switch (themeMode) {\n case 'light':\n return lightModeTooltip\n case 'dark':\n return darkModeTooltip\n case 'system':\n return systemModeTooltip\n default:\n return lightModeTooltip\n }\n }\n\n const button = (\n <IconButton\n onClick={toggleTheme}\n color=\"inherit\"\n sx={{\n borderRadius: '50%',\n ...sx\n }}\n {...props}\n >\n {getIcon()}\n </IconButton>\n )\n\n if (!showTooltip) {\n return button\n }\n\n return (\n <Tooltip title={getTooltip()} arrow>\n {button}\n </Tooltip>\n )\n}\n","import { Box, Typography, Button } from '@mui/material'\nimport { SentimentDissatisfied } from '@mui/icons-material'\nimport { useNavigate } from 'react-router-dom'\nimport { useTheme } from '../theme'\n\nexport function NotFoundPage() {\n const navigate = useNavigate()\n const { theme } = useTheme()\n\n return (\n <Box\n sx={{\n minHeight: '100vh',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.colors.backgroundSecondary,\n gap: 2,\n textAlign: 'center',\n px: 2,\n }}\n >\n <SentimentDissatisfied sx={{ fontSize: 72, color: 'text.disabled' }} />\n <Typography variant=\"h2\" fontWeight=\"bold\" color=\"text.primary\">\n 404\n </Typography>\n <Typography variant=\"h6\" color=\"text.secondary\">\n Page not found\n </Typography>\n <Typography variant=\"body2\" color=\"text.disabled\" sx={{ maxWidth: 360 }}>\n The page you're looking for doesn't exist or has been moved.\n </Typography>\n <Button\n variant=\"contained\"\n sx={{ mt: 2, textTransform: 'none' }}\n onClick={() => navigate('/', { replace: true })}\n >\n Go to Home\n </Button>\n </Box>\n )\n}\n","import { HttpClientConfig, RequestConfig, HttpResponse, HttpError } from './types'\n\nexport class HttpClient {\n private baseURL: string\n private timeout: number\n private defaultHeaders: Record<string, string>\n\n constructor(config: HttpClientConfig = {}) {\n this.baseURL = config.baseURL || ''\n this.timeout = config.timeout || 30000\n this.defaultHeaders = config.headers || {}\n }\n\n private buildURL(url: string, params?: Record<string, string | number | boolean>): string {\n const fullURL = url.startsWith('http') ? url : `${this.baseURL}${url}`\n \n if (!params) return fullURL\n \n const searchParams = new URLSearchParams()\n Object.entries(params).forEach(([key, value]) => {\n searchParams.append(key, String(value))\n })\n \n return `${fullURL}?${searchParams.toString()}`\n }\n\n private async request<T = any>(\n url: string,\n config: RequestConfig = {}\n ): Promise<HttpResponse<T>> {\n const { params, data, timeout = this.timeout, headers = {}, ...restConfig } = config\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(this.buildURL(url, params), {\n ...restConfig,\n headers: {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...headers,\n },\n body: data ? JSON.stringify(data) : undefined,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const error: HttpError = new Error(`HTTP Error: ${response.statusText}`)\n error.status = response.status\n error.statusText = response.statusText\n try {\n error.data = await response.json()\n } catch {\n error.data = { code: response.status, message: await response.text() }\n }\n throw error\n }\n\n const responseData = await response.json()\n\n return {\n data: responseData as T,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n }\n } catch (error) {\n clearTimeout(timeoutId)\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error('Request timeout')\n }\n throw error\n }\n }\n\n setDefaultHeader(key: string, value: string): void {\n this.defaultHeaders[key] = value\n }\n\n removeDefaultHeader(key: string): void {\n delete this.defaultHeaders[key]\n }\n\n getDefaultHeaders(): Record<string, string> {\n return { ...this.defaultHeaders }\n }\n\n get<T = any>(url: string, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, method: 'GET' })\n }\n\n post<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'POST' })\n }\n\n put<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'PUT' })\n }\n\n patch<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'PATCH' })\n }\n\n delete<T = any>(url: string, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, method: 'DELETE' })\n }\n}\n\nexport function extractErrorMessage(error: any): string {\n if (error instanceof Error) {\n const httpError = error as HttpError\n if (httpError.data) {\n return httpError.data.message\n }\n return error.message\n }\n return 'An unexpected error occurred'\n}\n","import { useEffect } from 'react'\nimport { Box, CircularProgress, Typography } from '@mui/material'\nimport { useNavigate, useSearchParams } from 'react-router-dom'\nimport { extractErrorMessage } from '../http'\nimport { useTheme } from '../theme'\nimport type { IAuthService } from '../auth'\n\nexport interface LoginCallbackPageProps {\n authService: IAuthService\n navigateTo?: string\n onLoginFailed?: () => void\n}\n\nexport function LoginCallbackPage({ authService, navigateTo = '/', onLoginFailed }: LoginCallbackPageProps) {\n const [searchParams] = useSearchParams()\n const navigate = useNavigate()\n const { theme } = useTheme()\n\n useEffect(() => {\n const loginToken = searchParams.get('login_token')\n\n if (!loginToken) {\n console.error('Login callback failed: Missing login_token in query parameters')\n onLoginFailed?.()\n return\n }\n authService\n .signInWithLoginToken({ loginToken })\n .then(() => {\n navigate(navigateTo, { replace: true })\n })\n .catch((err: unknown) => {\n console.error('Login callback failed:', extractErrorMessage(err))\n onLoginFailed?.()\n })\n }, [])\n\n return (\n <Box\n sx={{\n minHeight: '100vh',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n background: `linear-gradient(135deg, ${theme.colors.primary} 0%, ${theme.colors.primaryActive} 100%)`,\n gap: 2,\n }}\n >\n <CircularProgress sx={{ color: theme.colors.surface }} />\n <Typography variant=\"body2\" sx={{ color: theme.colors.surface, opacity: 0.85 }}>\n Signing you in…\n </Typography>\n </Box>\n )\n}\n","import React, { useState, useEffect, ReactNode, CSSProperties } from 'react'\nimport {\n Drawer,\n List,\n ListItem,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n Box,\n Typography,\n Collapse,\n IconButton\n} from '@mui/material'\nimport { ExpandLess, ExpandMore } from '@mui/icons-material'\nimport { BrowserRouter, NavLink, Outlet, useLocation, Routes, Route } from 'react-router-dom'\n\n/**\n * Menu item configuration\n */\nexport interface MenuItem {\n /** Unique identifier */\n id: string\n /** Display label */\n label: string\n /** Optional icon element */\n icon?: ReactNode\n /** Route path (for router mode) */\n path?: string\n /** Component to render (for non-router mode) */\n component?: ReactNode\n /** Optional submenu items */\n children?: MenuItem[]\n}\n\nexport interface SidebarLayoutProps {\n /** Array of menu items */\n menuItems: MenuItem[]\n /** Width of the sidebar */\n sidebarWidth?: string | number\n /** Additional CSS class for container */\n className?: string\n /** Default selected menu item ID (for non-router mode) */\n defaultSelected?: string\n /** Callback when menu changes */\n onMenuChange?: (id: string) => void\n /** Custom styles for container */\n style?: CSSProperties\n /** Custom styles for sidebar */\n sidebarStyle?: CSSProperties\n /** Custom styles for body */\n bodyStyle?: CSSProperties\n /** Default expanded submenu IDs */\n defaultExpanded?: string[]\n /** If true, wraps SidebarLayout in BrowserRouter and enables router-based navigation */\n isRouter?: boolean\n}\n\n\n\n/**\n * Recursive menu item renderer for router mode\n */\nconst RouterMenuItem: React.FC<{\n item: MenuItem\n depth?: number\n expanded: Set<string>\n onToggle: (id: string) => void\n}> = ({ item, depth = 0, expanded, onToggle }) => {\n const hasChildren = item.children && item.children.length > 0\n const isExpanded = expanded.has(item.id)\n\n return (\n <>\n <ListItem disablePadding>\n <ListItemButton\n component={hasChildren ? 'div' : NavLink}\n to={!hasChildren ? (item.path || `/${item.id}`) : undefined}\n end={false}\n onClick={hasChildren ? () => onToggle(item.id) : undefined}\n sx={{\n pl: 2 + depth * 2,\n '&.active': {\n backgroundColor: 'action.selected',\n color: 'primary.main',\n borderLeft: 3,\n borderColor: 'primary.main',\n fontWeight: 'medium',\n '& .MuiListItemIcon-root': {\n color: 'primary.main',\n },\n },\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n transition: 'all 0.15s',\n }}\n >\n {item.icon && (\n <ListItemIcon sx={{ minWidth: 40 }}>\n {item.icon}\n </ListItemIcon>\n )}\n <ListItemText\n primary={item.label}\n primaryTypographyProps={{\n fontSize: '0.875rem',\n }}\n />\n {hasChildren && (\n <IconButton size=\"small\" sx={{ p: 0 }}>\n {isExpanded ? <ExpandLess /> : <ExpandMore />}\n </IconButton>\n )}\n </ListItemButton>\n </ListItem>\n {hasChildren && (\n <Collapse in={isExpanded} timeout=\"auto\" unmountOnExit>\n <List component=\"div\" disablePadding>\n {item.children!.map((child) => (\n <RouterMenuItem\n key={child.id}\n item={child}\n depth={depth + 1}\n expanded={expanded}\n onToggle={onToggle}\n />\n ))}\n </List>\n </Collapse>\n )}\n </>\n )\n}\n\n/**\n * Helper to flatten menu items into routes\n */\nconst flattenMenuRoutes = (items: MenuItem[]): Array<{ path: string; component: ReactNode }> => {\n const routes: Array<{ path: string; component: ReactNode }> = []\n\n const flatten = (menuItems: MenuItem[]) => {\n for (const item of menuItems) {\n if (item.path && item.component) {\n routes.push({ path: item.path, component: item.component })\n }\n if (item.children) {\n flatten(item.children)\n }\n }\n }\n\n flatten(items)\n return routes\n}\n\n/**\n * Inner component for Router-based Sidebar Layout\n * (Must be rendered inside a Router context to use useLocation)\n */\nconst SidebarLayoutRouterInner: React.FC<SidebarLayoutProps> = ({\n menuItems,\n sidebarWidth = 250,\n className = '',\n onMenuChange,\n style,\n sidebarStyle,\n bodyStyle,\n defaultExpanded = [],\n}) => {\n const location = useLocation()\n const [expanded, setExpanded] = useState<Set<string>>(new Set(defaultExpanded))\n\n const handleToggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }\n\n useEffect(() => {\n if (onMenuChange) {\n const findActiveItem = (items: MenuItem[]): MenuItem | undefined => {\n for (const item of items) {\n if (item.path && location.pathname === item.path) {\n return item\n }\n if (item.children) {\n const found = findActiveItem(item.children)\n if (found) return found\n }\n }\n return undefined\n }\n\n const activeItem = findActiveItem(menuItems)\n if (activeItem) {\n onMenuChange(activeItem.id)\n }\n }\n }, [location.pathname, menuItems, onMenuChange])\n\n // Check if menu items have components - if so, render routes internally\n const hasComponents = menuItems.some(item =>\n item.component || (item.children?.some(child => child.component))\n )\n\n const routes = hasComponents ? flattenMenuRoutes(menuItems) : []\n\n return (\n <Box\n className={className}\n sx={{\n display: 'flex',\n height: '100%',\n width: '100%',\n ...style,\n }}\n >\n <Drawer\n variant=\"permanent\"\n sx={{\n width: sidebarWidth,\n flexShrink: 0,\n '& .MuiDrawer-paper': {\n width: sidebarWidth,\n boxSizing: 'border-box',\n position: 'relative',\n borderRight: '1px solid',\n borderColor: 'divider',\n ...sidebarStyle,\n },\n }}\n >\n <List sx={{ p: 0 }}>\n {menuItems.filter(item => item.label).map((item) => (\n <RouterMenuItem\n key={item.id}\n item={item}\n expanded={expanded}\n onToggle={handleToggle}\n />\n ))}\n </List>\n </Drawer>\n\n <Box\n component=\"main\"\n sx={{\n flexGrow: 1,\n overflow: 'auto',\n ...bodyStyle,\n }}\n >\n {hasComponents ? (\n <Routes>\n {routes.map(({ path, component }) => (\n <Route\n key={path}\n path={path}\n element={component}\n />\n ))}\n </Routes>\n ) : (\n <Outlet />\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * Wrapper for Router-based Sidebar Layout\n */\nconst SidebarLayoutWithRouter: React.FC<SidebarLayoutProps> = (props) => {\n return (\n // @ts-expect-error - future prop exists in v6 for v7 migration, but is removed from v7 types\n <BrowserRouter future={{ v7_startTransition: true, v7_relativeSplatPath: true }}>\n <SidebarLayoutRouterInner {...props} />\n </BrowserRouter>\n )\n}\n\n/**\n * Recursive menu item renderer for state mode\n */\nconst StateMenuItem: React.FC<{\n item: MenuItem\n selectedId: string\n depth?: number\n expanded: Set<string>\n onToggle: (id: string) => void\n onClick: (id: string) => void\n}> = ({ item, selectedId, depth = 0, expanded, onToggle, onClick }) => {\n const hasChildren = item.children && item.children.length > 0\n const isExpanded = expanded.has(item.id)\n const isActive = item.id === selectedId\n\n const handleClick = () => {\n if (hasChildren) {\n onToggle(item.id)\n } else {\n onClick(item.id)\n }\n }\n\n return (\n <>\n <ListItem disablePadding>\n <ListItemButton\n selected={isActive}\n onClick={handleClick}\n sx={{\n pl: 2 + depth * 2,\n '&.Mui-selected': {\n backgroundColor: 'action.selected',\n color: 'primary.main',\n borderLeft: 3,\n borderColor: 'primary.main',\n fontWeight: 'medium',\n '& .MuiListItemIcon-root': {\n color: 'primary.main',\n },\n '&:hover': {\n backgroundColor: 'action.selected',\n },\n },\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n transition: 'all 0.15s',\n }}\n >\n {item.icon && (\n <ListItemIcon sx={{ minWidth: 40 }}>\n {item.icon}\n </ListItemIcon>\n )}\n <ListItemText\n primary={item.label}\n primaryTypographyProps={{\n fontSize: '0.875rem',\n }}\n />\n {hasChildren && (\n <IconButton size=\"small\" sx={{ p: 0 }}>\n {isExpanded ? <ExpandLess /> : <ExpandMore />}\n </IconButton>\n )}\n </ListItemButton>\n </ListItem>\n {hasChildren && (\n <Collapse in={isExpanded} timeout=\"auto\" unmountOnExit>\n <List component=\"div\" disablePadding>\n {item.children!.map((child) => (\n <StateMenuItem\n key={child.id}\n item={child}\n selectedId={selectedId}\n depth={depth + 1}\n expanded={expanded}\n onToggle={onToggle}\n onClick={onClick}\n />\n ))}\n </List>\n </Collapse>\n )}\n </>\n )\n}\n\n/**\n * State-based Sidebar Layout Component (Fallback)\n */\nconst SidebarLayoutWithState: React.FC<SidebarLayoutProps> = ({\n menuItems,\n sidebarWidth = 250,\n className = '',\n defaultSelected,\n onMenuChange,\n style,\n sidebarStyle,\n bodyStyle,\n defaultExpanded = [],\n}) => {\n const [selectedId, setSelectedId] = useState<string>(\n defaultSelected || menuItems[0]?.id\n )\n const [expanded, setExpanded] = useState<Set<string>>(new Set(defaultExpanded))\n\n const handleToggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }\n\n const handleMenuClick = (id: string) => {\n setSelectedId(id)\n if (onMenuChange) {\n onMenuChange(id)\n }\n }\n\n const findActiveItem = (items: MenuItem[], id: string): MenuItem | undefined => {\n for (const item of items) {\n if (item.id === id) return item\n if (item.children) {\n const found = findActiveItem(item.children, id)\n if (found) return found\n }\n }\n return undefined\n }\n\n const activeItem = findActiveItem(menuItems, selectedId)\n\n return (\n <Box\n className={className}\n sx={{\n display: 'flex',\n height: '100%',\n width: '100%',\n ...style,\n }}\n >\n <Drawer\n variant=\"permanent\"\n sx={{\n width: sidebarWidth,\n flexShrink: 0,\n '& .MuiDrawer-paper': {\n width: sidebarWidth,\n boxSizing: 'border-box',\n position: 'relative',\n borderRight: '1px solid',\n borderColor: 'divider',\n ...sidebarStyle,\n },\n }}\n >\n <List sx={{ p: 0 }}>\n {menuItems.filter(item => item.label).map((item) => (\n <StateMenuItem\n key={item.id}\n item={item}\n selectedId={selectedId}\n expanded={expanded}\n onToggle={handleToggle}\n onClick={handleMenuClick}\n />\n ))}\n </List>\n </Drawer>\n\n <Box\n component=\"main\"\n sx={{\n flexGrow: 1,\n overflow: 'auto',\n p: 3,\n ...bodyStyle,\n }}\n >\n {activeItem?.component || (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ textAlign: 'center', mt: 4 }}\n >\n No content available for this menu item\n </Typography>\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * SidebarLayout Component\n * \n * A flexible sidebar-body layout component built with Material UI that supports \n * both router-based and state-based navigation with nested submenu support.\n * \n * **Uses Material UI Components:**\n * - Drawer (permanent variant)\n * - List, ListItem, ListItemButton\n * - ListItemIcon, ListItemText\n * - Collapse (for submenus)\n * - Box for layout\n * \n * **Features:**\n * - Nested submenu support with expand/collapse\n * - Material UI icons (ExpandMore/ExpandLess)\n * - Recursive rendering for deep nesting\n * - Automatic indentation based on depth\n * \n * **Router Mode** (when react-router-dom is available):\n * - Uses NavLink for navigation\n * - Renders child routes via Outlet\n * - Supports URL-based navigation\n * - Browser back/forward works\n * \n * **State Mode** (fallback):\n * - Uses internal state\n * - Renders components from menuItems\n * - Simple navigation without routing\n * \n * @example\n * // With nested submenus\n * <SidebarLayout\n * menuItems={[\n * {\n * id: 'products',\n * label: 'Products',\n * icon: <ShoppingCartIcon />,\n * children: [\n * { id: 'all-products', label: 'All Products', path: '/products/all' },\n * { id: 'categories', label: 'Categories', path: '/products/categories' }\n * ]\n * },\n * { id: 'dashboard', label: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> }\n * ]}\n * defaultExpanded={['products']}\n * />\n * \n * @example\n * // With React Router\n * <Routes>\n * <Route path=\"/\" element={\n * <SidebarLayout menuItems={[\n * { id: 'dashboard', label: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> },\n * { id: 'settings', label: 'Settings', path: '/settings', icon: <SettingsIcon /> }\n * ]} />\n * }>\n * <Route path=\"dashboard\" element={<Dashboard />} />\n * <Route path=\"settings\" element={<Settings />} />\n * </Route>\n * </Routes>\n * \n * @example\n * // Without React Router (State-based)\n * <SidebarLayout\n * menuItems={[\n * { id: 'dashboard', label: 'Dashboard', component: <Dashboard /> },\n * { id: 'settings', label: 'Settings', component: <Settings /> }\n * ]}\n * defaultSelected=\"dashboard\"\n * />\n */\nexport const SidebarLayout: React.FC<SidebarLayoutProps> = (props) => {\n // If explicitly requested to be a router, or implicitly requested because items have paths\n // AND NOT explicitly disabling the router.\n if (props.isRouter) {\n return <SidebarLayoutWithRouter {...props} />\n }\n\n return <SidebarLayoutWithState {...props} />\n}\n","import { createHighlighter, Highlighter } from 'shiki';\n\nlet highlighterInstance: Highlighter | null = null;\nlet highlighterPromise: Promise<Highlighter> | null = null;\n\nexport const getHighlighter = async (): Promise<Highlighter> => {\n if (highlighterInstance) {\n return highlighterInstance;\n }\n\n if (highlighterPromise) {\n return highlighterPromise;\n }\n\n highlighterPromise = createHighlighter({\n themes: ['github-light', 'github-dark'],\n langs: ['js', 'ts', 'go', 'json', 'bash', 'yaml', 'md', 'python', 'java', 'cpp', 'c', 'html', 'css', 'sql', 'http', 'text'],\n }).then(highlighter => {\n highlighterInstance = highlighter;\n return highlighter;\n });\n\n return highlighterPromise;\n};\n","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport { Highlighter } from 'shiki';\nimport './github-markdown.css';\nimport 'katex/dist/katex.min.css';\n\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { getHighlighter } from './shikiHighlighter';\n\ninterface ReadmeViewerProps {\n content: string;\n className?: string;\n isDark?: boolean;\n muiTheme?: any;\n}\n\nconst ReadmeViewer: React.FC<ReadmeViewerProps> = ({\n content,\n className = '',\n isDark: propIsDark,\n muiTheme,\n}) => {\n const isDark = propIsDark !== undefined ? propIsDark : (muiTheme?.palette?.mode === 'dark');\n const [highlighter, setHighlighter] = useState<Highlighter | null>(null);\n const [copiedBlocks, setCopiedBlocks] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n getHighlighter().then(setHighlighter);\n }, []);\n\n const copyToClipboard = async (text: string, blockId: string) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopiedBlocks(prev => new Set(prev).add(blockId));\n setTimeout(() => {\n setCopiedBlocks(prev => {\n const newSet = new Set(prev);\n newSet.delete(blockId);\n return newSet;\n });\n }, 2000);\n } catch (err) {\n console.error('Failed to copy text: ', err);\n }\n };\n\n\n return (\n <div className={`readme-viewer markdown-body ${className}`}>\n <style>{`\n .shiki-wrapper pre.shiki {\n padding: 16px !important;\n border-radius: 8px !important;\n overflow-x: auto;\n margin-bottom: 16px;\n border: 1px solid var(--md-sys-color-outline-variant, #e0e0e0);\n }\n `}</style>\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeKatex]}\n components={{\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || '');\n\n if (match && highlighter) {\n const codeText = String(children).replace(/\\n$/, '');\n const blockId = `code-${Math.random().toString(36).substr(2, 9)}`;\n\n let highlightedHtml = '';\n try {\n highlightedHtml = highlighter.codeToHtml(codeText, {\n lang: match[1],\n theme: isDark ? 'github-dark' : 'github-light',\n });\n } catch (e) {\n // Graceful fallback if language is unsupported by shiki\n try {\n highlightedHtml = highlighter.codeToHtml(codeText, {\n lang: 'text',\n theme: isDark ? 'github-dark' : 'github-light',\n });\n } catch (fallbackError) {\n // Ultimate fallback to just safely escaping text\n highlightedHtml = `<pre><code>${codeText}</code></pre>`;\n }\n }\n\n return (\n <div style={{ position: 'relative' }}>\n <div className=\"shiki-wrapper\" dangerouslySetInnerHTML={{ __html: highlightedHtml }} />\n <button\n onClick={() => copyToClipboard(codeText, blockId)}\n style={{\n position: 'absolute',\n top: '8px',\n right: '8px',\n backgroundColor: 'var(--md-sys-color-surface-container-high)',\n border: '1px solid var(--md-sys-color-outline-variant)',\n borderRadius: '4px',\n padding: '6px',\n fontSize: '14px',\n cursor: 'pointer',\n color: 'var(--md-sys-color-on-surface-variant)',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s ease',\n width: '32px',\n height: '32px',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = isDark\n ? 'var(--md-sys-color-surface-container-highest)'\n : 'var(--md-sys-color-surface-container-high)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = isDark\n ? 'var(--md-sys-color-surface-container-high)'\n : 'var(--md-sys-color-surface-container-highest)';\n }}\n title={copiedBlocks.has(blockId) ? 'Copied!' : 'Copy code'}\n >\n {copiedBlocks.has(blockId) ? (\n <CheckIcon style={{ fontSize: '16px' }} />\n ) : (\n <ContentCopyIcon style={{ fontSize: '16px' }} />\n )}\n </button>\n </div>\n );\n }\n\n return (\n <code className={className} {...props}>\n {children}\n </code>\n );\n },\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n};\n\nexport default ReadmeViewer;\n","import React, { createContext, useContext, useState, ReactNode, useCallback } from 'react'\nimport { Snackbar, Alert, AlertColor } from '@mui/material'\n\n/**\n * Notification type representing a toast message\n */\nexport interface Notification {\n id: string\n message: string\n type: AlertColor\n duration?: number\n}\n\n/**\n * Context interface for notification management\n */\nexport interface NotificationContextType {\n showNotification: (message: string, type: AlertColor, duration?: number) => void\n success: (message: string, duration?: number) => void\n error: (message: string, duration?: number) => void\n warning: (message: string, duration?: number) => void\n info: (message: string, duration?: number) => void\n}\n\nconst NotificationContext = createContext<NotificationContextType | undefined>(undefined)\n\nexport interface NotificationProviderProps {\n /** Components to wrap with notification context */\n children: ReactNode\n /** Default duration for notifications in milliseconds. Defaults to 6000ms */\n defaultDuration?: number\n /** Maximum number of notifications to show at once. Defaults to 3 */\n maxNotifications?: number\n /** Position of the notifications. Defaults to top-right */\n anchorOrigin?: {\n vertical: 'top' | 'bottom'\n horizontal: 'left' | 'center' | 'right'\n }\n}\n\n/**\n * NotificationProvider manages toast notifications using Material-UI Snackbar and Alert.\n * Provides methods to show success, error, warning, and info notifications.\n * \n * @example\n * ```tsx\n * <NotificationProvider>\n * <App />\n * </NotificationProvider>\n * ```\n * \n * // In a component:\n * ```tsx\n * const { success, error } = useNotification()\n * success('Operation completed!')\n * error('Something went wrong')\n * ```\n */\nexport const NotificationProvider: React.FC<NotificationProviderProps> = ({\n children,\n defaultDuration = 6000,\n maxNotifications = 3,\n anchorOrigin = { vertical: 'top', horizontal: 'right' }\n}) => {\n const [notifications, setNotifications] = useState<Notification[]>([])\n\n const showNotification = useCallback((\n message: string,\n type: AlertColor,\n duration: number = defaultDuration\n ) => {\n const id = `${Date.now()}-${Math.random()}`\n const newNotification: Notification = { id, message, type, duration }\n\n setNotifications((prev) => {\n // Limit the number of notifications\n const updated = [...prev, newNotification]\n if (updated.length > maxNotifications) {\n return updated.slice(updated.length - maxNotifications)\n }\n return updated\n })\n }, [defaultDuration, maxNotifications])\n\n const handleClose = useCallback((id: string) => {\n setNotifications((prev) => prev.filter((notif) => notif.id !== id))\n }, [])\n\n const success = useCallback((message: string, duration?: number) => {\n showNotification(message, 'success', duration)\n }, [showNotification])\n\n const error = useCallback((message: string, duration?: number) => {\n showNotification(message, 'error', duration)\n }, [showNotification])\n\n const warning = useCallback((message: string, duration?: number) => {\n showNotification(message, 'warning', duration)\n }, [showNotification])\n\n const info = useCallback((message: string, duration?: number) => {\n showNotification(message, 'info', duration)\n }, [showNotification])\n\n const contextValue: NotificationContextType = {\n showNotification,\n success,\n error,\n warning,\n info\n }\n\n return (\n <NotificationContext.Provider value={contextValue}>\n {children}\n {notifications.map((notification, index) => (\n <Snackbar\n key={notification.id}\n open={true}\n autoHideDuration={notification.duration}\n onClose={() => handleClose(notification.id)}\n anchorOrigin={anchorOrigin}\n style={{\n marginTop: index * 70 // Stack notifications vertically\n }}\n >\n <Alert\n onClose={() => handleClose(notification.id)}\n severity={notification.type}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {notification.message}\n </Alert>\n </Snackbar>\n ))}\n </NotificationContext.Provider>\n )\n}\n\n/**\n * Hook to access notification context\n * Must be used within a NotificationProvider\n * \n * @example\n * ```tsx\n * const { success, error, warning, info } = useNotification()\n * \n * // Show notifications\n * success('Data saved successfully!')\n * error('Failed to save data')\n * warning('This action cannot be undone')\n * info('New update available')\n * \n * // With custom duration\n * success('Quick message', 3000)\n * ```\n */\nexport const useNotification = (): NotificationContextType => {\n const context = useContext(NotificationContext)\n if (!context) {\n throw new Error('useNotification must be used within a NotificationProvider')\n }\n return context\n}\n","import {\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Typography,\n} from '@mui/material'\nimport WarningAmberIcon from '@mui/icons-material/WarningAmber'\nimport { Box } from '@mui/material'\n\nexport interface ConfirmDialogProps {\n open: boolean\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n confirmColor?: 'primary' | 'error' | 'warning' | 'success'\n onConfirm: () => void\n onCancel: () => void\n}\n\nexport const ConfirmDialog = ({\n open,\n title,\n message,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n confirmColor = 'primary',\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) => {\n return (\n <Dialog open={open} onClose={onCancel} maxWidth=\"xs\" fullWidth slotProps={{ paper: { sx: { borderRadius: 4 } } }}>\n <DialogTitle>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <WarningAmberIcon color={confirmColor} />\n {title}\n </Box>\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\">{message}</Typography>\n </DialogContent>\n <DialogActions sx={{ px: 3, pb: 2 }}>\n <Button onClick={onCancel} variant=\"outlined\">\n {cancelText}\n </Button>\n <Button onClick={onConfirm} variant=\"contained\" color={confirmColor} autoFocus>\n {confirmText}\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n\nexport default ConfirmDialog\n","/**\n * Merges class names together\n * Useful for conditional className composition\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n","/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n timeoutId = setTimeout(() => {\n func.apply(this, args)\n }, wait)\n }\n}\n","/**\n * Creates a throttled function that only invokes func at most once per every wait milliseconds\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now()\n \n if (now - lastCall >= wait) {\n lastCall = now\n func.apply(this, args)\n }\n }\n}\n","/**\n * Formats a date to a readable string\n */\nexport function formatDate(\n date: Date | string | number,\n options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n }\n): string {\n const dateObj = typeof date === 'string' || typeof date === 'number' \n ? new Date(date) \n : date\n\n return new Intl.DateTimeFormat('en-US', options).format(dateObj)\n}\n","import { LocalStorage } from \"../utils\";\nimport { HttpClient } from '../http'\nimport type { SignInResponse } from './struct'\n\nconst SESSION_KEY = 'session_details'\n\nexport interface ISessionManager {\n /** Persist session to localStorage and set the auth header. */\n save(session: SignInResponse): void\n /** Partially update stored session fields (e.g. after token refresh). */\n patch(updates: Partial<SignInResponse>): void\n /** Clear session from localStorage and remove the auth header. */\n clear(): void\n /** Return the full stored session, or null if absent / unparseable. */\n get(): SignInResponse | null\n /** Return the stored access token, or undefined. */\n getAccessToken(): string | undefined\n /** Return the stored refresh token, or undefined. */\n getRefreshToken(): string | undefined\n /** Return the session UUID, or undefined. */\n getSessionId(): string | undefined\n /** True when a non-expired access token is stored. */\n isAuthenticated(): boolean\n /** Called on app startup: restore the auth header or wipe an expired session. */\n initialize(): void\n}\n\nexport class SessionManager implements ISessionManager {\n private static instance: SessionManager\n private readonly key: string\n private readonly client: HttpClient\n private cache: SignInResponse | null = null\n\n private constructor(client: HttpClient, key = SESSION_KEY) {\n this.client = client\n this.key = key\n }\n\n static getInstance(client: HttpClient): SessionManager {\n if (!SessionManager.instance) {\n SessionManager.instance = new SessionManager(client)\n }\n return SessionManager.instance\n }\n\n save(session: SignInResponse): void {\n this.cache = session\n LocalStorage.setItem(this.key, session)\n this.setAuthToken(session.accessToken)\n }\n\n patch(updates: Partial<SignInResponse>): void {\n const current = this.get()\n if (!current) return\n const updated = { ...current, ...updates }\n this.cache = updated\n LocalStorage.setItem(this.key, updated)\n if (updates.accessToken) {\n this.setAuthToken(updates.accessToken)\n }\n }\n\n clear(): void {\n this.cache = null\n LocalStorage.removeItem(this.key)\n this.clearAuthToken()\n }\n\n get(): SignInResponse | null {\n if (this.cache !== null) return this.cache\n this.cache = LocalStorage.getItem<SignInResponse>(this.key)\n return this.cache\n }\n\n getAccessToken(): string | undefined {\n return this.get()?.accessToken || undefined\n }\n\n getRefreshToken(): string | undefined {\n return this.get()?.refreshToken || undefined\n }\n\n getSessionId(): string | undefined {\n return this.get()?.sessionId || undefined\n }\n\n isAuthenticated(): boolean {\n const session = this.get()\n if (!session?.accessToken) return false\n return Number(session.expiresAt) > Date.now() / 1000\n }\n\n initialize(): void {\n const session = this.get()\n if (session?.accessToken && Number(session.expiresAt) > Date.now() / 1000) {\n this.setAuthToken(session.accessToken)\n } else {\n this.clear()\n }\n }\n\n private setAuthToken(token: string): void {\n this.client.setDefaultHeader('Authorization', `Bearer ${token}`)\n }\n\n private clearAuthToken(): void {\n this.client.removeDefaultHeader('Authorization')\n }\n\n}\n","import { HttpClient } from '../http'\nimport { SessionManager } from './sessionManager'\nimport type {\n SignInRequest,\n SignInResponse,\n RefreshTokenRequest,\n RefreshTokenResponse,\n LogoutRequest,\n LogoutResponse,\n GenerateLoginTokenRequest,\n GenerateLoginTokenResponse,\n SignInWithLoginTokenRequest,\n} from './struct'\n\nconst BASE_URL = '/openauth/v1'\n\nexport interface IAuthService {\n signIn(request: SignInRequest): Promise<SignInResponse>\n refreshToken(request?: Partial<RefreshTokenRequest>): Promise<RefreshTokenResponse>\n logout(request: LogoutRequest): Promise<LogoutResponse>\n generateLoginToken(request?: GenerateLoginTokenRequest): Promise<GenerateLoginTokenResponse>\n signInWithLoginToken(request: SignInWithLoginTokenRequest): Promise<SignInResponse>\n isAuthenticated(): boolean\n getAccessToken(): string | undefined\n getSessionDetails(): SignInResponse | null\n getSessionId(): string | undefined\n initializeAuth(): void\n}\n\nexport class AuthService implements IAuthService {\n private static instance: AuthService\n private readonly client: HttpClient\n private readonly sessionManager: SessionManager\n\n private constructor(client: HttpClient) {\n this.client = client\n this.sessionManager = SessionManager.getInstance(client)\n }\n\n static getInstance(client: HttpClient): AuthService {\n if (!AuthService.instance) {\n AuthService.instance = new AuthService(client)\n }\n return AuthService.instance\n }\n\n async signIn(request: SignInRequest): Promise<SignInResponse> {\n const response = await this.client.post<SignInResponse>(\n `${BASE_URL}/auth/signin`,\n request\n )\n if (response.data.accessToken) {\n this.sessionManager.save(response.data)\n }\n return response.data\n }\n\n async refreshToken(request?: Partial<RefreshTokenRequest>): Promise<RefreshTokenResponse> {\n const refreshToken = this.sessionManager.getRefreshToken()\n if (!refreshToken) {\n throw new Error('No refresh token available')\n }\n\n const response = await this.client.post<RefreshTokenResponse>(\n `${BASE_URL}/auth/refresh`,\n { refreshToken, ...request }\n )\n\n if (response.data.accessToken) {\n this.sessionManager.patch({\n accessToken: response.data.accessToken,\n refreshToken: response.data.refreshToken,\n })\n }\n\n return response.data\n }\n\n async logout(request: LogoutRequest): Promise<LogoutResponse> {\n try {\n request.sessionId = this.sessionManager.getSessionId()\n const response = await this.client.post<LogoutResponse>(\n `${BASE_URL}/auth/logout`,\n request || {}\n )\n return response.data\n } finally {\n this.sessionManager.clear()\n }\n }\n\n async generateLoginToken(request?: GenerateLoginTokenRequest): Promise<GenerateLoginTokenResponse> {\n const response = await this.client.put<GenerateLoginTokenResponse>(\n `${BASE_URL}/auth/login-token`,\n request ?? {}\n )\n return response.data\n }\n\n async signInWithLoginToken(request: SignInWithLoginTokenRequest): Promise<SignInResponse> {\n const response = await this.client.post<SignInResponse>(\n `${BASE_URL}/auth/signin-with-token`,\n request\n )\n if (response.data.accessToken) {\n this.sessionManager.save(response.data)\n }\n return response.data\n }\n\n isAuthenticated(): boolean {\n return this.sessionManager.isAuthenticated()\n }\n\n getAccessToken(): string | undefined {\n return this.sessionManager.getAccessToken()\n }\n\n getSessionDetails(): SignInResponse | null {\n return this.sessionManager.get()\n }\n\n getSessionId(): string | undefined {\n return this.sessionManager.getSessionId()\n }\n\n initializeAuth(): void {\n this.sessionManager.initialize()\n }\n}"]}
1
+ {"version":3,"sources":["../src/theme/tokens.ts","../src/theme/light.ts","../src/theme/dark.ts","../src/utils/localStorage.ts","../src/theme/ThemeProvider.tsx","../src/theme/useTheme.ts","../src/theme/ThemeToggle.tsx","../src/components/NotFoundPage.tsx","../src/http/HttpClient.ts","../src/components/LoginCallbackPage.tsx","../src/components/SidebarLayout.tsx","../src/components/ReadmeViewer/shikiHighlighter.ts","../src/components/ReadmeViewer/ReadmeViewer.tsx","../src/components/NotificationProvider/NotificationProvider.tsx","../src/components/ConfirmDialog.tsx","../src/utils/cn.ts","../src/utils/debounce.ts","../src/utils/throttle.ts","../src/utils/formatDate.ts","../src/auth/sessionManager.ts","../src/auth/authService.ts"],"names":["MuiThemeProvider","jsx","jsxs","useNavigate","useEffect","Box","Typography","IconButton","useState","className","createContext","useCallback","useContext","Button"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,cAAA,GAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,YAAA,EAAA,MAAA,YAAA;AAAA,EAAA,SAAA,EAAA,MAAA,SAAA;AAAA,EAAA,QAAA,EAAA,MAAA,QAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,OAAA,EAAA,MAAA,OAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,MAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AASO,IAAM,OAAA,GAAU;AAAA,EACrB,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA;AAAA,EACJ,KAAA,EAAO,MAAA;AAAA;AAAA,EACP,KAAA,EAAO;AAAA;AACT;AAKO,IAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,GAAA;AAAA,EACN,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,EAAA,EAAI,UAAA;AAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,KAAA,EAAO,MAAA;AAAA;AAAA,EACP,IAAA,EAAM;AACR;AAKO,IAAM,QAAA,GAAW;AAAA,EACtB,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,EAAA,EAAI,UAAA;AAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA;AAAA,EACJ,EAAA,EAAI,UAAA;AAAA;AAAA,EACJ,EAAA,EAAI,SAAA;AAAA;AAAA,EACJ,KAAA,EAAO,QAAA;AAAA;AAAA,EACP,KAAA,EAAO,UAAA;AAAA;AAAA,EACP,KAAA,EAAO;AAAA;AACT;AAKO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO,KAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,MAAA,EAAQ,KAAA;AAAA,EACR,QAAA,EAAU,KAAA;AAAA,EACV,IAAA,EAAM;AACR;AAKO,IAAM,UAAA,GAAa;AAAA,EACxB,KAAA,EAAO,MAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,OAAA,EAAS;AACX;AAKO,IAAM,SAAA,GAAY;AAAA,EACvB,IAAA,EAAM,MAAA;AAAA,EACN,EAAA,EAAI,+BAAA;AAAA,EACJ,EAAA,EAAI,kEAAA;AAAA,EACJ,EAAA,EAAI,oEAAA;AAAA,EACJ,EAAA,EAAI;AACN;AAKO,IAAM,UAAA,GAAa;AAAA,EACxB,IAAA,EAAM,OAAA;AAAA,EACN,MAAA,EAAQ,OAAA;AAAA,EACR,IAAA,EAAM;AACR;AAKO,IAAM,MAAA,GAAS;AAAA,EACpB,QAAA,EAAU,GAAA;AAAA,EACV,MAAA,EAAQ,IAAA;AAAA,EACR,KAAA,EAAO,IAAA;AAAA,EACP,aAAA,EAAe,IAAA;AAAA,EACf,KAAA,EAAO,IAAA;AAAA,EACP,OAAA,EAAS,IAAA;AAAA,EACT,OAAA,EAAS;AACX;;;ACzFO,IAAM,UAAA,GAAoB;AAAA,EAC/B,MAAA,EAAQ;AAAA;AAAA,IAEN,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA;AAAA,IACd,aAAA,EAAe,SAAA;AAAA;AAAA;AAAA,IAGf,SAAA,EAAW,SAAA;AAAA,IACX,cAAA,EAAgB,SAAA;AAAA,IAChB,eAAA,EAAiB,SAAA;AAAA;AAAA,IAGjB,UAAA,EAAY,SAAA;AAAA,IACZ,mBAAA,EAAqB,SAAA;AAAA,IACrB,kBAAA,EAAoB,SAAA;AAAA;AAAA,IAGpB,OAAA,EAAS,SAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA;AAAA,IAGd,IAAA,EAAM,SAAA;AAAA;AAAA,IACN,aAAA,EAAe,SAAA;AAAA;AAAA,IACf,YAAA,EAAc,SAAA;AAAA;AAAA,IACd,YAAA,EAAc,SAAA;AAAA;AAAA;AAAA,IAGd,KAAA,EAAO,SAAA;AAAA;AAAA,IACP,UAAA,EAAY,SAAA;AAAA,IACZ,eAAA,EAAiB,SAAA;AAAA,IAEjB,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA,IACd,iBAAA,EAAmB,SAAA;AAAA,IAEnB,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA,IACd,iBAAA,EAAmB,SAAA;AAAA,IAEnB,IAAA,EAAM,SAAA;AAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,cAAA,EAAgB,SAAA;AAAA;AAAA,IAGhB,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,WAAA,EAAa,SAAA;AAAA;AAAA,IACb,WAAA,EAAa,SAAA;AAAA;AAAA;AAAA,IAGb,OAAA,EAAS,SAAA;AAAA;AAAA,IAGT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;;;AChEO,IAAM,SAAA,GAAmB;AAAA,EAC9B,MAAA,EAAQ;AAAA;AAAA,IAEN,OAAA,EAAS,SAAA;AAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA;AAAA,IACd,aAAA,EAAe,SAAA;AAAA;AAAA;AAAA,IAGf,SAAA,EAAW,SAAA;AAAA,IACX,cAAA,EAAgB,SAAA;AAAA,IAChB,eAAA,EAAiB,SAAA;AAAA;AAAA,IAGjB,UAAA,EAAY,SAAA;AAAA;AAAA,IACZ,mBAAA,EAAqB,SAAA;AAAA;AAAA,IACrB,kBAAA,EAAoB,SAAA;AAAA;AAAA;AAAA,IAGpB,OAAA,EAAS,SAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA;AAAA,IAGd,IAAA,EAAM,SAAA;AAAA;AAAA,IACN,aAAA,EAAe,SAAA;AAAA;AAAA,IACf,YAAA,EAAc,SAAA;AAAA;AAAA,IACd,YAAA,EAAc,SAAA;AAAA;AAAA;AAAA,IAGd,KAAA,EAAO,SAAA;AAAA,IACP,UAAA,EAAY,SAAA;AAAA,IACZ,eAAA,EAAiB,SAAA;AAAA,IAEjB,OAAA,EAAS,SAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA,IACd,iBAAA,EAAmB,SAAA;AAAA,IAEnB,OAAA,EAAS,SAAA;AAAA,IACT,YAAA,EAAc,SAAA;AAAA,IACd,iBAAA,EAAmB,SAAA;AAAA,IAEnB,IAAA,EAAM,SAAA;AAAA,IACN,SAAA,EAAW,SAAA;AAAA,IACX,cAAA,EAAgB,SAAA;AAAA;AAAA,IAGhB,MAAA,EAAQ,SAAA;AAAA;AAAA,IACR,WAAA,EAAa,SAAA;AAAA,IACb,WAAA,EAAa,SAAA;AAAA;AAAA;AAAA,IAGb,OAAA,EAAS,SAAA;AAAA;AAAA,IAGT,OAAA,EAAS;AAAA,GACX;AAAA,EAEA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;;;ACpEO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxB,OAAO,QAAoB,GAAA,EAAuB;AAChD,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA;AAE5C,MAAA,IAAI,SAAS,IAAA,EAAM;AACjB,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,IAAI;AACF,QAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,MACxB,CAAA,CAAA,MAAQ;AAEN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,KAAK,CAAA,CAAE,CAAA;AAC9D,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,OAAA,CAAW,GAAA,EAAa,KAAA,EAAmB;AAChD,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAM,kBAAkB,OAAO,KAAA,KAAU,WACrC,KAAA,GACA,IAAA,CAAK,UAAU,KAAK,CAAA;AAExB,MAAA,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAA,EAAK,eAAe,CAAA;AAChD,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oCAAA,EAAuC,KAAK,CAAA,CAAE,CAAA;AAC5D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,WAAW,GAAA,EAAsB;AACtC,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAA,CAAO,YAAA,CAAa,WAAW,GAAG,CAAA;AAClC,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,uCAAA,EAA0C,KAAK,CAAA,CAAE,CAAA;AAC/D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,KAAA,GAAiB;AACtB,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,MAAA,CAAO,aAAa,KAAA,EAAM;AAC1B,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAE,CAAA;AACrD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,QAAQ,GAAA,EAAsB;AACnC,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO,KAAA;AAAA,MACT;AAEA,MAAA,OAAO,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA,KAAM,IAAA;AAAA,IAC9C,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAE,CAAA;AAC7D,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,IAAA,GAAiB;AACtB,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,OAAO,MAAA,CAAO,IAAA,CAAK,MAAA,CAAO,YAAY,CAAA;AAAA,IACxC,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,sCAAA,EAAyC,KAAK,CAAA,CAAE,CAAA;AAC9D,MAAA,OAAO,EAAC;AAAA,IACV;AAAA,EACF;AACF;AC1HO,IAAM,YAAA,GAAe,cAA6C,MAAS,CAAA;AAElF,IAAM,iBAAA,GAAoB,gBAAA;AAiB1B,IAAM,iBAAiB,MAAyB;AAC9C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,OAAA;AAC1C,EAAA,OAAO,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAAE,UAAU,MAAA,GAAS,OAAA;AAC9E,CAAA;AAKA,IAAM,iBAAA,GAAoB,CAAC,KAAA,EAAc,YAAA,KAA0C;AACjF,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AAErC,EAAA,MAAM,OAAO,QAAA,CAAS,eAAA;AAGtB,EAAA,IAAA,CAAK,YAAA,CAAa,cAAc,YAAY,CAAA;AAG5C,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,MAAM,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACrD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,QAAA,EAAW,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA,CAAA,EAAI,KAAK,CAAA;AAAA,EACzF,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACtD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,UAAA,EAAa,GAAG,IAAI,KAAK,CAAA;AAAA,EAClD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,YAAY,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC3D,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,SAAA,EAAY,GAAG,IAAI,KAAK,CAAA;AAAA,EACjD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,QAAQ,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACvD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,OAAA,EAAU,GAAG,IAAI,KAAK,CAAA;AAAA,EAC/C,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,UAAU,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACzD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,OAAA,EAAU,GAAG,IAAI,KAAK,CAAA;AAAA,EAC/C,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,UAAU,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACzD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,UAAA,EAAa,GAAG,IAAI,KAAK,CAAA;AAAA,EAClD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,SAAS,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACxD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,SAAA,EAAY,GAAG,IAAI,KAAK,CAAA;AAAA,EACjD,CAAC,CAAA;AAGD,EAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,UAAU,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AACzD,IAAA,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,CAAA,aAAA,EAAgB,GAAG,IAAI,KAAK,CAAA;AAAA,EACrD,CAAC,CAAA;AACH,CAAA;AAEO,IAAM,gBAA8C,CAAC;AAAA,EAC1D,QAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA,GAAc,QAAA;AAAA,EACd,UAAA,GAAa,iBAAA;AAAA,EACb,kBAAA,GAAqB;AACvB,CAAA,KAAM;AAEJ,EAAA,MAAM,iBAAiB,MAAiB;AACtC,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,OAAA,CAAmB,UAAU,CAAA;AAC5D,IAAA,OAAO,SAAA,IAAa,WAAA;AAAA,EACtB,CAAA;AAEA,EAAA,MAAM,CAAC,SAAA,EAAW,iBAAiB,CAAA,GAAI,SAAoB,cAAc,CAAA;AACzE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAA4B,cAAc,CAAA;AAChF,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAA4B,YAAY,CAAA;AAG9E,EAAA,MAAM,iBAAA,GAAuC,QAAQ,MAAM;AACzD,IAAA,IAAI,SAAA,KAAc,UAAU,OAAO,WAAA;AACnC,IAAA,OAAO,SAAA;AAAA,EACT,CAAA,EAAG,CAAC,SAAA,EAAW,WAAW,CAAC,CAAA;AAG3B,EAAA,MAAM,KAAA,GAAe,QAAQ,MAAM;AACjC,IAAA,IAAI,aAAa,OAAO,WAAA;AACxB,IAAA,OAAO,iBAAA,KAAsB,UAAU,UAAA,GAAa,SAAA;AAAA,EACtD,CAAA,EAAG,CAAC,WAAA,EAAa,iBAAiB,CAAC,CAAA;AAGnC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEnC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA;AAEnE,IAAA,MAAM,YAAA,GAAe,CAAC,CAAA,KAA2B;AAC/C,MAAA,cAAA,CAAe,CAAA,CAAE,OAAA,GAAU,MAAA,GAAS,OAAO,CAAA;AAAA,IAC7C,CAAA;AAGA,IAAA,IAAI,WAAW,gBAAA,EAAkB;AAC/B,MAAA,UAAA,CAAW,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAClD,MAAA,OAAO,MAAM,UAAA,CAAW,mBAAA,CAAoB,QAAA,EAAU,YAAY,CAAA;AAAA,IACpE,CAAA,MAAA,IAES,WAAW,WAAA,EAAa;AAC/B,MAAA,UAAA,CAAW,YAAY,YAAY,CAAA;AACnC,MAAA,OAAO,MAAM,UAAA,CAAW,cAAA,CAAe,YAAY,CAAA;AAAA,IACrD;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,kBAAA,EAAoB;AACtB,MAAA,iBAAA,CAAkB,OAAO,iBAAiB,CAAA;AAAA,IAC5C;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,iBAAA,EAAmB,kBAAkB,CAAC,CAAA;AAGjD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,YAAA,CAAa,OAAA,CAAQ,YAAY,SAAS,CAAA;AAAA,EAC5C,CAAA,EAAG,CAAC,SAAA,EAAW,UAAU,CAAC,CAAA;AAE1B,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,CAAC,IAAA,KAAoB;AACpD,IAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,EACxB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,CAAC,QAAA,KAAoB;AAChD,IAAA,cAAA,CAAe,QAAQ,CAAA;AAAA,EACzB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,iBAAA,CAAkB,CAAC,QAAA,KAAa;AAC9B,MAAA,IAAI,QAAA,KAAa,SAAS,OAAO,MAAA;AACjC,MAAA,IAAI,QAAA,KAAa,QAAQ,OAAO,QAAA;AAChC,MAAA,OAAO,OAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAkC,QAAQ,OAAO;AAAA,IACrD,KAAA;AAAA,IACA,SAAA;AAAA,IACA,iBAAA;AAAA,IACA,QAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF,CAAA,EAAI,CAAC,KAAA,EAAO,SAAA,EAAW,mBAAmB,QAAA,EAAU,YAAA,EAAc,WAAW,CAAC,CAAA;AAE9E,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAM,WAAA,CAAY;AAAA,IACzC,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,iBAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,MAAM,MAAA,CAAO;AAAA,OACrB;AAAA,MACA,SAAA,EAAW;AAAA,QACT,IAAA,EAAM,MAAM,MAAA,CAAO;AAAA,OACrB;AAAA,MACA,KAAA,EAAO;AAAA,QACL,IAAA,EAAM,MAAM,MAAA,CAAO;AAAA,OACrB;AAAA,MACA,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,MAAM,MAAA,CAAO;AAAA,OACrB;AAAA,MACA,UAAA,EAAY;AAAA,QACV,OAAA,EAAS,MAAM,MAAA,CAAO,UAAA;AAAA,QACtB,KAAA,EAAO,MAAM,MAAA,CAAO;AAAA,OACtB;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,OAAA,EAAS,MAAM,MAAA,CAAO,IAAA;AAAA,QACtB,SAAA,EAAW,MAAM,MAAA,CAAO;AAAA;AAC1B;AACF,GACD,CAAA,EAAG,CAAC,iBAAA,EAAmB,KAAK,CAAC,CAAA;AAE9B,EAAA,uBACE,GAAA,CAAC,aAAa,QAAA,EAAb,EAAsB,OAAO,YAAA,EAC5B,QAAA,kBAAA,IAAA,CAACA,eAAA,EAAA,EAAiB,KAAA,EAAO,QAAA,EACvB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,CAAA;AAAA,IACZ;AAAA,GAAA,EACH,CAAA,EACF,CAAA;AAEJ;ACzMO,IAAM,WAAW,MAAyB;AAC/C,EAAA,MAAM,OAAA,GAAU,WAAW,YAAY,CAAA;AAEvC,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,IAAI,MAAM,8CAA8C,CAAA;AAAA,EAChE;AAEA,EAAA,OAAO,OAAA;AACT;ACsBO,IAAM,cAA0C,CAAC;AAAA,EACtD,gBAAA,GAAmB,qBAAA;AAAA,EACnB,eAAA,GAAkB,wBAAA;AAAA,EAClB,iBAAA,GAAoB,uBAAA;AAAA,EACpB,WAAA,GAAc,IAAA;AAAA,EACd,EAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,EAAE,SAAA,EAAW,WAAA,EAAY,GAAI,QAAA,EAAS;AAE5C,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,OAAA;AACH,QAAA,uBAAOC,IAAC,SAAA,EAAA,EAAU,CAAA;AAAA,MACpB,KAAK,MAAA;AACH,QAAA,uBAAOA,IAAC,QAAA,EAAA,EAAS,CAAA;AAAA,MACnB,KAAK,QAAA;AACH,QAAA,uBAAOA,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA,MACzB;AACE,QAAA,uBAAOA,IAAC,cAAA,EAAA,EAAe,CAAA;AAAA;AAC3B,EACF,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,OAAA;AACH,QAAA,OAAO,gBAAA;AAAA,MACT,KAAK,MAAA;AACH,QAAA,OAAO,eAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,OAAO,iBAAA;AAAA,MACT;AACE,QAAA,OAAO,gBAAA;AAAA;AACX,EACF,CAAA;AAEA,EAAA,MAAM,yBACJA,GAAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,WAAA;AAAA,MACT,KAAA,EAAM,SAAA;AAAA,MACN,EAAA,EAAI;AAAA,QACF,YAAA,EAAc,KAAA;AAAA,QACd,GAAG;AAAA,OACL;AAAA,MACC,GAAG,KAAA;AAAA,MAEH,QAAA,EAAA,OAAA;AAAQ;AAAA,GACX;AAGF,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,uBACEA,IAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,YAAW,EAAG,KAAA,EAAK,MAChC,QAAA,EAAA,MAAA,EACH,CAAA;AAEJ;ACxFO,SAAS,YAAA,GAAe;AAC7B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,EAAA,uBACEC,IAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,SAAA,EAAW,OAAA;AAAA,QACX,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,eAAA,EAAiB,MAAM,MAAA,CAAO,mBAAA;AAAA,QAC9B,GAAA,EAAK,CAAA;AAAA,QACL,SAAA,EAAW,QAAA;AAAA,QACX,EAAA,EAAI;AAAA,OACN;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,yBAAsB,EAAA,EAAI,EAAE,UAAU,EAAA,EAAI,KAAA,EAAO,iBAAgB,EAAG,CAAA;AAAA,wBACrEA,IAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,MAAK,UAAA,EAAW,MAAA,EAAO,KAAA,EAAM,cAAA,EAAe,QAAA,EAAA,KAAA,EAEhE,CAAA;AAAA,wBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAQ,IAAA,EAAK,KAAA,EAAM,kBAAiB,QAAA,EAAA,gBAAA,EAEhD,CAAA;AAAA,wBACAA,GAAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAM,eAAA,EAAgB,EAAA,EAAI,EAAE,QAAA,EAAU,GAAA,EAAI,EAAG,QAAA,EAAA,8DAAA,EAEzE,CAAA;AAAA,wBACAA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,eAAe,MAAA,EAAO;AAAA,YACnC,SAAS,MAAM,QAAA,CAAS,KAAK,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,YAC/C,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GACF;AAEJ;;;ACxCO,IAAM,aAAN,MAAiB;AAAA,EAKtB,WAAA,CAAY,MAAA,GAA2B,EAAC,EAAG;AACzC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,EAAA;AACjC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AACjC,IAAA,IAAA,CAAK,cAAA,GAAiB,MAAA,CAAO,OAAA,IAAW,EAAC;AAAA,EAC3C;AAAA,EAEQ,QAAA,CAAS,KAAa,MAAA,EAA4D;AACxF,IAAA,MAAM,OAAA,GAAU,GAAA,CAAI,UAAA,CAAW,MAAM,CAAA,GAAI,MAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA;AAEpE,IAAA,IAAI,CAAC,QAAQ,OAAO,OAAA;AAEpB,IAAA,MAAM,YAAA,GAAe,IAAI,eAAA,EAAgB;AACzC,IAAA,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC/C,MAAA,YAAA,CAAa,MAAA,CAAO,GAAA,EAAK,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACxC,CAAC,CAAA;AAED,IAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,YAAA,CAAa,UAAU,CAAA,CAAA;AAAA,EAC9C;AAAA,EAEA,MAAc,OAAA,CACZ,GAAA,EACA,MAAA,GAAwB,EAAC,EACC;AAC1B,IAAA,MAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,OAAA,GAAU,IAAA,CAAK,OAAA,EAAS,OAAA,GAAU,EAAC,EAAG,GAAG,UAAA,EAAW,GAAI,MAAA;AAE9E,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,OAAO,CAAA;AAE9D,IAAA,IAAI;AACF,MAAA,MAAM,WAAW,MAAM,KAAA,CAAM,KAAK,QAAA,CAAS,GAAA,EAAK,MAAM,CAAA,EAAG;AAAA,QACvD,GAAG,UAAA;AAAA,QACH,OAAA,EAAS;AAAA,UACP,cAAA,EAAgB,kBAAA;AAAA,UAChB,GAAG,IAAA,CAAK,cAAA;AAAA,UACR,GAAG;AAAA,SACL;AAAA,QACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI,KAAA,CAAA;AAAA,QACpC,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AAED,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,QAAmB,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,QAAA,CAAS,UAAU,CAAA,CAAE,CAAA;AACvE,QAAA,KAAA,CAAM,SAAS,QAAA,CAAS,MAAA;AACxB,QAAA,KAAA,CAAM,aAAa,QAAA,CAAS,UAAA;AAC5B,QAAA,IAAI;AACF,UAAA,KAAA,CAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AAAA,QACnC,CAAA,CAAA,MAAQ;AACN,UAAA,KAAA,CAAM,IAAA,GAAO,EAAE,IAAA,EAAM,QAAA,CAAS,QAAQ,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA,EAAK,EAAE;AAAA,QACvE;AACA,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,EAAK;AAEzC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,QAAQ,QAAA,CAAS,MAAA;AAAA,QACjB,YAAY,QAAA,CAAS,UAAA;AAAA,QACrB,SAAS,QAAA,CAAS;AAAA,OACpB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACzD,QAAA,MAAM,IAAI,MAAM,iBAAiB,CAAA;AAAA,MACnC;AACA,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,gBAAA,CAAiB,KAAa,KAAA,EAAqB;AACjD,IAAA,IAAA,CAAK,cAAA,CAAe,GAAG,CAAA,GAAI,KAAA;AAAA,EAC7B;AAAA,EAEA,oBAAoB,GAAA,EAAmB;AACrC,IAAA,OAAO,IAAA,CAAK,eAAe,GAAG,CAAA;AAAA,EAChC;AAAA,EAEA,iBAAA,GAA4C;AAC1C,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,cAAA,EAAe;AAAA,EAClC;AAAA,EAEA,GAAA,CAAa,KAAa,MAAA,EAAkD;AAC1E,IAAA,OAAO,IAAA,CAAK,QAAW,GAAA,EAAK,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC1D;AAAA,EAEA,IAAA,CAAc,GAAA,EAAa,IAAA,EAAY,MAAA,EAAkD;AACvF,IAAA,OAAO,IAAA,CAAK,QAAW,GAAA,EAAK,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,MAAA,EAAQ,CAAA;AAAA,EACjE;AAAA,EAEA,GAAA,CAAa,GAAA,EAAa,IAAA,EAAY,MAAA,EAAkD;AACtF,IAAA,OAAO,IAAA,CAAK,QAAW,GAAA,EAAK,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EAChE;AAAA,EAEA,KAAA,CAAe,GAAA,EAAa,IAAA,EAAY,MAAA,EAAkD;AACxF,IAAA,OAAO,IAAA,CAAK,QAAW,GAAA,EAAK,EAAE,GAAG,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,CAAA;AAAA,EAClE;AAAA,EAEA,MAAA,CAAgB,KAAa,MAAA,EAAkD;AAC7E,IAAA,OAAO,IAAA,CAAK,QAAW,GAAA,EAAK,EAAE,GAAG,MAAA,EAAQ,MAAA,EAAQ,UAAU,CAAA;AAAA,EAC7D;AACF;AAEO,SAAS,oBAAoB,KAAA,EAAoB;AACtD,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,MAAM,SAAA,GAAY,KAAA;AAClB,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,OAAO,UAAU,IAAA,CAAK,OAAA;AAAA,IACxB;AACA,IAAA,OAAO,KAAA,CAAM,OAAA;AAAA,EACf;AACA,EAAA,OAAO,8BAAA;AACT;AC3GO,SAAS,kBAAkB,EAAE,WAAA,EAAa,UAAA,GAAa,GAAA,EAAK,eAAc,EAA2B;AAC1G,EAAA,MAAM,CAAC,YAAY,CAAA,GAAI,eAAA,EAAgB;AACvC,EAAA,MAAM,WAAWE,WAAAA,EAAY;AAC7B,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,GAAA,CAAI,aAAa,CAAA;AAEjD,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAA,CAAQ,MAAM,gEAAgE,CAAA;AAC9E,MAAA,aAAA,IAAgB;AAChB,MAAA;AAAA,IACF;AACA,IAAA,WAAA,CACG,qBAAqB,EAAE,UAAA,EAAY,CAAA,CACnC,KAAK,MAAM;AACV,MAAA,QAAA,CAAS,UAAA,EAAY,EAAE,OAAA,EAAS,IAAA,EAAM,CAAA;AAAA,IACxC,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,GAAA,KAAiB;AACvB,MAAA,OAAA,CAAQ,KAAA,CAAM,wBAAA,EAA0B,mBAAA,CAAoB,GAAG,CAAC,CAAA;AAChE,MAAA,aAAA,IAAgB;AAAA,IAClB,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEF,IAAAA;AAAA,IAACG,GAAAA;AAAA,IAAA;AAAA,MACC,EAAA,EAAI;AAAA,QACF,SAAA,EAAW,OAAA;AAAA,QACX,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAe,QAAA;AAAA,QACf,UAAA,EAAY,QAAA;AAAA,QACZ,cAAA,EAAgB,QAAA;AAAA,QAChB,UAAA,EAAY,2BAA2B,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA,KAAA,EAAQ,KAAA,CAAM,OAAO,aAAa,CAAA,MAAA,CAAA;AAAA,QAC7F,GAAA,EAAK;AAAA,OACP;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,GAAAA,CAAC,oBAAiB,EAAA,EAAI,EAAE,OAAO,KAAA,CAAM,MAAA,CAAO,SAAQ,EAAG,CAAA;AAAA,wBACvDA,GAAAA,CAACK,UAAAA,EAAA,EAAW,SAAQ,OAAA,EAAQ,EAAA,EAAI,EAAE,KAAA,EAAO,MAAM,MAAA,CAAO,OAAA,EAAS,OAAA,EAAS,IAAA,IAAQ,QAAA,EAAA,sBAAA,EAEhF;AAAA;AAAA;AAAA,GACF;AAEJ;ACOA,IAAM,cAAA,GAKD,CAAC,EAAE,IAAA,EAAM,QAAQ,CAAA,EAAG,QAAA,EAAU,UAAS,KAAM;AAChD,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA;AAC5D,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAEvC,EAAA,uBACEJ,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,QAAA,EAAA,EAAS,cAAA,EAAc,IAAA,EACtB,QAAA,kBAAAC,IAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,cAAc,KAAA,GAAQ,OAAA;AAAA,QACjC,EAAA,EAAI,CAAC,WAAA,GAAe,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,EAAE,CAAA,CAAA,GAAM,MAAA;AAAA,QAClD,GAAA,EAAK,KAAA;AAAA,QACL,SAAS,WAAA,GAAc,MAAM,QAAA,CAAS,IAAA,CAAK,EAAE,CAAA,GAAI,MAAA;AAAA,QACjD,EAAA,EAAI;AAAA,UACF,EAAA,EAAI,IAAI,KAAA,GAAQ,CAAA;AAAA,UAChB,UAAA,EAAY;AAAA,YACV,eAAA,EAAiB,iBAAA;AAAA,YACjB,KAAA,EAAO,cAAA;AAAA,YACP,UAAA,EAAY,CAAA;AAAA,YACZ,WAAA,EAAa,cAAA;AAAA,YACb,UAAA,EAAY,QAAA;AAAA,YACZ,yBAAA,EAA2B;AAAA,cACzB,KAAA,EAAO;AAAA;AACT,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,eAAA,EAAiB;AAAA,WACnB;AAAA,UACA,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,IAAA,oBACJD,GAAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC9B,QAAA,EAAA,IAAA,CAAK,IAAA,EACR,CAAA;AAAA,0BAEFA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,SAAS,IAAA,CAAK,KAAA;AAAA,cACd,sBAAA,EAAwB;AAAA,gBACtB,QAAA,EAAU;AAAA;AACZ;AAAA,WACF;AAAA,UACC,WAAA,oBACCA,GAAAA,CAACM,UAAAA,EAAA,EAAW,IAAA,EAAK,OAAA,EAAQ,IAAI,EAAE,CAAA,EAAG,GAAE,EACjC,QAAA,EAAA,UAAA,mBAAaN,GAAAA,CAAC,UAAA,EAAA,EAAW,oBAAKA,GAAAA,CAAC,cAAW,CAAA,EAC7C;AAAA;AAAA;AAAA,KAEJ,EACF,CAAA;AAAA,IACC,WAAA,oBACCA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAI,UAAA,EAAY,OAAA,EAAQ,MAAA,EAAO,aAAA,EAAa,IAAA,EACpD,QAAA,kBAAAA,IAAC,IAAA,EAAA,EAAK,SAAA,EAAU,OAAM,cAAA,EAAc,IAAA,EACjC,eAAK,QAAA,CAAU,GAAA,CAAI,CAAC,KAAA,qBACnBA,GAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAM,KAAA;AAAA,QACN,OAAO,KAAA,GAAQ,CAAA;AAAA,QACf,QAAA;AAAA,QACA;AAAA,OAAA;AAAA,MAJK,KAAA,CAAM;AAAA,KAMd,GACH,CAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAA;AAKA,IAAM,iBAAA,GAAoB,CAAC,KAAA,KAAqE;AAC9F,EAAA,MAAM,SAAwD,EAAC;AAE/D,EAAA,MAAM,OAAA,GAAU,CAAC,SAAA,KAA0B;AACzC,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,SAAA,EAAW;AAC/B,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,SAAA,EAAW,IAAA,CAAK,WAAW,CAAA;AAAA,MAC5D;AACA,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,OAAA,CAAQ,KAAK,CAAA;AACb,EAAA,OAAO,MAAA;AACT,CAAA;AAMA,IAAM,2BAAyD,CAAC;AAAA,EAC9D,SAAA;AAAA,EACA,YAAA,GAAe,GAAA;AAAA,EACf,SAAA,GAAY,EAAA;AAAA,EACZ,YAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,kBAAkB;AACpB,CAAA,KAAM;AACJ,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAIO,SAAsB,IAAI,GAAA,CAAI,eAAe,CAAC,CAAA;AAE9E,EAAA,MAAM,YAAA,GAAe,CAAC,EAAA,KAAe;AACnC,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAChB,QAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,MACb;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAAJ,UAAU,MAAM;AACd,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,KAA4C;AAClE,QAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,UAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,QAAA,CAAS,QAAA,KAAa,KAAK,IAAA,EAAM;AAChD,YAAA,OAAO,IAAA;AAAA,UACT;AACA,UAAA,IAAI,KAAK,QAAA,EAAU;AACjB,YAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAC1C,YAAA,IAAI,OAAO,OAAO,KAAA;AAAA,UACpB;AAAA,QACF;AACA,QAAA,OAAO,MAAA;AAAA,MACT,CAAA;AAEA,MAAA,MAAM,UAAA,GAAa,eAAe,SAAS,CAAA;AAC3C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,YAAA,CAAa,WAAW,EAAE,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAA,CAAS,QAAA,EAAU,SAAA,EAAW,YAAY,CAAC,CAAA;AAG/C,EAAA,MAAM,gBAAgB,SAAA,CAAU,IAAA;AAAA,IAAK,CAAA,IAAA,KACnC,KAAK,SAAA,IAAc,IAAA,CAAK,UAAU,IAAA,CAAK,CAAA,KAAA,KAAS,MAAM,SAAS;AAAA,GACjE;AAEA,EAAA,MAAM,MAAA,GAAS,aAAA,GAAgB,iBAAA,CAAkB,SAAS,IAAI,EAAC;AAE/D,EAAA,uBACEF,IAAAA;AAAA,IAACG,GAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,MAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAO,MAAA;AAAA,QACP,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,EAAA,EAAI;AAAA,cACF,KAAA,EAAO,YAAA;AAAA,cACP,UAAA,EAAY,CAAA;AAAA,cACZ,oBAAA,EAAsB;AAAA,gBACpB,KAAA,EAAO,YAAA;AAAA,gBACP,SAAA,EAAW,YAAA;AAAA,gBACX,QAAA,EAAU,UAAA;AAAA,gBACV,WAAA,EAAa,WAAA;AAAA,gBACb,WAAA,EAAa,SAAA;AAAA,gBACb,GAAG;AAAA;AACL,aACF;AAAA,YAEA,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAI,EAAE,GAAG,CAAA,EAAE,EACd,QAAA,EAAA,SAAA,CAAU,MAAA,CAAO,UAAQ,IAAA,CAAK,KAAK,EAAE,GAAA,CAAI,CAAC,yBACzCA,GAAAA;AAAA,cAAC,cAAA;AAAA,cAAA;AAAA,gBAEC,IAAA;AAAA,gBACA,QAAA;AAAA,gBACA,QAAA,EAAU;AAAA,eAAA;AAAA,cAHL,IAAA,CAAK;AAAA,aAKb,CAAA,EACH;AAAA;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAACI,GAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,MAAA;AAAA,YACV,EAAA,EAAI;AAAA,cACF,QAAA,EAAU,CAAA;AAAA,cACV,QAAA,EAAU,MAAA;AAAA,cACV,GAAG;AAAA,aACL;AAAA,YAEC,QAAA,EAAA,aAAA,mBACCJ,GAAAA,CAAC,MAAA,EAAA,EACE,QAAA,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,SAAA,EAAU,qBAC7BA,GAAAA;AAAA,cAAC,KAAA;AAAA,cAAA;AAAA,gBAEC,IAAA;AAAA,gBACA,OAAA,EAAS;AAAA,eAAA;AAAA,cAFJ;AAAA,aAIR,CAAA,EACH,CAAA,mBAEAA,IAAC,MAAA,EAAA,EAAO;AAAA;AAAA;AAEZ;AAAA;AAAA,GACF;AAEJ,CAAA;AAKA,IAAM,uBAAA,GAAwD,CAAC,KAAA,KAAU;AACvE,EAAA;AAAA;AAAA,oBAEEA,GAAAA,CAAC,aAAA,EAAA,EAAc,MAAA,EAAQ,EAAE,kBAAA,EAAoB,IAAA,EAAM,oBAAA,EAAsB,IAAA,IACvE,QAAA,kBAAAA,GAAAA,CAAC,wBAAA,EAAA,EAA0B,GAAG,OAAO,CAAA,EACvC;AAAA;AAEJ,CAAA;AAKA,IAAM,aAAA,GAOD,CAAC,EAAE,IAAA,EAAM,UAAA,EAAY,QAAQ,CAAA,EAAG,QAAA,EAAU,QAAA,EAAU,OAAA,EAAQ,KAAM;AACrE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA;AAC5D,EAAA,MAAM,UAAA,GAAa,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,KAAK,EAAA,KAAO,UAAA;AAE7B,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,QAAA,CAAS,KAAK,EAAE,CAAA;AAAA,IAClB,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEC,KAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,QAAA,EAAA,EAAS,cAAA,EAAc,IAAA,EACtB,QAAA,kBAAAC,IAAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,QAAA;AAAA,QACV,OAAA,EAAS,WAAA;AAAA,QACT,EAAA,EAAI;AAAA,UACF,EAAA,EAAI,IAAI,KAAA,GAAQ,CAAA;AAAA,UAChB,gBAAA,EAAkB;AAAA,YAChB,eAAA,EAAiB,iBAAA;AAAA,YACjB,KAAA,EAAO,cAAA;AAAA,YACP,UAAA,EAAY,CAAA;AAAA,YACZ,WAAA,EAAa,cAAA;AAAA,YACb,UAAA,EAAY,QAAA;AAAA,YACZ,yBAAA,EAA2B;AAAA,cACzB,KAAA,EAAO;AAAA,aACT;AAAA,YACA,SAAA,EAAW;AAAA,cACT,eAAA,EAAiB;AAAA;AACnB,WACF;AAAA,UACA,SAAA,EAAW;AAAA,YACT,eAAA,EAAiB;AAAA,WACnB;AAAA,UACA,UAAA,EAAY;AAAA,SACd;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,IAAA,oBACJD,GAAAA,CAAC,YAAA,EAAA,EAAa,EAAA,EAAI,EAAE,QAAA,EAAU,EAAA,EAAG,EAC9B,QAAA,EAAA,IAAA,CAAK,IAAA,EACR,CAAA;AAAA,0BAEFA,GAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,SAAS,IAAA,CAAK,KAAA;AAAA,cACd,sBAAA,EAAwB;AAAA,gBACtB,QAAA,EAAU;AAAA;AACZ;AAAA,WACF;AAAA,UACC,WAAA,oBACCA,GAAAA,CAACM,UAAAA,EAAA,EAAW,IAAA,EAAK,OAAA,EAAQ,IAAI,EAAE,CAAA,EAAG,GAAE,EACjC,QAAA,EAAA,UAAA,mBAAaN,GAAAA,CAAC,UAAA,EAAA,EAAW,oBAAKA,GAAAA,CAAC,cAAW,CAAA,EAC7C;AAAA;AAAA;AAAA,KAEJ,EACF,CAAA;AAAA,IACC,WAAA,oBACCA,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAI,UAAA,EAAY,OAAA,EAAQ,MAAA,EAAO,aAAA,EAAa,IAAA,EACpD,QAAA,kBAAAA,IAAC,IAAA,EAAA,EAAK,SAAA,EAAU,OAAM,cAAA,EAAc,IAAA,EACjC,eAAK,QAAA,CAAU,GAAA,CAAI,CAAC,KAAA,qBACnBA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QAEC,IAAA,EAAM,KAAA;AAAA,QACN,UAAA;AAAA,QACA,OAAO,KAAA,GAAQ,CAAA;AAAA,QACf,QAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OAAA;AAAA,MANK,KAAA,CAAM;AAAA,KAQd,GACH,CAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ,CAAA;AAKA,IAAM,yBAAuD,CAAC;AAAA,EAC5D,SAAA;AAAA,EACA,YAAA,GAAe,GAAA;AAAA,EACf,SAAA,GAAY,EAAA;AAAA,EACZ,eAAA;AAAA,EACA,YAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,kBAAkB;AACpB,CAAA,KAAM;AACJ,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIO,QAAAA;AAAA,IAClC,eAAA,IAAmB,SAAA,CAAU,CAAC,CAAA,EAAG;AAAA,GACnC;AACA,EAAA,MAAM,CAAC,UAAU,WAAW,CAAA,GAAIA,SAAsB,IAAI,GAAA,CAAI,eAAe,CAAC,CAAA;AAE9E,EAAA,MAAM,YAAA,GAAe,CAAC,EAAA,KAAe;AACnC,IAAA,WAAA,CAAY,CAAC,IAAA,KAAS;AACpB,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,IAAI,CAAA;AACzB,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAChB,QAAA,IAAA,CAAK,OAAO,EAAE,CAAA;AAAA,MAChB,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AAAA,MACb;AACA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,eAAA,GAAkB,CAAC,EAAA,KAAe;AACtC,IAAA,aAAA,CAAc,EAAE,CAAA;AAChB,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,YAAA,CAAa,EAAE,CAAA;AAAA,IACjB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,EAAmB,EAAA,KAAqC;AAC9E,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,IAAA,CAAK,EAAA,KAAO,EAAA,EAAI,OAAO,IAAA;AAC3B,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,IAAA,CAAK,QAAA,EAAU,EAAE,CAAA;AAC9C,QAAA,IAAI,OAAO,OAAO,KAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,SAAA,EAAW,UAAU,CAAA;AAEvD,EAAA,uBACEN,IAAAA;AAAA,IAACG,GAAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,EAAA,EAAI;AAAA,QACF,OAAA,EAAS,MAAA;AAAA,QACT,MAAA,EAAQ,MAAA;AAAA,QACR,KAAA,EAAO,MAAA;AAAA,QACP,GAAG;AAAA,OACL;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAAJ,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,WAAA;AAAA,YACR,EAAA,EAAI;AAAA,cACF,KAAA,EAAO,YAAA;AAAA,cACP,UAAA,EAAY,CAAA;AAAA,cACZ,oBAAA,EAAsB;AAAA,gBACpB,KAAA,EAAO,YAAA;AAAA,gBACP,SAAA,EAAW,YAAA;AAAA,gBACX,QAAA,EAAU,UAAA;AAAA,gBACV,WAAA,EAAa,WAAA;AAAA,gBACb,WAAA,EAAa,SAAA;AAAA,gBACb,GAAG;AAAA;AACL,aACF;AAAA,YAEA,0BAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAI,EAAE,GAAG,CAAA,EAAE,EACd,QAAA,EAAA,SAAA,CAAU,MAAA,CAAO,UAAQ,IAAA,CAAK,KAAK,EAAE,GAAA,CAAI,CAAC,yBACzCA,GAAAA;AAAA,cAAC,aAAA;AAAA,cAAA;AAAA,gBAEC,IAAA;AAAA,gBACA,UAAA;AAAA,gBACA,QAAA;AAAA,gBACA,QAAA,EAAU,YAAA;AAAA,gBACV,OAAA,EAAS;AAAA,eAAA;AAAA,cALJ,IAAA,CAAK;AAAA,aAOb,CAAA,EACH;AAAA;AAAA,SACF;AAAA,wBAEAA,GAAAA;AAAA,UAACI,GAAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,MAAA;AAAA,YACV,EAAA,EAAI;AAAA,cACF,QAAA,EAAU,CAAA;AAAA,cACV,QAAA,EAAU,MAAA;AAAA,cACV,CAAA,EAAG,CAAA;AAAA,cACH,GAAG;AAAA,aACL;AAAA,YAEC,QAAA,EAAA,UAAA,EAAY,6BACXJ,GAAAA;AAAA,cAACK,UAAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,OAAA;AAAA,gBACR,KAAA,EAAM,gBAAA;AAAA,gBACN,EAAA,EAAI,EAAE,SAAA,EAAW,QAAA,EAAU,IAAI,CAAA,EAAE;AAAA,gBAClC,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAEJ;AAAA;AAAA,GACF;AAEJ,CAAA;AA0EO,IAAM,aAAA,GAA8C,CAAC,KAAA,KAAU;AAGpE,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,uBAAOL,GAAAA,CAAC,uBAAA,EAAA,EAAyB,GAAG,KAAA,EAAO,CAAA;AAAA,EAC7C;AAEA,EAAA,uBAAOA,GAAAA,CAAC,sBAAA,EAAA,EAAwB,GAAG,KAAA,EAAO,CAAA;AAC5C;ACxjBA,IAAI,mBAAA,GAA0C,IAAA;AAC9C,IAAI,kBAAA,GAAkD,IAAA;AAE/C,IAAM,iBAAiB,YAAkC;AAC5D,EAAA,IAAI,mBAAA,EAAqB;AACrB,IAAA,OAAO,mBAAA;AAAA,EACX;AAEA,EAAA,IAAI,kBAAA,EAAoB;AACpB,IAAA,OAAO,kBAAA;AAAA,EACX;AAEA,EAAA,kBAAA,GAAqB,iBAAA,CAAkB;AAAA,IACnC,MAAA,EAAQ,CAAC,cAAA,EAAgB,aAAa,CAAA;AAAA,IACtC,OAAO,CAAC,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAQ,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,QAAA,EAAU,QAAQ,KAAA,EAAO,GAAA,EAAK,QAAQ,KAAA,EAAO,KAAA,EAAO,QAAQ,MAAM;AAAA,GAC7H,CAAA,CAAE,IAAA,CAAK,CAAA,WAAA,KAAe;AACnB,IAAA,mBAAA,GAAsB,WAAA;AACtB,IAAA,OAAO,WAAA;AAAA,EACX,CAAC,CAAA;AAED,EAAA,OAAO,kBAAA;AACX;ACDA,IAAM,eAA4C,CAAC;AAAA,EACjD,OAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,MAAA,EAAQ,UAAA;AAAA,EACR;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,SAAS,UAAA,KAAe,MAAA,GAAY,UAAA,GAAc,QAAA,EAAU,SAAS,IAAA,KAAS,MAAA;AACpF,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIO,SAA6B,IAAI,CAAA;AACvE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,IAAIA,QAAAA,iBAAsB,IAAI,KAAK,CAAA;AAEvE,EAAAJ,UAAU,MAAM;AACd,IAAA,cAAA,EAAe,CAAE,KAAK,cAAc,CAAA;AAAA,EACtC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkB,OAAO,IAAA,EAAc,OAAA,KAAoB;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AACxC,MAAA,eAAA,CAAgB,UAAQ,IAAI,GAAA,CAAI,IAAI,CAAA,CAAE,GAAA,CAAI,OAAO,CAAC,CAAA;AAClD,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,eAAA,CAAgB,CAAA,IAAA,KAAQ;AACtB,UAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,IAAI,CAAA;AAC3B,UAAA,MAAA,CAAO,OAAO,OAAO,CAAA;AACrB,UAAA,OAAO,MAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH,GAAG,GAAI,CAAA;AAAA,IACT,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,GAAG,CAAA;AAAA,IAC5C;AAAA,EACF,CAAA;AAGA,EAAA,uBACEF,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,4BAAA,EAA+B,SAAS,CAAA,CAAA,EACtD,QAAA,EAAA;AAAA,oBAAAD,IAAC,OAAA,EAAA,EAAO,QAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA,EAQN,CAAA;AAAA,oBACFA,GAAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAe,CAAC,SAAA,EAAW,UAAU,CAAA;AAAA,QACrC,aAAA,EAAe,CAAC,WAAW,CAAA;AAAA,QAC3B,UAAA,EAAY;AAAA,UACV,KAAK,EAAE,SAAA,EAAAQ,YAAW,QAAA,EAAU,GAAG,OAAM,EAAG;AACtC,YAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,IAAA,CAAKA,UAAAA,IAAa,EAAE,CAAA;AAEnD,YAAA,IAAI,SAAS,WAAA,EAAa;AACxB,cAAA,MAAM,WAAW,MAAA,CAAO,QAAQ,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACnD,cAAA,MAAM,OAAA,GAAU,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,MAAA,CAAO,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAE/D,cAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,cAAA,IAAI;AACF,gBAAA,eAAA,GAAkB,WAAA,CAAY,WAAW,QAAA,EAAU;AAAA,kBACjD,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,kBACb,KAAA,EAAO,SAAS,aAAA,GAAgB;AAAA,iBACjC,CAAA;AAAA,cACH,SAAS,CAAA,EAAG;AAEV,gBAAA,IAAI;AACF,kBAAA,eAAA,GAAkB,WAAA,CAAY,WAAW,QAAA,EAAU;AAAA,oBACjD,IAAA,EAAM,MAAA;AAAA,oBACN,KAAA,EAAO,SAAS,aAAA,GAAgB;AAAA,mBACjC,CAAA;AAAA,gBACH,SAAS,aAAA,EAAe;AAEtB,kBAAA,eAAA,GAAkB,cAAc,QAAQ,CAAA,aAAA,CAAA;AAAA,gBAC1C;AAAA,cACF;AAEA,cAAA,uBACEP,IAAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,QAAA,EAAU,YAAW,EACjC,QAAA,EAAA;AAAA,gCAAAD,GAAAA,CAAC,SAAI,SAAA,EAAU,eAAA,EAAgB,yBAAyB,EAAE,MAAA,EAAQ,iBAAgB,EAAG,CAAA;AAAA,gCACrFA,GAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,OAAA,EAAS,MAAM,eAAA,CAAgB,QAAA,EAAU,OAAO,CAAA;AAAA,oBAChD,KAAA,EAAO;AAAA,sBACL,QAAA,EAAU,UAAA;AAAA,sBACV,GAAA,EAAK,KAAA;AAAA,sBACL,KAAA,EAAO,KAAA;AAAA,sBACP,eAAA,EAAiB,4CAAA;AAAA,sBACjB,MAAA,EAAQ,+CAAA;AAAA,sBACR,YAAA,EAAc,KAAA;AAAA,sBACd,OAAA,EAAS,KAAA;AAAA,sBACT,QAAA,EAAU,MAAA;AAAA,sBACV,MAAA,EAAQ,SAAA;AAAA,sBACR,KAAA,EAAO,wCAAA;AAAA,sBACP,UAAA,EAAY,QAAA;AAAA,sBACZ,cAAA,EAAgB,QAAA;AAAA,sBAChB,UAAA,EAAY,eAAA;AAAA,sBACZ,KAAA,EAAO,MAAA;AAAA,sBACP,MAAA,EAAQ;AAAA,qBACV;AAAA,oBACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,sBAAA,CAAA,CAAE,aAAA,CAAc,KAAA,CAAM,eAAA,GAAkB,MAAA,GACpC,+CAAA,GACA,4CAAA;AAAA,oBACN,CAAA;AAAA,oBACA,YAAA,EAAc,CAAC,CAAA,KAAM;AACnB,sBAAA,CAAA,CAAE,aAAA,CAAc,KAAA,CAAM,eAAA,GAAkB,MAAA,GACpC,4CAAA,GACA,+CAAA;AAAA,oBACN,CAAA;AAAA,oBACA,KAAA,EAAO,YAAA,CAAa,GAAA,CAAI,OAAO,IAAI,SAAA,GAAY,WAAA;AAAA,oBAE9C,QAAA,EAAA,YAAA,CAAa,IAAI,OAAO,CAAA,mBACvBA,GAAAA,CAAC,SAAA,EAAA,EAAU,OAAO,EAAE,QAAA,EAAU,QAAO,EAAG,CAAA,mBAExCA,GAAAA,CAAC,eAAA,EAAA,EAAgB,OAAO,EAAE,QAAA,EAAU,QAAO,EAAG;AAAA;AAAA;AAElD,eAAA,EACF,CAAA;AAAA,YAEJ;AAEA,YAAA,uBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAWQ,UAAAA,EAAY,GAAG,OAC7B,QAAA,EACH,CAAA;AAAA,UAEJ;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA;AAAA;AACH,GAAA,EACF,CAAA;AAEJ,CAAA;AAEA,IAAO,oBAAA,GAAQ;AChIf,IAAM,mBAAA,GAAsBC,cAAmD,MAAS,CAAA;AAkCjF,IAAM,uBAA4D,CAAC;AAAA,EACtE,QAAA;AAAA,EACA,eAAA,GAAkB,GAAA;AAAA,EAClB,gBAAA,GAAmB,CAAA;AAAA,EACnB,YAAA,GAAe,EAAE,QAAA,EAAU,KAAA,EAAO,YAAY,OAAA;AAClD,CAAA,KAAM;AACF,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAIF,QAAAA,CAAyB,EAAE,CAAA;AAErE,EAAA,MAAM,mBAAmBG,WAAAA,CAAY,CACjC,OAAA,EACA,IAAA,EACA,WAAmB,eAAA,KAClB;AACD,IAAA,MAAM,EAAA,GAAK,GAAG,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAA;AACzC,IAAA,MAAM,eAAA,GAAgC,EAAE,EAAA,EAAI,OAAA,EAAS,MAAM,QAAA,EAAS;AAEpE,IAAA,gBAAA,CAAiB,CAAC,IAAA,KAAS;AAEvB,MAAA,MAAM,OAAA,GAAU,CAAC,GAAG,IAAA,EAAM,eAAe,CAAA;AACzC,MAAA,IAAI,OAAA,CAAQ,SAAS,gBAAA,EAAkB;AACnC,QAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,gBAAgB,CAAA;AAAA,MAC1D;AACA,MAAA,OAAO,OAAA;AAAA,IACX,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,eAAA,EAAiB,gBAAgB,CAAC,CAAA;AAEtC,EAAA,MAAM,WAAA,GAAcA,WAAAA,CAAY,CAAC,EAAA,KAAe;AAC5C,IAAA,gBAAA,CAAiB,CAAC,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,EAAA,KAAO,EAAE,CAAC,CAAA;AAAA,EACtE,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,OAAA,GAAUA,WAAAA,CAAY,CAAC,OAAA,EAAiB,QAAA,KAAsB;AAChE,IAAA,gBAAA,CAAiB,OAAA,EAAS,WAAW,QAAQ,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,KAAA,GAAQA,WAAAA,CAAY,CAAC,OAAA,EAAiB,QAAA,KAAsB;AAC9D,IAAA,gBAAA,CAAiB,OAAA,EAAS,SAAS,QAAQ,CAAA;AAAA,EAC/C,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,OAAA,GAAUA,WAAAA,CAAY,CAAC,OAAA,EAAiB,QAAA,KAAsB;AAChE,IAAA,gBAAA,CAAiB,OAAA,EAAS,WAAW,QAAQ,CAAA;AAAA,EACjD,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,IAAA,GAAOA,WAAAA,CAAY,CAAC,OAAA,EAAiB,QAAA,KAAsB;AAC7D,IAAA,gBAAA,CAAiB,OAAA,EAAS,QAAQ,QAAQ,CAAA;AAAA,EAC9C,CAAA,EAAG,CAAC,gBAAgB,CAAC,CAAA;AAErB,EAAA,MAAM,YAAA,GAAwC;AAAA,IAC1C,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACJ;AAEA,EAAA,uBACIT,IAAAA,CAAC,mBAAA,CAAoB,QAAA,EAApB,EAA6B,OAAO,YAAA,EAChC,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,aAAA,CAAc,GAAA,CAAI,CAAC,YAAA,EAAc,0BAC9BD,GAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QAEG,IAAA,EAAM,IAAA;AAAA,QACN,kBAAkB,YAAA,CAAa,QAAA;AAAA,QAC/B,OAAA,EAAS,MAAM,WAAA,CAAY,YAAA,CAAa,EAAE,CAAA;AAAA,QAC1C,YAAA;AAAA,QACA,KAAA,EAAO;AAAA,UACH,WAAW,KAAA,GAAQ;AAAA;AAAA,SACvB;AAAA,QAEA,QAAA,kBAAAA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACG,OAAA,EAAS,MAAM,WAAA,CAAY,YAAA,CAAa,EAAE,CAAA;AAAA,YAC1C,UAAU,YAAA,CAAa,IAAA;AAAA,YACvB,OAAA,EAAQ,QAAA;AAAA,YACR,EAAA,EAAI,EAAE,KAAA,EAAO,MAAA,EAAO;AAAA,YAEnB,QAAA,EAAA,YAAA,CAAa;AAAA;AAAA;AAClB,OAAA;AAAA,MAhBK,YAAA,CAAa;AAAA,KAkBzB;AAAA,GAAA,EACL,CAAA;AAER;AAoBO,IAAM,kBAAkB,MAA+B;AAC1D,EAAA,MAAM,OAAA,GAAUW,WAAW,mBAAmB,CAAA;AAC9C,EAAA,IAAI,CAAC,OAAA,EAAS;AACV,IAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,EAChF;AACA,EAAA,OAAO,OAAA;AACX;AC9IO,IAAM,gBAAgB,CAAC;AAAA,EAC5B,IAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA,GAAc,SAAA;AAAA,EACd,UAAA,GAAa,QAAA;AAAA,EACb,YAAA,GAAe,SAAA;AAAA,EACf,SAAA;AAAA,EACA;AACF,CAAA,KAA0B;AACxB,EAAA,uBACEV,KAAC,MAAA,EAAA,EAAO,IAAA,EAAY,SAAS,QAAA,EAAU,QAAA,EAAS,MAAK,SAAA,EAAS,IAAA,EAAC,WAAW,EAAE,KAAA,EAAO,EAAE,EAAA,EAAI,EAAE,cAAc,CAAA,EAAE,IAAI,EAC7G,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,WAAA,EAAA,EACC,QAAA,kBAAAC,IAAAA,CAACG,KAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,UAAA,EAAY,QAAA,EAAU,GAAA,EAAK,GAAE,EACvD,QAAA,EAAA;AAAA,sBAAAJ,GAAAA,CAAC,gBAAA,EAAA,EAAiB,KAAA,EAAO,YAAA,EAAc,CAAA;AAAA,MACtC;AAAA,KAAA,EACH,CAAA,EACF,CAAA;AAAA,oBACAA,GAAAA,CAAC,aAAA,EAAA,EACC,QAAA,kBAAAA,GAAAA,CAACK,YAAA,EAAW,OAAA,EAAQ,OAAA,EAAS,QAAA,EAAA,OAAA,EAAQ,CAAA,EACvC,CAAA;AAAA,oBACAJ,KAAC,aAAA,EAAA,EAAc,EAAA,EAAI,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAE,EAChC,QAAA,EAAA;AAAA,sBAAAD,IAACY,MAAAA,EAAA,EAAO,SAAS,QAAA,EAAU,OAAA,EAAQ,YAChC,QAAA,EAAA,UAAA,EACH,CAAA;AAAA,sBACAZ,GAAAA,CAACY,MAAAA,EAAA,EAAO,OAAA,EAAS,SAAA,EAAW,OAAA,EAAQ,WAAA,EAAY,KAAA,EAAO,YAAA,EAAc,SAAA,EAAS,IAAA,EAC3E,QAAA,EAAA,WAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;ACjDO,SAAS,MAAM,OAAA,EAAwD;AAC5E,EAAA,OAAO,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACzC;;;ACFO,SAAS,QAAA,CACd,MACA,IAAA,EACkC;AAClC,EAAA,IAAI,SAAA,GAAkD,IAAA;AAEtD,EAAA,OAAO,YAAwB,IAAA,EAAqB;AAClD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAEA,IAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,MAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,IACvB,GAAG,IAAI,CAAA;AAAA,EACT,CAAA;AACF;;;AChBO,SAAS,QAAA,CACd,MACA,IAAA,EACkC;AAClC,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,OAAO,YAAwB,IAAA,EAAqB;AAClD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,GAAA,GAAM,YAAY,IAAA,EAAM;AAC1B,MAAA,QAAA,GAAW,GAAA;AACX,MAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AACF;;;ACdO,SAAS,UAAA,CACd,MACA,OAAA,GAAsC;AAAA,EACpC,IAAA,EAAM,SAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAA,EACQ;AACR,EAAA,MAAM,OAAA,GAAU,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,SAAS,QAAA,GACxD,IAAI,IAAA,CAAK,IAAI,CAAA,GACb,IAAA;AAEJ,EAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,SAAS,OAAO,CAAA,CAAE,OAAO,OAAO,CAAA;AACjE;;;ACZA,IAAM,WAAA,GAAc,iBAAA;AAuBb,IAAM,cAAA,GAAN,MAAM,eAAA,CAA0C;AAAA,EAM3C,WAAA,CAAY,MAAA,EAAoB,GAAA,GAAM,WAAA,EAAa;AAF3D,IAAA,IAAA,CAAQ,KAAA,GAA+B,IAAA;AAGnC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AAAA,EACf;AAAA,EAEA,OAAO,YAAY,MAAA,EAAoC;AACnD,IAAA,IAAI,CAAC,gBAAe,QAAA,EAAU;AAC1B,MAAA,eAAA,CAAe,QAAA,GAAW,IAAI,eAAA,CAAe,MAAM,CAAA;AAAA,IACvD;AACA,IAAA,OAAO,eAAA,CAAe,QAAA;AAAA,EAC1B;AAAA,EAEA,KAAK,OAAA,EAA+B;AAChC,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA;AACb,IAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AACtC,IAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,WAAW,CAAA;AAAA,EACzC;AAAA,EAEA,MAAM,OAAA,EAAwC;AAC1C,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,MAAM,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,GAAG,OAAA,EAAQ;AACzC,IAAA,IAAA,CAAK,KAAA,GAAQ,OAAA;AACb,IAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AACtC,IAAA,IAAI,QAAQ,WAAA,EAAa;AACrB,MAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,WAAW,CAAA;AAAA,IACzC;AAAA,EACJ;AAAA,EAEA,KAAA,GAAc;AACV,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,YAAA,CAAa,UAAA,CAAW,KAAK,GAAG,CAAA;AAChC,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACxB;AAAA,EAEA,GAAA,GAA6B;AACzB,IAAA,IAAI,IAAA,CAAK,KAAA,KAAU,IAAA,EAAM,OAAO,IAAA,CAAK,KAAA;AACrC,IAAA,IAAA,CAAK,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAwB,IAAA,CAAK,GAAG,CAAA;AAC1D,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EAChB;AAAA,EAEA,cAAA,GAAqC;AACjC,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,EAAG,WAAA,IAAe,MAAA;AAAA,EACtC;AAAA,EAEA,eAAA,GAAsC;AAClC,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,EAAG,YAAA,IAAgB,MAAA;AAAA,EACvC;AAAA,EAEA,YAAA,GAAmC;AAC/B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,EAAG,SAAA,IAAa,MAAA;AAAA,EACpC;AAAA,EAEA,eAAA,GAA2B;AACvB,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,IAAI,CAAC,OAAA,EAAS,WAAA,EAAa,OAAO,KAAA;AAClC,IAAA,OAAO,OAAO,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA,CAAK,KAAI,GAAI,GAAA;AAAA,EACpD;AAAA,EAEA,UAAA,GAAmB;AACf,IAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,IAAA,IAAI,OAAA,EAAS,eAAe,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,GAAI,IAAA,CAAK,GAAA,EAAI,GAAI,GAAA,EAAM;AACvE,MAAA,IAAA,CAAK,YAAA,CAAa,QAAQ,WAAW,CAAA;AAAA,IACzC,CAAA,MAAO;AACH,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACf;AAAA,EACJ;AAAA,EAEQ,aAAa,KAAA,EAAqB;AACtC,IAAA,IAAA,CAAK,MAAA,CAAO,gBAAA,CAAiB,eAAA,EAAiB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AAAA,EACnE;AAAA,EAEQ,cAAA,GAAuB;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,oBAAoB,eAAe,CAAA;AAAA,EACnD;AAEJ;;;AC/FA,IAAM,QAAA,GAAW,cAAA;AAeV,IAAM,WAAA,GAAN,MAAM,YAAA,CAAoC;AAAA,EAKvC,YAAY,MAAA,EAAoB;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,cAAA,GAAiB,cAAA,CAAe,WAAA,CAAY,MAAM,CAAA;AAAA,EACzD;AAAA,EAEA,OAAO,YAAY,MAAA,EAAiC;AAClD,IAAA,IAAI,CAAC,aAAY,QAAA,EAAU;AACzB,MAAA,YAAA,CAAY,QAAA,GAAW,IAAI,YAAA,CAAY,MAAM,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,YAAA,CAAY,QAAA;AAAA,EACrB;AAAA,EAEA,MAAM,OAAO,OAAA,EAAiD;AAC5D,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACjC,GAAG,QAAQ,CAAA,YAAA,CAAA;AAAA,MACX;AAAA,KACF;AACA,IAAA,IAAI,QAAA,CAAS,KAAK,WAAA,EAAa;AAC7B,MAAA,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,aAAa,OAAA,EAAuE;AACxF,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,cAAA,CAAe,eAAA,EAAgB;AACzD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACjC,GAAG,QAAQ,CAAA,aAAA,CAAA;AAAA,MACX,EAAE,YAAA,EAAc,GAAG,OAAA;AAAQ,KAC7B;AAEA,IAAA,IAAI,QAAA,CAAS,KAAK,WAAA,EAAa;AAC7B,MAAA,IAAA,CAAK,eAAe,KAAA,CAAM;AAAA,QACxB,WAAA,EAAa,SAAS,IAAA,CAAK,WAAA;AAAA,QAC3B,YAAA,EAAc,SAAS,IAAA,CAAK;AAAA,OAC7B,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,OAAO,OAAA,EAAiD;AAC5D,IAAA,IAAI;AACF,MAAA,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,cAAA,CAAe,YAAA,EAAa;AACrD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACjC,GAAG,QAAQ,CAAA,YAAA,CAAA;AAAA,QACX,WAAW;AAAC,OACd;AACA,MAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAClB,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,mBAAmB,OAAA,EAA0E;AACjG,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,GAAA;AAAA,MACjC,GAAG,QAAQ,CAAA,iBAAA,CAAA;AAAA,MACX,WAAW;AAAC,KACd;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,MAAM,qBAAqB,OAAA,EAA+D;AACxF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,MACjC,GAAG,QAAQ,CAAA,uBAAA,CAAA;AAAA,MACX;AAAA,KACF;AACA,IAAA,IAAI,QAAA,CAAS,KAAK,WAAA,EAAa;AAC7B,MAAA,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAAA,EAEA,eAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,eAAe,eAAA,EAAgB;AAAA,EAC7C;AAAA,EAEA,cAAA,GAAqC;AACnC,IAAA,OAAO,IAAA,CAAK,eAAe,cAAA,EAAe;AAAA,EAC5C;AAAA,EAEA,iBAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,eAAe,GAAA,EAAI;AAAA,EACjC;AAAA,EAEA,YAAA,GAAmC;AACjC,IAAA,OAAO,IAAA,CAAK,eAAe,YAAA,EAAa;AAAA,EAC1C;AAAA,EAEA,cAAA,GAAuB;AACrB,IAAA,IAAA,CAAK,eAAe,UAAA,EAAW;AAAA,EACjC;AACF","file":"index.mjs","sourcesContent":["/**\n * Design Tokens - Theme-agnostic values\n * These tokens serve as the foundation for light and dark themes\n * Following Material Design 3 principles\n */\n\n/**\n * Spacing scale based on 4px grid system\n */\nexport const spacing = {\n xs: '0.25rem', // 4px\n sm: '0.5rem', // 8px\n md: '1rem', // 16px\n lg: '1.5rem', // 24px\n xl: '2rem', // 32px\n '2xl': '3rem', // 48px\n '3xl': '4rem', // 64px\n} as const\n\n/**\n * Border radius tokens\n */\nexport const borderRadius = {\n none: '0',\n sm: '0.25rem', // 4px\n md: '0.375rem', // 6px\n lg: '0.5rem', // 8px\n xl: '0.75rem', // 12px\n '2xl': '1rem', // 16px\n full: '9999px',\n} as const\n\n/**\n * Typography scale\n */\nexport const fontSize = {\n xs: '0.75rem', // 12px\n sm: '0.875rem', // 14px\n md: '1rem', // 16px\n lg: '1.125rem', // 18px\n xl: '1.25rem', // 20px\n '2xl': '1.5rem', // 24px\n '3xl': '1.875rem', // 30px\n '4xl': '2.25rem', // 36px\n} as const\n\n/**\n * Font weights\n */\nexport const fontWeight = {\n light: '300',\n normal: '400',\n medium: '500',\n semibold: '600',\n bold: '700',\n} as const\n\n/**\n * Line heights\n */\nexport const lineHeight = {\n tight: '1.25',\n normal: '1.5',\n relaxed: '1.75',\n} as const\n\n/**\n * Elevation (box shadows) for depth perception\n */\nexport const elevation = {\n none: 'none',\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n xl: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)',\n} as const\n\n/**\n * Transition durations\n */\nexport const transition = {\n fast: '150ms',\n normal: '250ms',\n slow: '350ms',\n} as const\n\n/**\n * Z-index scale for layering\n */\nexport const zIndex = {\n dropdown: 1000,\n sticky: 1020,\n fixed: 1030,\n modalBackdrop: 1040,\n modal: 1050,\n popover: 1060,\n tooltip: 1070,\n} as const\n","import { spacing, borderRadius, fontSize, fontWeight, lineHeight, elevation, transition, zIndex } from './tokens'\nimport { Theme } from './types'\n\n/**\n * Light theme configuration\n * Colors are WCAG AA compliant with minimum contrast ratio of 4.5:1 for normal text\n * and 3:1 for large text\n */\nexport const lightTheme: Theme = {\n colors: {\n // Primary - Vibrant Indigo (Works beautifully on light backgrounds)\n primary: '#6366f1', // Indigo 500\n primaryHover: '#4f46e5', // Indigo 600\n primaryActive: '#4338ca', // Indigo 700\n\n // Secondary - Gray 600 (WCAG AAA compliant: 7.66:1 on white)\n secondary: '#4b5563',\n secondaryHover: '#374151',\n secondaryActive: '#1f2937',\n\n // Background colors\n background: '#ffffff',\n backgroundSecondary: '#f9fafb',\n backgroundTertiary: '#f3f4f6',\n\n // Surface colors (for cards, modals, etc.)\n surface: '#ffffff',\n surfaceHover: '#f9fafb',\n\n // Text colors (WCAG AAA compliant)\n text: '#111827', // Gray 900 (16.26:1 on white)\n textSecondary: '#4b5563', // Gray 600 (7.66:1 on white)\n textTertiary: '#6b7280', // Gray 500 (4.92:1 on white - AA compliant)\n textDisabled: '#9ca3af', // Gray 400\n\n // Semantic colors\n error: '#dc2626', // Red 600 (6.05:1 on white - AAA compliant)\n errorHover: '#b91c1c',\n errorBackground: '#fef2f2',\n\n success: '#16a34a', // Green 600 (5.15:1 on white - AAA compliant)\n successHover: '#15803d',\n successBackground: '#f0fdf4',\n\n warning: '#d97706', // Amber 600 (5.33:1 on white - AAA compliant)\n warningHover: '#b45309',\n warningBackground: '#fffbeb',\n\n info: '#2563eb', // Blue 600 (6.64:1 on white - AAA compliant)\n infoHover: '#1d4ed8',\n infoBackground: '#eff6ff',\n\n // Border colors\n border: '#e5e7eb', // Gray 200\n borderHover: '#d1d5db', // Gray 300\n borderFocus: '#6366f1', // Primary\n\n // Divider\n divider: '#e5e7eb',\n\n // Overlay (for modals, dropdowns)\n overlay: 'rgba(0, 0, 0, 0.5)',\n },\n\n spacing,\n borderRadius,\n fontSize,\n fontWeight,\n lineHeight,\n elevation,\n transition,\n zIndex,\n}\n","import { spacing, borderRadius, fontSize, fontWeight, lineHeight, elevation, transition, zIndex } from './tokens'\nimport { Theme } from './types'\n\n/**\n * Dark theme configuration\n * Colors are WCAG AA compliant with minimum contrast ratio of 4.5:1 for normal text\n * and 3:1 for large text on dark backgrounds\n */\nexport const darkTheme: Theme = {\n colors: {\n // Primary - Vibrant Indigo (Striking on VSCode Black)\n primary: '#a5b4fc', // Indigo 300 (lighter for better dark mode visibility)\n primaryHover: '#818cf8', // Indigo 400\n primaryActive: '#6366f1', // Indigo 500\n\n // Secondary - VSCode Gray\n secondary: '#858585',\n secondaryHover: '#a6a6a6',\n secondaryActive: '#cccccc',\n\n // Background colors\n background: '#1e1e1e', // Main editor/workspace background\n backgroundSecondary: '#252526', // Sidebar, panels\n backgroundTertiary: '#2d2d2d', // Highlights, smaller surfaces\n\n // Surface colors (for cards, modals, etc.)\n surface: '#252526',\n surfaceHover: '#2a2d2e',\n\n // Text colors\n text: '#cccccc', // Primary text\n textSecondary: '#999999', // Secondary text, comments\n textTertiary: '#6b6b6b', // Disabled/tertiary\n textDisabled: '#4d4d4d', // Disabled\n\n // Semantic colors\n error: '#f48771',\n errorHover: '#fca5a5',\n errorBackground: '#5a1d1d',\n\n success: '#89d185',\n successHover: '#86efac',\n successBackground: '#1e401e',\n\n warning: '#cca700',\n warningHover: '#d7ba7d',\n warningBackground: '#5c4d00',\n\n info: '#75beff',\n infoHover: '#9cdcfe',\n infoBackground: '#0a3254',\n\n // Border colors\n border: '#3c3c3c', // VSCode borders\n borderHover: '#444444',\n borderFocus: '#a5b4fc', // Focus border\n\n // Divider\n divider: '#333333',\n\n // Overlay (for modals, dropdowns)\n overlay: 'rgba(0, 0, 0, 0.4)',\n },\n\n spacing,\n borderRadius,\n fontSize,\n fontWeight,\n lineHeight,\n elevation,\n transition,\n zIndex,\n}\n","/**\n * LocalStorage utility for safely storing and retrieving data\n */\n\nexport class LocalStorage {\n /**\n * Get an item from localStorage\n * @param key - The key to retrieve\n * @returns The value or null if not found or error occurs\n */\n static getItem<T = string>(key: string): T | null {\n try {\n if (typeof window === 'undefined') {\n return null\n }\n \n const item = window.localStorage.getItem(key)\n \n if (item === null) {\n return null\n }\n \n try {\n return JSON.parse(item) as T\n } catch {\n // If JSON parse fails, return as string\n return item as T\n }\n } catch (error) {\n console.error(`Error getting item from localStorage: ${error}`)\n return null\n }\n }\n\n /**\n * Set an item in localStorage\n * @param key - The key to store\n * @param value - The value to store\n * @returns true if successful, false otherwise\n */\n static setItem<T>(key: string, value: T): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n const serializedValue = typeof value === 'string' \n ? value \n : JSON.stringify(value)\n \n window.localStorage.setItem(key, serializedValue)\n return true\n } catch (error) {\n console.error(`Error setting item in localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Remove an item from localStorage\n * @param key - The key to remove\n * @returns true if successful, false otherwise\n */\n static removeItem(key: string): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n window.localStorage.removeItem(key)\n return true\n } catch (error) {\n console.error(`Error removing item from localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Clear all items from localStorage\n * @returns true if successful, false otherwise\n */\n static clear(): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n window.localStorage.clear()\n return true\n } catch (error) {\n console.error(`Error clearing localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Check if a key exists in localStorage\n * @param key - The key to check\n * @returns true if key exists, false otherwise\n */\n static hasItem(key: string): boolean {\n try {\n if (typeof window === 'undefined') {\n return false\n }\n \n return window.localStorage.getItem(key) !== null\n } catch (error) {\n console.error(`Error checking item in localStorage: ${error}`)\n return false\n }\n }\n\n /**\n * Get all keys from localStorage\n * @returns Array of keys\n */\n static keys(): string[] {\n try {\n if (typeof window === 'undefined') {\n return []\n }\n \n return Object.keys(window.localStorage)\n } catch (error) {\n console.error(`Error getting keys from localStorage: ${error}`)\n return []\n }\n }\n}\n","import React, { createContext, useState, ReactNode, useCallback, useEffect, useMemo } from 'react'\nimport { Theme, ThemeContextValue, ThemeMode, ResolvedThemeMode } from './types'\nimport { lightTheme } from './light'\nimport { darkTheme } from './dark'\nimport { LocalStorage } from '../utils/localStorage'\nimport { ThemeProvider as MuiThemeProvider, createTheme, CssBaseline } from '@mui/material'\n\nexport const ThemeContext = createContext<ThemeContextValue | undefined>(undefined)\n\nconst THEME_STORAGE_KEY = 'app-theme-mode'\n\nexport interface ThemeProviderProps {\n children: ReactNode\n /** Custom theme object (overrides default light/dark themes) */\n initialTheme?: Theme\n /** Initial theme mode */\n initialMode?: ThemeMode\n /** localStorage key for persisting theme preference */\n storageKey?: string\n /** Enable CSS variables injection */\n enableCssVariables?: boolean\n}\n\n/**\n * Detects system color scheme preference\n */\nconst getSystemTheme = (): ResolvedThemeMode => {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\n/**\n * Applies theme as CSS variables to document root\n */\nconst applyCssVariables = (theme: Theme, resolvedMode: ResolvedThemeMode): void => {\n if (typeof document === 'undefined') return\n\n const root = document.documentElement\n\n // Set data attribute for theme mode\n root.setAttribute('data-theme', resolvedMode)\n\n // Apply color variables\n Object.entries(theme.colors).forEach(([key, value]) => {\n root.style.setProperty(`--color-${key.replace(/([A-Z])/g, '-$1').toLowerCase()}`, value)\n })\n\n // Apply spacing variables\n Object.entries(theme.spacing).forEach(([key, value]) => {\n root.style.setProperty(`--spacing-${key}`, value)\n })\n\n // Apply border radius variables\n Object.entries(theme.borderRadius).forEach(([key, value]) => {\n root.style.setProperty(`--radius-${key}`, value)\n })\n\n // Apply font size variables\n Object.entries(theme.fontSize).forEach(([key, value]) => {\n root.style.setProperty(`--text-${key}`, value)\n })\n\n // Apply font weight variables\n Object.entries(theme.fontWeight).forEach(([key, value]) => {\n root.style.setProperty(`--font-${key}`, value)\n })\n\n // Apply line height variables\n Object.entries(theme.lineHeight).forEach(([key, value]) => {\n root.style.setProperty(`--leading-${key}`, value)\n })\n\n // Apply elevation variables\n Object.entries(theme.elevation).forEach(([key, value]) => {\n root.style.setProperty(`--shadow-${key}`, value)\n })\n\n // Apply transition variables\n Object.entries(theme.transition).forEach(([key, value]) => {\n root.style.setProperty(`--transition-${key}`, value)\n })\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n initialTheme,\n initialMode = 'system',\n storageKey = THEME_STORAGE_KEY,\n enableCssVariables = true,\n}) => {\n // Load theme mode from localStorage or use initialMode\n const getInitialMode = (): ThemeMode => {\n const savedMode = LocalStorage.getItem<ThemeMode>(storageKey)\n return savedMode || initialMode\n }\n\n const [themeMode, setThemeModeState] = useState<ThemeMode>(getInitialMode)\n const [systemTheme, setSystemTheme] = useState<ResolvedThemeMode>(getSystemTheme)\n const [customTheme, setCustomTheme] = useState<Theme | undefined>(initialTheme)\n\n // Calculate resolved theme mode\n const resolvedThemeMode: ResolvedThemeMode = useMemo(() => {\n if (themeMode === 'system') return systemTheme\n return themeMode as ResolvedThemeMode\n }, [themeMode, systemTheme])\n\n // Get current theme\n const theme: Theme = useMemo(() => {\n if (customTheme) return customTheme\n return resolvedThemeMode === 'light' ? lightTheme : darkTheme\n }, [customTheme, resolvedThemeMode])\n\n // Listen for system theme changes\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n\n const handleChange = (e: MediaQueryListEvent) => {\n setSystemTheme(e.matches ? 'dark' : 'light')\n }\n\n // Modern browsers\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange)\n return () => mediaQuery.removeEventListener('change', handleChange)\n }\n // Legacy browsers\n else if (mediaQuery.addListener) {\n mediaQuery.addListener(handleChange)\n return () => mediaQuery.removeListener(handleChange)\n }\n }, [])\n\n // Apply CSS variables when theme changes\n useEffect(() => {\n if (enableCssVariables) {\n applyCssVariables(theme, resolvedThemeMode)\n }\n }, [theme, resolvedThemeMode, enableCssVariables])\n\n // Save theme mode to localStorage whenever it changes\n useEffect(() => {\n LocalStorage.setItem(storageKey, themeMode)\n }, [themeMode, storageKey])\n\n const setThemeMode = useCallback((mode: ThemeMode) => {\n setThemeModeState(mode)\n }, [])\n\n const setTheme = useCallback((newTheme: Theme) => {\n setCustomTheme(newTheme)\n }, [])\n\n const toggleTheme = useCallback(() => {\n setThemeModeState((prevMode) => {\n if (prevMode === 'light') return 'dark'\n if (prevMode === 'dark') return 'system'\n return 'light'\n })\n }, [])\n\n const contextValue: ThemeContextValue = useMemo(() => ({\n theme,\n themeMode,\n resolvedThemeMode,\n setTheme,\n setThemeMode,\n toggleTheme,\n }), [theme, themeMode, resolvedThemeMode, setTheme, setThemeMode, toggleTheme])\n\n const muiTheme = useMemo(() => createTheme({\n palette: {\n mode: resolvedThemeMode,\n primary: {\n main: theme.colors.primary,\n },\n secondary: {\n main: theme.colors.secondary,\n },\n error: {\n main: theme.colors.error,\n },\n success: {\n main: theme.colors.success,\n },\n background: {\n default: theme.colors.background,\n paper: theme.colors.backgroundSecondary,\n },\n text: {\n primary: theme.colors.text,\n secondary: theme.colors.textSecondary,\n }\n },\n }), [resolvedThemeMode, theme])\n\n return (\n <ThemeContext.Provider value={contextValue}>\n <MuiThemeProvider theme={muiTheme}>\n <CssBaseline />\n {children}\n </MuiThemeProvider>\n </ThemeContext.Provider>\n )\n}\n","import { useContext } from 'react'\nimport { ThemeContext } from './ThemeProvider'\nimport { ThemeContextValue } from './types'\n\nexport const useTheme = (): ThemeContextValue => {\n const context = useContext(ThemeContext)\n \n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n \n return context\n}\n","import React from 'react'\nimport { IconButton, IconButtonProps, Tooltip } from '@mui/material'\nimport { DarkMode, LightMode, BrightnessAuto } from '@mui/icons-material'\nimport { useTheme } from './useTheme'\n\nexport interface ThemeToggleProps extends Omit<IconButtonProps, 'onClick'> {\n /**\n * Tooltip text for light mode\n * @default \"Switch to dark mode\"\n */\n lightModeTooltip?: string\n\n /**\n * Tooltip text for dark mode\n * @default \"Switch to system mode\"\n */\n darkModeTooltip?: string\n\n /**\n * Tooltip text for system mode\n * @default \"Switch to light mode\"\n */\n systemModeTooltip?: string\n\n /**\n * Whether to show tooltip\n * @default true\n */\n showTooltip?: boolean\n}\n\n/**\n * A round button component for toggling between light, dark, and system themes\n */\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({\n lightModeTooltip = 'Switch to dark mode',\n darkModeTooltip = 'Switch to system theme',\n systemModeTooltip = 'Switch to light theme',\n showTooltip = true,\n sx,\n ...props\n}) => {\n const { themeMode, toggleTheme } = useTheme()\n\n const getIcon = () => {\n switch (themeMode) {\n case 'light':\n return <LightMode />\n case 'dark':\n return <DarkMode />\n case 'system':\n return <BrightnessAuto />\n default:\n return <BrightnessAuto />\n }\n }\n\n const getTooltip = () => {\n switch (themeMode) {\n case 'light':\n return lightModeTooltip\n case 'dark':\n return darkModeTooltip\n case 'system':\n return systemModeTooltip\n default:\n return lightModeTooltip\n }\n }\n\n const button = (\n <IconButton\n onClick={toggleTheme}\n color=\"inherit\"\n sx={{\n borderRadius: '50%',\n ...sx\n }}\n {...props}\n >\n {getIcon()}\n </IconButton>\n )\n\n if (!showTooltip) {\n return button\n }\n\n return (\n <Tooltip title={getTooltip()} arrow>\n {button}\n </Tooltip>\n )\n}\n","import { Box, Typography, Button } from '@mui/material'\nimport { SentimentDissatisfied } from '@mui/icons-material'\nimport { useNavigate } from 'react-router-dom'\nimport { useTheme } from '../theme'\n\nexport function NotFoundPage() {\n const navigate = useNavigate()\n const { theme } = useTheme()\n\n return (\n <Box\n sx={{\n minHeight: '100vh',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.colors.backgroundSecondary,\n gap: 2,\n textAlign: 'center',\n px: 2,\n }}\n >\n <SentimentDissatisfied sx={{ fontSize: 72, color: 'text.disabled' }} />\n <Typography variant=\"h2\" fontWeight=\"bold\" color=\"text.primary\">\n 404\n </Typography>\n <Typography variant=\"h6\" color=\"text.secondary\">\n Page not found\n </Typography>\n <Typography variant=\"body2\" color=\"text.disabled\" sx={{ maxWidth: 360 }}>\n The page you're looking for doesn't exist or has been moved.\n </Typography>\n <Button\n variant=\"contained\"\n sx={{ mt: 2, textTransform: 'none' }}\n onClick={() => navigate('/', { replace: true })}\n >\n Go to Home\n </Button>\n </Box>\n )\n}\n","import { HttpClientConfig, RequestConfig, HttpResponse, HttpError } from './types'\n\nexport class HttpClient {\n private baseURL: string\n private timeout: number\n private defaultHeaders: Record<string, string>\n\n constructor(config: HttpClientConfig = {}) {\n this.baseURL = config.baseURL || ''\n this.timeout = config.timeout || 30000\n this.defaultHeaders = config.headers || {}\n }\n\n private buildURL(url: string, params?: Record<string, string | number | boolean>): string {\n const fullURL = url.startsWith('http') ? url : `${this.baseURL}${url}`\n \n if (!params) return fullURL\n \n const searchParams = new URLSearchParams()\n Object.entries(params).forEach(([key, value]) => {\n searchParams.append(key, String(value))\n })\n \n return `${fullURL}?${searchParams.toString()}`\n }\n\n private async request<T = any>(\n url: string,\n config: RequestConfig = {}\n ): Promise<HttpResponse<T>> {\n const { params, data, timeout = this.timeout, headers = {}, ...restConfig } = config\n\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(this.buildURL(url, params), {\n ...restConfig,\n headers: {\n 'Content-Type': 'application/json',\n ...this.defaultHeaders,\n ...headers,\n },\n body: data ? JSON.stringify(data) : undefined,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n const error: HttpError = new Error(`HTTP Error: ${response.statusText}`)\n error.status = response.status\n error.statusText = response.statusText\n try {\n error.data = await response.json()\n } catch {\n error.data = { code: response.status, message: await response.text() }\n }\n throw error\n }\n\n const responseData = await response.json()\n\n return {\n data: responseData as T,\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n }\n } catch (error) {\n clearTimeout(timeoutId)\n if (error instanceof Error && error.name === 'AbortError') {\n throw new Error('Request timeout')\n }\n throw error\n }\n }\n\n setDefaultHeader(key: string, value: string): void {\n this.defaultHeaders[key] = value\n }\n\n removeDefaultHeader(key: string): void {\n delete this.defaultHeaders[key]\n }\n\n getDefaultHeaders(): Record<string, string> {\n return { ...this.defaultHeaders }\n }\n\n get<T = any>(url: string, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, method: 'GET' })\n }\n\n post<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'POST' })\n }\n\n put<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'PUT' })\n }\n\n patch<T = any>(url: string, data?: any, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, data, method: 'PATCH' })\n }\n\n delete<T = any>(url: string, config?: RequestConfig): Promise<HttpResponse<T>> {\n return this.request<T>(url, { ...config, method: 'DELETE' })\n }\n}\n\nexport function extractErrorMessage(error: any): string {\n if (error instanceof Error) {\n const httpError = error as HttpError\n if (httpError.data) {\n return httpError.data.message\n }\n return error.message\n }\n return 'An unexpected error occurred'\n}\n","import { useEffect } from 'react'\nimport { Box, CircularProgress, Typography } from '@mui/material'\nimport { useNavigate, useSearchParams } from 'react-router-dom'\nimport { extractErrorMessage } from '../http'\nimport { useTheme } from '../theme'\nimport type { IAuthService } from '../auth'\n\nexport interface LoginCallbackPageProps {\n authService: IAuthService\n navigateTo?: string\n onLoginFailed?: () => void\n}\n\nexport function LoginCallbackPage({ authService, navigateTo = '/', onLoginFailed }: LoginCallbackPageProps) {\n const [searchParams] = useSearchParams()\n const navigate = useNavigate()\n const { theme } = useTheme()\n\n useEffect(() => {\n const loginToken = searchParams.get('login_token')\n\n if (!loginToken) {\n console.error('Login callback failed: Missing login_token in query parameters')\n onLoginFailed?.()\n return\n }\n authService\n .signInWithLoginToken({ loginToken })\n .then(() => {\n navigate(navigateTo, { replace: true })\n })\n .catch((err: unknown) => {\n console.error('Login callback failed:', extractErrorMessage(err))\n onLoginFailed?.()\n })\n }, [])\n\n return (\n <Box\n sx={{\n minHeight: '100vh',\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n background: `linear-gradient(135deg, ${theme.colors.primary} 0%, ${theme.colors.primaryActive} 100%)`,\n gap: 2,\n }}\n >\n <CircularProgress sx={{ color: theme.colors.surface }} />\n <Typography variant=\"body2\" sx={{ color: theme.colors.surface, opacity: 0.85 }}>\n Signing you in…\n </Typography>\n </Box>\n )\n}\n","import React, { useState, useEffect, ReactNode, CSSProperties } from 'react'\nimport {\n Drawer,\n List,\n ListItem,\n ListItemButton,\n ListItemIcon,\n ListItemText,\n Box,\n Typography,\n Collapse,\n IconButton\n} from '@mui/material'\nimport { ExpandLess, ExpandMore } from '@mui/icons-material'\nimport { BrowserRouter, NavLink, Outlet, useLocation, Routes, Route } from 'react-router-dom'\n\n/**\n * Menu item configuration\n */\nexport interface MenuItem {\n /** Unique identifier */\n id: string\n /** Display label */\n label: string\n /** Optional icon element */\n icon?: ReactNode\n /** Route path (for router mode) */\n path?: string\n /** Component to render (for non-router mode) */\n component?: ReactNode\n /** Optional submenu items */\n children?: MenuItem[]\n}\n\nexport interface SidebarLayoutProps {\n /** Array of menu items */\n menuItems: MenuItem[]\n /** Width of the sidebar */\n sidebarWidth?: string | number\n /** Additional CSS class for container */\n className?: string\n /** Default selected menu item ID (for non-router mode) */\n defaultSelected?: string\n /** Callback when menu changes */\n onMenuChange?: (id: string) => void\n /** Custom styles for container */\n style?: CSSProperties\n /** Custom styles for sidebar */\n sidebarStyle?: CSSProperties\n /** Custom styles for body */\n bodyStyle?: CSSProperties\n /** Default expanded submenu IDs */\n defaultExpanded?: string[]\n /** If true, wraps SidebarLayout in BrowserRouter and enables router-based navigation */\n isRouter?: boolean\n}\n\n\n\n/**\n * Recursive menu item renderer for router mode\n */\nconst RouterMenuItem: React.FC<{\n item: MenuItem\n depth?: number\n expanded: Set<string>\n onToggle: (id: string) => void\n}> = ({ item, depth = 0, expanded, onToggle }) => {\n const hasChildren = item.children && item.children.length > 0\n const isExpanded = expanded.has(item.id)\n\n return (\n <>\n <ListItem disablePadding>\n <ListItemButton\n component={hasChildren ? 'div' : NavLink}\n to={!hasChildren ? (item.path || `/${item.id}`) : undefined}\n end={false}\n onClick={hasChildren ? () => onToggle(item.id) : undefined}\n sx={{\n pl: 2 + depth * 2,\n '&.active': {\n backgroundColor: 'action.selected',\n color: 'primary.main',\n borderLeft: 3,\n borderColor: 'primary.main',\n fontWeight: 'medium',\n '& .MuiListItemIcon-root': {\n color: 'primary.main',\n },\n },\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n transition: 'all 0.15s',\n }}\n >\n {item.icon && (\n <ListItemIcon sx={{ minWidth: 40 }}>\n {item.icon}\n </ListItemIcon>\n )}\n <ListItemText\n primary={item.label}\n primaryTypographyProps={{\n fontSize: '0.875rem',\n }}\n />\n {hasChildren && (\n <IconButton size=\"small\" sx={{ p: 0 }}>\n {isExpanded ? <ExpandLess /> : <ExpandMore />}\n </IconButton>\n )}\n </ListItemButton>\n </ListItem>\n {hasChildren && (\n <Collapse in={isExpanded} timeout=\"auto\" unmountOnExit>\n <List component=\"div\" disablePadding>\n {item.children!.map((child) => (\n <RouterMenuItem\n key={child.id}\n item={child}\n depth={depth + 1}\n expanded={expanded}\n onToggle={onToggle}\n />\n ))}\n </List>\n </Collapse>\n )}\n </>\n )\n}\n\n/**\n * Helper to flatten menu items into routes\n */\nconst flattenMenuRoutes = (items: MenuItem[]): Array<{ path: string; component: ReactNode }> => {\n const routes: Array<{ path: string; component: ReactNode }> = []\n\n const flatten = (menuItems: MenuItem[]) => {\n for (const item of menuItems) {\n if (item.path && item.component) {\n routes.push({ path: item.path, component: item.component })\n }\n if (item.children) {\n flatten(item.children)\n }\n }\n }\n\n flatten(items)\n return routes\n}\n\n/**\n * Inner component for Router-based Sidebar Layout\n * (Must be rendered inside a Router context to use useLocation)\n */\nconst SidebarLayoutRouterInner: React.FC<SidebarLayoutProps> = ({\n menuItems,\n sidebarWidth = 250,\n className = '',\n onMenuChange,\n style,\n sidebarStyle,\n bodyStyle,\n defaultExpanded = [],\n}) => {\n const location = useLocation()\n const [expanded, setExpanded] = useState<Set<string>>(new Set(defaultExpanded))\n\n const handleToggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }\n\n useEffect(() => {\n if (onMenuChange) {\n const findActiveItem = (items: MenuItem[]): MenuItem | undefined => {\n for (const item of items) {\n if (item.path && location.pathname === item.path) {\n return item\n }\n if (item.children) {\n const found = findActiveItem(item.children)\n if (found) return found\n }\n }\n return undefined\n }\n\n const activeItem = findActiveItem(menuItems)\n if (activeItem) {\n onMenuChange(activeItem.id)\n }\n }\n }, [location.pathname, menuItems, onMenuChange])\n\n // Check if menu items have components - if so, render routes internally\n const hasComponents = menuItems.some(item =>\n item.component || (item.children?.some(child => child.component))\n )\n\n const routes = hasComponents ? flattenMenuRoutes(menuItems) : []\n\n return (\n <Box\n className={className}\n sx={{\n display: 'flex',\n height: '100%',\n width: '100%',\n ...style,\n }}\n >\n <Drawer\n variant=\"permanent\"\n sx={{\n width: sidebarWidth,\n flexShrink: 0,\n '& .MuiDrawer-paper': {\n width: sidebarWidth,\n boxSizing: 'border-box',\n position: 'relative',\n borderRight: '1px solid',\n borderColor: 'divider',\n ...sidebarStyle,\n },\n }}\n >\n <List sx={{ p: 0 }}>\n {menuItems.filter(item => item.label).map((item) => (\n <RouterMenuItem\n key={item.id}\n item={item}\n expanded={expanded}\n onToggle={handleToggle}\n />\n ))}\n </List>\n </Drawer>\n\n <Box\n component=\"main\"\n sx={{\n flexGrow: 1,\n overflow: 'auto',\n ...bodyStyle,\n }}\n >\n {hasComponents ? (\n <Routes>\n {routes.map(({ path, component }) => (\n <Route\n key={path}\n path={path}\n element={component}\n />\n ))}\n </Routes>\n ) : (\n <Outlet />\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * Wrapper for Router-based Sidebar Layout\n */\nconst SidebarLayoutWithRouter: React.FC<SidebarLayoutProps> = (props) => {\n return (\n // @ts-expect-error - future prop exists in v6 for v7 migration, but is removed from v7 types\n <BrowserRouter future={{ v7_startTransition: true, v7_relativeSplatPath: true }}>\n <SidebarLayoutRouterInner {...props} />\n </BrowserRouter>\n )\n}\n\n/**\n * Recursive menu item renderer for state mode\n */\nconst StateMenuItem: React.FC<{\n item: MenuItem\n selectedId: string\n depth?: number\n expanded: Set<string>\n onToggle: (id: string) => void\n onClick: (id: string) => void\n}> = ({ item, selectedId, depth = 0, expanded, onToggle, onClick }) => {\n const hasChildren = item.children && item.children.length > 0\n const isExpanded = expanded.has(item.id)\n const isActive = item.id === selectedId\n\n const handleClick = () => {\n if (hasChildren) {\n onToggle(item.id)\n } else {\n onClick(item.id)\n }\n }\n\n return (\n <>\n <ListItem disablePadding>\n <ListItemButton\n selected={isActive}\n onClick={handleClick}\n sx={{\n pl: 2 + depth * 2,\n '&.Mui-selected': {\n backgroundColor: 'action.selected',\n color: 'primary.main',\n borderLeft: 3,\n borderColor: 'primary.main',\n fontWeight: 'medium',\n '& .MuiListItemIcon-root': {\n color: 'primary.main',\n },\n '&:hover': {\n backgroundColor: 'action.selected',\n },\n },\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n transition: 'all 0.15s',\n }}\n >\n {item.icon && (\n <ListItemIcon sx={{ minWidth: 40 }}>\n {item.icon}\n </ListItemIcon>\n )}\n <ListItemText\n primary={item.label}\n primaryTypographyProps={{\n fontSize: '0.875rem',\n }}\n />\n {hasChildren && (\n <IconButton size=\"small\" sx={{ p: 0 }}>\n {isExpanded ? <ExpandLess /> : <ExpandMore />}\n </IconButton>\n )}\n </ListItemButton>\n </ListItem>\n {hasChildren && (\n <Collapse in={isExpanded} timeout=\"auto\" unmountOnExit>\n <List component=\"div\" disablePadding>\n {item.children!.map((child) => (\n <StateMenuItem\n key={child.id}\n item={child}\n selectedId={selectedId}\n depth={depth + 1}\n expanded={expanded}\n onToggle={onToggle}\n onClick={onClick}\n />\n ))}\n </List>\n </Collapse>\n )}\n </>\n )\n}\n\n/**\n * State-based Sidebar Layout Component (Fallback)\n */\nconst SidebarLayoutWithState: React.FC<SidebarLayoutProps> = ({\n menuItems,\n sidebarWidth = 250,\n className = '',\n defaultSelected,\n onMenuChange,\n style,\n sidebarStyle,\n bodyStyle,\n defaultExpanded = [],\n}) => {\n const [selectedId, setSelectedId] = useState<string>(\n defaultSelected || menuItems[0]?.id\n )\n const [expanded, setExpanded] = useState<Set<string>>(new Set(defaultExpanded))\n\n const handleToggle = (id: string) => {\n setExpanded((prev) => {\n const next = new Set(prev)\n if (next.has(id)) {\n next.delete(id)\n } else {\n next.add(id)\n }\n return next\n })\n }\n\n const handleMenuClick = (id: string) => {\n setSelectedId(id)\n if (onMenuChange) {\n onMenuChange(id)\n }\n }\n\n const findActiveItem = (items: MenuItem[], id: string): MenuItem | undefined => {\n for (const item of items) {\n if (item.id === id) return item\n if (item.children) {\n const found = findActiveItem(item.children, id)\n if (found) return found\n }\n }\n return undefined\n }\n\n const activeItem = findActiveItem(menuItems, selectedId)\n\n return (\n <Box\n className={className}\n sx={{\n display: 'flex',\n height: '100%',\n width: '100%',\n ...style,\n }}\n >\n <Drawer\n variant=\"permanent\"\n sx={{\n width: sidebarWidth,\n flexShrink: 0,\n '& .MuiDrawer-paper': {\n width: sidebarWidth,\n boxSizing: 'border-box',\n position: 'relative',\n borderRight: '1px solid',\n borderColor: 'divider',\n ...sidebarStyle,\n },\n }}\n >\n <List sx={{ p: 0 }}>\n {menuItems.filter(item => item.label).map((item) => (\n <StateMenuItem\n key={item.id}\n item={item}\n selectedId={selectedId}\n expanded={expanded}\n onToggle={handleToggle}\n onClick={handleMenuClick}\n />\n ))}\n </List>\n </Drawer>\n\n <Box\n component=\"main\"\n sx={{\n flexGrow: 1,\n overflow: 'auto',\n p: 3,\n ...bodyStyle,\n }}\n >\n {activeItem?.component || (\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ textAlign: 'center', mt: 4 }}\n >\n No content available for this menu item\n </Typography>\n )}\n </Box>\n </Box>\n )\n}\n\n/**\n * SidebarLayout Component\n * \n * A flexible sidebar-body layout component built with Material UI that supports \n * both router-based and state-based navigation with nested submenu support.\n * \n * **Uses Material UI Components:**\n * - Drawer (permanent variant)\n * - List, ListItem, ListItemButton\n * - ListItemIcon, ListItemText\n * - Collapse (for submenus)\n * - Box for layout\n * \n * **Features:**\n * - Nested submenu support with expand/collapse\n * - Material UI icons (ExpandMore/ExpandLess)\n * - Recursive rendering for deep nesting\n * - Automatic indentation based on depth\n * \n * **Router Mode** (when react-router-dom is available):\n * - Uses NavLink for navigation\n * - Renders child routes via Outlet\n * - Supports URL-based navigation\n * - Browser back/forward works\n * \n * **State Mode** (fallback):\n * - Uses internal state\n * - Renders components from menuItems\n * - Simple navigation without routing\n * \n * @example\n * // With nested submenus\n * <SidebarLayout\n * menuItems={[\n * {\n * id: 'products',\n * label: 'Products',\n * icon: <ShoppingCartIcon />,\n * children: [\n * { id: 'all-products', label: 'All Products', path: '/products/all' },\n * { id: 'categories', label: 'Categories', path: '/products/categories' }\n * ]\n * },\n * { id: 'dashboard', label: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> }\n * ]}\n * defaultExpanded={['products']}\n * />\n * \n * @example\n * // With React Router\n * <Routes>\n * <Route path=\"/\" element={\n * <SidebarLayout menuItems={[\n * { id: 'dashboard', label: 'Dashboard', path: '/dashboard', icon: <DashboardIcon /> },\n * { id: 'settings', label: 'Settings', path: '/settings', icon: <SettingsIcon /> }\n * ]} />\n * }>\n * <Route path=\"dashboard\" element={<Dashboard />} />\n * <Route path=\"settings\" element={<Settings />} />\n * </Route>\n * </Routes>\n * \n * @example\n * // Without React Router (State-based)\n * <SidebarLayout\n * menuItems={[\n * { id: 'dashboard', label: 'Dashboard', component: <Dashboard /> },\n * { id: 'settings', label: 'Settings', component: <Settings /> }\n * ]}\n * defaultSelected=\"dashboard\"\n * />\n */\nexport const SidebarLayout: React.FC<SidebarLayoutProps> = (props) => {\n // If explicitly requested to be a router, or implicitly requested because items have paths\n // AND NOT explicitly disabling the router.\n if (props.isRouter) {\n return <SidebarLayoutWithRouter {...props} />\n }\n\n return <SidebarLayoutWithState {...props} />\n}\n","import { createHighlighter, Highlighter } from 'shiki';\n\nlet highlighterInstance: Highlighter | null = null;\nlet highlighterPromise: Promise<Highlighter> | null = null;\n\nexport const getHighlighter = async (): Promise<Highlighter> => {\n if (highlighterInstance) {\n return highlighterInstance;\n }\n\n if (highlighterPromise) {\n return highlighterPromise;\n }\n\n highlighterPromise = createHighlighter({\n themes: ['github-light', 'github-dark'],\n langs: ['js', 'ts', 'go', 'json', 'bash', 'yaml', 'md', 'python', 'java', 'cpp', 'c', 'html', 'css', 'sql', 'http', 'text'],\n }).then(highlighter => {\n highlighterInstance = highlighter;\n return highlighter;\n });\n\n return highlighterPromise;\n};\n","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport remarkMath from 'remark-math';\nimport rehypeKatex from 'rehype-katex';\nimport { Highlighter } from 'shiki';\nimport './github-markdown.css';\nimport 'katex/dist/katex.min.css';\n\nimport ContentCopyIcon from '@mui/icons-material/ContentCopy';\nimport CheckIcon from '@mui/icons-material/Check';\nimport { getHighlighter } from './shikiHighlighter';\n\ninterface ReadmeViewerProps {\n content: string;\n className?: string;\n isDark?: boolean;\n muiTheme?: any;\n}\n\nconst ReadmeViewer: React.FC<ReadmeViewerProps> = ({\n content,\n className = '',\n isDark: propIsDark,\n muiTheme,\n}) => {\n const isDark = propIsDark !== undefined ? propIsDark : (muiTheme?.palette?.mode === 'dark');\n const [highlighter, setHighlighter] = useState<Highlighter | null>(null);\n const [copiedBlocks, setCopiedBlocks] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n getHighlighter().then(setHighlighter);\n }, []);\n\n const copyToClipboard = async (text: string, blockId: string) => {\n try {\n await navigator.clipboard.writeText(text);\n setCopiedBlocks(prev => new Set(prev).add(blockId));\n setTimeout(() => {\n setCopiedBlocks(prev => {\n const newSet = new Set(prev);\n newSet.delete(blockId);\n return newSet;\n });\n }, 2000);\n } catch (err) {\n console.error('Failed to copy text: ', err);\n }\n };\n\n\n return (\n <div className={`readme-viewer markdown-body ${className}`}>\n <style>{`\n .shiki-wrapper pre.shiki {\n padding: 16px !important;\n border-radius: 8px !important;\n overflow-x: auto;\n margin-bottom: 16px;\n border: 1px solid var(--md-sys-color-outline-variant, #e0e0e0);\n }\n `}</style>\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkMath]}\n rehypePlugins={[rehypeKatex]}\n components={{\n code({ className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || '');\n\n if (match && highlighter) {\n const codeText = String(children).replace(/\\n$/, '');\n const blockId = `code-${Math.random().toString(36).substr(2, 9)}`;\n\n let highlightedHtml = '';\n try {\n highlightedHtml = highlighter.codeToHtml(codeText, {\n lang: match[1],\n theme: isDark ? 'github-dark' : 'github-light',\n });\n } catch (e) {\n // Graceful fallback if language is unsupported by shiki\n try {\n highlightedHtml = highlighter.codeToHtml(codeText, {\n lang: 'text',\n theme: isDark ? 'github-dark' : 'github-light',\n });\n } catch (fallbackError) {\n // Ultimate fallback to just safely escaping text\n highlightedHtml = `<pre><code>${codeText}</code></pre>`;\n }\n }\n\n return (\n <div style={{ position: 'relative' }}>\n <div className=\"shiki-wrapper\" dangerouslySetInnerHTML={{ __html: highlightedHtml }} />\n <button\n onClick={() => copyToClipboard(codeText, blockId)}\n style={{\n position: 'absolute',\n top: '8px',\n right: '8px',\n backgroundColor: 'var(--md-sys-color-surface-container-high)',\n border: '1px solid var(--md-sys-color-outline-variant)',\n borderRadius: '4px',\n padding: '6px',\n fontSize: '14px',\n cursor: 'pointer',\n color: 'var(--md-sys-color-on-surface-variant)',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'all 0.2s ease',\n width: '32px',\n height: '32px',\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = isDark\n ? 'var(--md-sys-color-surface-container-highest)'\n : 'var(--md-sys-color-surface-container-high)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = isDark\n ? 'var(--md-sys-color-surface-container-high)'\n : 'var(--md-sys-color-surface-container-highest)';\n }}\n title={copiedBlocks.has(blockId) ? 'Copied!' : 'Copy code'}\n >\n {copiedBlocks.has(blockId) ? (\n <CheckIcon style={{ fontSize: '16px' }} />\n ) : (\n <ContentCopyIcon style={{ fontSize: '16px' }} />\n )}\n </button>\n </div>\n );\n }\n\n return (\n <code className={className} {...props}>\n {children}\n </code>\n );\n },\n }}\n >\n {content}\n </ReactMarkdown>\n </div>\n );\n};\n\nexport default ReadmeViewer;\n","import React, { createContext, useContext, useState, ReactNode, useCallback } from 'react'\nimport { Snackbar, Alert, AlertColor } from '@mui/material'\n\n/**\n * Notification type representing a toast message\n */\nexport interface Notification {\n id: string\n message: string\n type: AlertColor\n duration?: number\n}\n\n/**\n * Context interface for notification management\n */\nexport interface NotificationContextType {\n showNotification: (message: string, type: AlertColor, duration?: number) => void\n success: (message: string, duration?: number) => void\n error: (message: string, duration?: number) => void\n warning: (message: string, duration?: number) => void\n info: (message: string, duration?: number) => void\n}\n\nconst NotificationContext = createContext<NotificationContextType | undefined>(undefined)\n\nexport interface NotificationProviderProps {\n /** Components to wrap with notification context */\n children: ReactNode\n /** Default duration for notifications in milliseconds. Defaults to 6000ms */\n defaultDuration?: number\n /** Maximum number of notifications to show at once. Defaults to 3 */\n maxNotifications?: number\n /** Position of the notifications. Defaults to top-right */\n anchorOrigin?: {\n vertical: 'top' | 'bottom'\n horizontal: 'left' | 'center' | 'right'\n }\n}\n\n/**\n * NotificationProvider manages toast notifications using Material-UI Snackbar and Alert.\n * Provides methods to show success, error, warning, and info notifications.\n * \n * @example\n * ```tsx\n * <NotificationProvider>\n * <App />\n * </NotificationProvider>\n * ```\n * \n * // In a component:\n * ```tsx\n * const { success, error } = useNotification()\n * success('Operation completed!')\n * error('Something went wrong')\n * ```\n */\nexport const NotificationProvider: React.FC<NotificationProviderProps> = ({\n children,\n defaultDuration = 6000,\n maxNotifications = 3,\n anchorOrigin = { vertical: 'top', horizontal: 'right' }\n}) => {\n const [notifications, setNotifications] = useState<Notification[]>([])\n\n const showNotification = useCallback((\n message: string,\n type: AlertColor,\n duration: number = defaultDuration\n ) => {\n const id = `${Date.now()}-${Math.random()}`\n const newNotification: Notification = { id, message, type, duration }\n\n setNotifications((prev) => {\n // Limit the number of notifications\n const updated = [...prev, newNotification]\n if (updated.length > maxNotifications) {\n return updated.slice(updated.length - maxNotifications)\n }\n return updated\n })\n }, [defaultDuration, maxNotifications])\n\n const handleClose = useCallback((id: string) => {\n setNotifications((prev) => prev.filter((notif) => notif.id !== id))\n }, [])\n\n const success = useCallback((message: string, duration?: number) => {\n showNotification(message, 'success', duration)\n }, [showNotification])\n\n const error = useCallback((message: string, duration?: number) => {\n showNotification(message, 'error', duration)\n }, [showNotification])\n\n const warning = useCallback((message: string, duration?: number) => {\n showNotification(message, 'warning', duration)\n }, [showNotification])\n\n const info = useCallback((message: string, duration?: number) => {\n showNotification(message, 'info', duration)\n }, [showNotification])\n\n const contextValue: NotificationContextType = {\n showNotification,\n success,\n error,\n warning,\n info\n }\n\n return (\n <NotificationContext.Provider value={contextValue}>\n {children}\n {notifications.map((notification, index) => (\n <Snackbar\n key={notification.id}\n open={true}\n autoHideDuration={notification.duration}\n onClose={() => handleClose(notification.id)}\n anchorOrigin={anchorOrigin}\n style={{\n marginTop: index * 70 // Stack notifications vertically\n }}\n >\n <Alert\n onClose={() => handleClose(notification.id)}\n severity={notification.type}\n variant=\"filled\"\n sx={{ width: '100%' }}\n >\n {notification.message}\n </Alert>\n </Snackbar>\n ))}\n </NotificationContext.Provider>\n )\n}\n\n/**\n * Hook to access notification context\n * Must be used within a NotificationProvider\n * \n * @example\n * ```tsx\n * const { success, error, warning, info } = useNotification()\n * \n * // Show notifications\n * success('Data saved successfully!')\n * error('Failed to save data')\n * warning('This action cannot be undone')\n * info('New update available')\n * \n * // With custom duration\n * success('Quick message', 3000)\n * ```\n */\nexport const useNotification = (): NotificationContextType => {\n const context = useContext(NotificationContext)\n if (!context) {\n throw new Error('useNotification must be used within a NotificationProvider')\n }\n return context\n}\n","import {\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n Typography,\n} from '@mui/material'\nimport WarningAmberIcon from '@mui/icons-material/WarningAmber'\nimport { Box } from '@mui/material'\n\nexport interface ConfirmDialogProps {\n open: boolean\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n confirmColor?: 'primary' | 'error' | 'warning' | 'success'\n onConfirm: () => void\n onCancel: () => void\n}\n\nexport const ConfirmDialog = ({\n open,\n title,\n message,\n confirmText = 'Confirm',\n cancelText = 'Cancel',\n confirmColor = 'primary',\n onConfirm,\n onCancel,\n}: ConfirmDialogProps) => {\n return (\n <Dialog open={open} onClose={onCancel} maxWidth=\"xs\" fullWidth slotProps={{ paper: { sx: { borderRadius: 4 } } }}>\n <DialogTitle>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <WarningAmberIcon color={confirmColor} />\n {title}\n </Box>\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\">{message}</Typography>\n </DialogContent>\n <DialogActions sx={{ px: 3, pb: 2 }}>\n <Button onClick={onCancel} variant=\"outlined\">\n {cancelText}\n </Button>\n <Button onClick={onConfirm} variant=\"contained\" color={confirmColor} autoFocus>\n {confirmText}\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n\nexport default ConfirmDialog\n","/**\n * Merges class names together\n * Useful for conditional className composition\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ')\n}\n","/**\n * Creates a debounced function that delays invoking func until after wait milliseconds\n * have elapsed since the last time the debounced function was invoked\n */\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n\n return function (this: any, ...args: Parameters<T>) {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n timeoutId = setTimeout(() => {\n func.apply(this, args)\n }, wait)\n }\n}\n","/**\n * Creates a throttled function that only invokes func at most once per every wait milliseconds\n */\nexport function throttle<T extends (...args: any[]) => any>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0\n\n return function (this: any, ...args: Parameters<T>) {\n const now = Date.now()\n \n if (now - lastCall >= wait) {\n lastCall = now\n func.apply(this, args)\n }\n }\n}\n","/**\n * Formats a date to a readable string\n */\nexport function formatDate(\n date: Date | string | number,\n options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n }\n): string {\n const dateObj = typeof date === 'string' || typeof date === 'number' \n ? new Date(date) \n : date\n\n return new Intl.DateTimeFormat('en-US', options).format(dateObj)\n}\n","import { LocalStorage } from \"../utils\";\nimport { HttpClient } from '../http'\nimport type { SignInResponse } from './struct'\n\nconst SESSION_KEY = 'session_details'\n\nexport interface ISessionManager {\n /** Persist session to localStorage and set the auth header. */\n save(session: SignInResponse): void\n /** Partially update stored session fields (e.g. after token refresh). */\n patch(updates: Partial<SignInResponse>): void\n /** Clear session from localStorage and remove the auth header. */\n clear(): void\n /** Return the full stored session, or null if absent / unparseable. */\n get(): SignInResponse | null\n /** Return the stored access token, or undefined. */\n getAccessToken(): string | undefined\n /** Return the stored refresh token, or undefined. */\n getRefreshToken(): string | undefined\n /** Return the session UUID, or undefined. */\n getSessionId(): string | undefined\n /** True when a non-expired access token is stored. */\n isAuthenticated(): boolean\n /** Called on app startup: restore the auth header or wipe an expired session. */\n initialize(): void\n}\n\nexport class SessionManager implements ISessionManager {\n private static instance: SessionManager\n private readonly key: string\n private readonly client: HttpClient\n private cache: SignInResponse | null = null\n\n private constructor(client: HttpClient, key = SESSION_KEY) {\n this.client = client\n this.key = key\n }\n\n static getInstance(client: HttpClient): SessionManager {\n if (!SessionManager.instance) {\n SessionManager.instance = new SessionManager(client)\n }\n return SessionManager.instance\n }\n\n save(session: SignInResponse): void {\n this.cache = session\n LocalStorage.setItem(this.key, session)\n this.setAuthToken(session.accessToken)\n }\n\n patch(updates: Partial<SignInResponse>): void {\n const current = this.get()\n if (!current) return\n const updated = { ...current, ...updates }\n this.cache = updated\n LocalStorage.setItem(this.key, updated)\n if (updates.accessToken) {\n this.setAuthToken(updates.accessToken)\n }\n }\n\n clear(): void {\n this.cache = null\n LocalStorage.removeItem(this.key)\n this.clearAuthToken()\n }\n\n get(): SignInResponse | null {\n if (this.cache !== null) return this.cache\n this.cache = LocalStorage.getItem<SignInResponse>(this.key)\n return this.cache\n }\n\n getAccessToken(): string | undefined {\n return this.get()?.accessToken || undefined\n }\n\n getRefreshToken(): string | undefined {\n return this.get()?.refreshToken || undefined\n }\n\n getSessionId(): string | undefined {\n return this.get()?.sessionId || undefined\n }\n\n isAuthenticated(): boolean {\n const session = this.get()\n if (!session?.accessToken) return false\n return Number(session.expiresAt) > Date.now() / 1000\n }\n\n initialize(): void {\n const session = this.get()\n if (session?.accessToken && Number(session.expiresAt) > Date.now() / 1000) {\n this.setAuthToken(session.accessToken)\n } else {\n this.clear()\n }\n }\n\n private setAuthToken(token: string): void {\n this.client.setDefaultHeader('Authorization', `Bearer ${token}`)\n }\n\n private clearAuthToken(): void {\n this.client.removeDefaultHeader('Authorization')\n }\n\n}\n","import { HttpClient } from '../http'\nimport { SessionManager } from './sessionManager'\nimport type {\n SignInRequest,\n SignInResponse,\n RefreshTokenRequest,\n RefreshTokenResponse,\n LogoutRequest,\n LogoutResponse,\n GenerateLoginTokenRequest,\n GenerateLoginTokenResponse,\n SignInWithLoginTokenRequest,\n} from './struct'\n\nconst BASE_URL = '/openauth/v1'\n\nexport interface IAuthService {\n signIn(request: SignInRequest): Promise<SignInResponse>\n refreshToken(request?: Partial<RefreshTokenRequest>): Promise<RefreshTokenResponse>\n logout(request: LogoutRequest): Promise<LogoutResponse>\n generateLoginToken(request?: GenerateLoginTokenRequest): Promise<GenerateLoginTokenResponse>\n signInWithLoginToken(request: SignInWithLoginTokenRequest): Promise<SignInResponse>\n isAuthenticated(): boolean\n getAccessToken(): string | undefined\n getSessionDetails(): SignInResponse | null\n getSessionId(): string | undefined\n initializeAuth(): void\n}\n\nexport class AuthService implements IAuthService {\n private static instance: AuthService\n private readonly client: HttpClient\n private readonly sessionManager: SessionManager\n\n private constructor(client: HttpClient) {\n this.client = client\n this.sessionManager = SessionManager.getInstance(client)\n }\n\n static getInstance(client: HttpClient): AuthService {\n if (!AuthService.instance) {\n AuthService.instance = new AuthService(client)\n }\n return AuthService.instance\n }\n\n async signIn(request: SignInRequest): Promise<SignInResponse> {\n const response = await this.client.post<SignInResponse>(\n `${BASE_URL}/auth/signin`,\n request\n )\n if (response.data.accessToken) {\n this.sessionManager.save(response.data)\n }\n return response.data\n }\n\n async refreshToken(request?: Partial<RefreshTokenRequest>): Promise<RefreshTokenResponse> {\n const refreshToken = this.sessionManager.getRefreshToken()\n if (!refreshToken) {\n throw new Error('No refresh token available')\n }\n\n const response = await this.client.post<RefreshTokenResponse>(\n `${BASE_URL}/auth/refresh`,\n { refreshToken, ...request }\n )\n\n if (response.data.accessToken) {\n this.sessionManager.patch({\n accessToken: response.data.accessToken,\n refreshToken: response.data.refreshToken,\n })\n }\n\n return response.data\n }\n\n async logout(request: LogoutRequest): Promise<LogoutResponse> {\n try {\n request.sessionId = this.sessionManager.getSessionId()\n const response = await this.client.post<LogoutResponse>(\n `${BASE_URL}/auth/logout`,\n request || {}\n )\n return response.data\n } finally {\n this.sessionManager.clear()\n }\n }\n\n async generateLoginToken(request?: GenerateLoginTokenRequest): Promise<GenerateLoginTokenResponse> {\n const response = await this.client.put<GenerateLoginTokenResponse>(\n `${BASE_URL}/auth/login-token`,\n request ?? {}\n )\n return response.data\n }\n\n async signInWithLoginToken(request: SignInWithLoginTokenRequest): Promise<SignInResponse> {\n const response = await this.client.post<SignInResponse>(\n `${BASE_URL}/auth/signin-with-token`,\n request\n )\n if (response.data.accessToken) {\n this.sessionManager.save(response.data)\n }\n return response.data\n }\n\n isAuthenticated(): boolean {\n return this.sessionManager.isAuthenticated()\n }\n\n getAccessToken(): string | undefined {\n return this.sessionManager.getAccessToken()\n }\n\n getSessionDetails(): SignInResponse | null {\n return this.sessionManager.get()\n }\n\n getSessionId(): string | undefined {\n return this.sessionManager.getSessionId()\n }\n\n initializeAuth(): void {\n this.sessionManager.initialize()\n }\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gofreego/tsutils",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "description": "A comprehensive React + TypeScript library with common utilities, components, theme system, and HTTP client",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",