@ollaid/native-sso 1.0.2 → 1.0.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/components/ui.tsx","../src/components/OTPInput.tsx","../src/services/debugLogger.ts","../src/services/api.ts","../src/services/nativeAuth.ts","../src/services/mobilePassword.ts","../src/hooks/useMobilePassword.ts","../src/components/PasswordRecoveryModal.tsx","../src/hooks/useTokenHealthCheck.ts","../src/hooks/useNativeAuth.ts","../src/components/LoginModal.tsx","../src/components/PhoneInput.tsx","../src/components/AppsLogoSlider.tsx","../src/services/mobileRegistration.ts","../src/hooks/useMobileRegistration.ts","../src/components/SignupModal.tsx","../src/components/OnboardingModal.tsx","../src/components/DebugPanel.tsx","../src/components/NativeSSOPage.tsx","../src/provider.tsx","../src/services/iamAccount.ts"],"sourcesContent":["/**\n * Embedded UI primitives for @ollaid/native-sso\n * Lightweight replacements for shadcn/ui components + inline SVG icons\n * No external dependencies required\n * \n * @version 1.0.0\n */\n\nimport React, { forwardRef, createContext, useContext, useEffect } from 'react';\n\n// ============================================\n// SVG Icons (inline, no lucide dependency)\n// ============================================\n\nconst iconProps = { width: '100%', height: '100%', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round' as const, strokeLinejoin: 'round' as const };\n\nexport function IconShieldCheck(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n}\n\nexport function IconMail(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n );\n}\n\nexport function IconPhone(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\" />\n </svg>\n );\n}\n\nexport function IconLock(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n );\n}\n\nexport function IconKeyRound(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\" />\n <circle cx=\"16.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport function IconArrowLeft(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"m12 19-7-7 7-7\" />\n <path d=\"M19 12H5\" />\n </svg>\n );\n}\n\nexport function IconEye(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function IconEyeOff(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n </svg>\n );\n}\n\nexport function IconCheckCircle2(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n}\n\nexport function IconLoader2(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props} style={{ animation: 'spin 1s linear infinite', ...(props.style || {}) }}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\nexport function IconAlertTriangle(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n}\n\nexport function IconSmartphone(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <rect width=\"14\" height=\"20\" x=\"5\" y=\"2\" rx=\"2\" ry=\"2\" />\n <path d=\"M12 18h.01\" />\n </svg>\n );\n}\n\nexport function IconHome(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\" />\n <path d=\"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n </svg>\n );\n}\n\nexport function IconCalendar(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M8 2v4\" /><path d=\"M16 2v4\" />\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" />\n <path d=\"M3 10h18\" />\n </svg>\n );\n}\n\nexport function IconBell(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9\" />\n <path d=\"M10.3 21a1.94 1.94 0 0 0 3.4 0\" />\n </svg>\n );\n}\n\nexport function IconMessageCircle(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22z\" />\n </svg>\n );\n}\n\nexport function IconUsers(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n );\n}\n\nexport function IconSettings(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function IconGlobe(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\" />\n <path d=\"M2 12h20\" />\n </svg>\n );\n}\n\n// ============================================\n// Dialog\n// ============================================\n\ninterface DialogContextValue {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nconst DialogContext = createContext<DialogContextValue>({ open: false, onOpenChange: () => {} });\n\nexport function Dialog({ open, onOpenChange, children }: { open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode }) {\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => { document.body.style.overflow = ''; };\n }, [open]);\n\n if (!open) return null;\n\n return (\n <DialogContext.Provider value={{ open, onOpenChange }}>\n {children}\n </DialogContext.Provider>\n );\n}\n\nexport function DialogContent({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n const { onOpenChange } = useContext(DialogContext);\n\n return (\n <div style={{ position: 'fixed', inset: 0, zIndex: 50, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <div \n style={{ position: 'fixed', inset: 0, backgroundColor: 'rgba(0,0,0,0.5)' }}\n onClick={() => onOpenChange(false)} \n />\n <div \n className={className}\n style={{ \n position: 'relative', zIndex: 51, width: '100%', maxWidth: '28rem', \n margin: '1rem', padding: '1.5rem', borderRadius: '0.75rem',\n backgroundColor: 'white', boxShadow: '0 25px 50px -12px rgba(0,0,0,0.25)',\n maxHeight: '90vh', overflowY: 'auto',\n }}\n >\n <button\n onClick={() => onOpenChange(false)}\n style={{ position: 'absolute', right: '1rem', top: '1rem', background: 'none', border: 'none', cursor: 'pointer', fontSize: '1.25rem', color: '#9ca3af', lineHeight: 1 }}\n aria-label=\"Close\"\n >\n ✕\n </button>\n {children}\n </div>\n </div>\n );\n}\n\nexport function DialogHeader({ children, className = '', style }: { children: React.ReactNode; className?: string; style?: React.CSSProperties }) {\n return <div className={className} style={{ marginBottom: '0.5rem', ...style }}>{children}</div>;\n}\n\nexport function DialogTitle({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n return <h2 className={className} style={{ fontSize: '1.25rem', fontWeight: 600, color: '#111827' }}>{children}</h2>;\n}\n\nexport function DialogDescription({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n return <p className={className} style={{ fontSize: '0.875rem', color: '#6b7280', marginTop: '0.25rem' }}>{children}</p>;\n}\n\n// ============================================\n// Button\n// ============================================\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'default' | 'outline' | 'ghost';\n size?: 'default' | 'sm' | 'lg';\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(({ \n variant = 'default', size = 'default', className = '', style, disabled, children, ...props \n}, ref) => {\n const baseStyle: React.CSSProperties = {\n display: 'inline-flex', alignItems: 'center', justifyContent: 'center',\n borderRadius: '0.5rem', fontWeight: 500, cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.15s', border: 'none', opacity: disabled ? 0.5 : 1,\n fontSize: size === 'sm' ? '0.875rem' : '0.9375rem',\n padding: size === 'sm' ? '0.375rem 0.75rem' : size === 'lg' ? '0.75rem 1.5rem' : '0.625rem 1rem',\n height: size === 'sm' ? '2rem' : size === 'lg' ? '3rem' : '2.5rem',\n ...(variant === 'default' ? { backgroundColor: '#002147', color: 'white' } : {}),\n ...(variant === 'outline' ? { backgroundColor: 'transparent', border: '1px solid #d1d5db', color: '#374151' } : {}),\n ...(variant === 'ghost' ? { backgroundColor: 'transparent', color: '#374151' } : {}),\n ...style,\n };\n\n return (\n <button ref={ref} className={className} style={baseStyle} disabled={disabled} {...props}>\n {children}\n </button>\n );\n});\nButton.displayName = 'Button';\n\n// ============================================\n// Input\n// ============================================\n\nexport const Input = forwardRef<HTMLInputElement, React.InputHTMLAttributes<HTMLInputElement> & { className?: string }>(\n ({ className = '', style, ...props }, ref) => {\n return (\n <input\n ref={ref}\n className={className}\n style={{\n width: '100%', padding: '0.5rem 0.75rem', borderRadius: '0.375rem',\n border: '1px solid #d1d5db', fontSize: '0.9375rem', outline: 'none',\n transition: 'border-color 0.15s', backgroundColor: '#f9fafb', color: '#111827',\n ...style,\n }}\n {...props}\n />\n );\n }\n);\nInput.displayName = 'Input';\n\n// ============================================\n// Label\n// ============================================\n\nexport const Label = forwardRef<HTMLLabelElement, React.LabelHTMLAttributes<HTMLLabelElement>>(\n ({ className = '', style, ...props }, ref) => {\n return (\n <label\n ref={ref}\n className={className}\n style={{ fontSize: '0.875rem', fontWeight: 500, color: '#374151', ...style }}\n {...props}\n />\n );\n }\n);\nLabel.displayName = 'Label';\n\n// ============================================\n// RadioGroup (simplified)\n// ============================================\n\ninterface RadioGroupProps {\n value: string;\n onValueChange: (value: string) => void;\n children: React.ReactNode;\n className?: string;\n}\n\nconst RadioGroupContext = createContext<{ value: string; onValueChange: (v: string) => void }>({ value: '', onValueChange: () => {} });\n\nexport function RadioGroup({ value, onValueChange, children, className = '' }: RadioGroupProps) {\n return (\n <RadioGroupContext.Provider value={{ value, onValueChange }}>\n <div className={className}>{children}</div>\n </RadioGroupContext.Provider>\n );\n}\n\nexport function RadioGroupItem({ value, id }: { value: string; id: string }) {\n const { value: groupValue, onValueChange } = useContext(RadioGroupContext);\n return (\n <input\n type=\"radio\"\n id={id}\n checked={groupValue === value}\n onChange={() => onValueChange(value)}\n style={{ width: '1rem', height: '1rem', accentColor: '#002147' }}\n />\n );\n}\n\n// Global keyframes for spinner\nif (typeof document !== 'undefined') {\n const styleId = 'ollaid-sso-keyframes';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `@keyframes spin { to { transform: rotate(360deg); } }`;\n document.head.appendChild(style);\n }\n}\n","/**\n * OTP Input component for @ollaid/native-sso\n */\n\nimport { useRef, useState, useEffect, KeyboardEvent, ClipboardEvent } from 'react';\n\ninterface OTPInputProps {\n length?: 6 | 8;\n value: string;\n onChange: (value: string) => void;\n onComplete?: (value: string) => void;\n disabled?: boolean;\n autoFocus?: boolean;\n}\n\nexport function OTPInput({\n length = 6, value, onChange, onComplete, disabled = false, autoFocus = true,\n}: OTPInputProps) {\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n const [activeIndex, setActiveIndex] = useState(0);\n\n useEffect(() => { inputRefs.current = inputRefs.current.slice(0, length); }, [length]);\n\n useEffect(() => {\n if (autoFocus && inputRefs.current[0]) inputRefs.current[0].focus();\n }, [autoFocus]);\n\n useEffect(() => {\n if (value.length === length && onComplete) onComplete(value);\n }, [value, length, onComplete]);\n\n const handleChange = (index: number, char: string) => {\n if (disabled) return;\n const digit = char.replace(/[^0-9]/g, '');\n if (!digit) return;\n const newValue = value.split('');\n newValue[index] = digit;\n onChange(newValue.join('').slice(0, length));\n if (index < length - 1) {\n inputRefs.current[index + 1]?.focus();\n setActiveIndex(index + 1);\n }\n };\n\n const handleKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n if (e.key === 'Backspace') {\n e.preventDefault();\n const newValue = value.split('');\n if (value[index]) {\n newValue[index] = '';\n onChange(newValue.join(''));\n } else if (index > 0) {\n newValue[index - 1] = '';\n onChange(newValue.join(''));\n inputRefs.current[index - 1]?.focus();\n setActiveIndex(index - 1);\n }\n } else if (e.key === 'ArrowLeft' && index > 0) {\n inputRefs.current[index - 1]?.focus();\n setActiveIndex(index - 1);\n } else if (e.key === 'ArrowRight' && index < length - 1) {\n inputRefs.current[index + 1]?.focus();\n setActiveIndex(index + 1);\n }\n };\n\n const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n e.preventDefault();\n const pasted = e.clipboardData.getData('text').replace(/[^0-9]/g, '');\n if (pasted) {\n const newValue = pasted.slice(0, length);\n onChange(newValue);\n const focusIndex = Math.min(newValue.length, length - 1);\n inputRefs.current[focusIndex]?.focus();\n setActiveIndex(focusIndex);\n }\n };\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem' }}>\n {Array.from({ length }).map((_, index) => (\n <input\n key={index}\n ref={(el) => (inputRefs.current[index] = el)}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n value={value[index] || ''}\n onChange={(e) => handleChange(index, e.target.value)}\n onKeyDown={(e) => handleKeyDown(index, e)}\n onPaste={handlePaste}\n onFocus={() => setActiveIndex(index)}\n disabled={disabled}\n aria-label={`Digit ${index + 1}`}\n style={{\n width: '2.5rem', height: '3rem', textAlign: 'center', fontSize: '1.25rem',\n fontWeight: 600, borderRadius: '0.375rem', border: '2px solid',\n borderColor: activeIndex === index && !disabled ? 'hsl(var(--primary, 222 47% 11%))' : value[index] ? 'hsl(var(--primary, 222 47% 11%) / 0.5)' : '#d1d5db',\n backgroundColor: value[index] ? 'hsl(var(--primary, 222 47% 11%) / 0.05)' : 'white',\n outline: 'none', transition: 'all 0.2s',\n opacity: disabled ? 0.5 : 1, cursor: disabled ? 'not-allowed' : 'text',\n }}\n />\n ))}\n </div>\n );\n}\n\nexport default OTPInput;\n","/**\n * Debug Logger pour @ollaid/native-sso\n * Stocke l'historique des appels API en mémoire pour le DebugPanel\n * @version 1.0.0\n */\n\nexport interface ApiCallLog {\n id: string;\n timestamp: string;\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n endpoint: string;\n requestBody: unknown;\n requestHeaders?: Record<string, string>;\n responseStatus: number | null;\n responseBody: unknown;\n duration: number;\n error?: string;\n}\n\nconst MAX_LOGS = 50;\nlet apiLogs: ApiCallLog[] = [];\nlet listeners: ((logs: ApiCallLog[]) => void)[] = [];\n\nfunction notifyListeners() {\n listeners.forEach(fn => fn([...apiLogs]));\n}\n\nexport function logApiCall(\n method: ApiCallLog['method'],\n endpoint: string,\n requestBody: unknown,\n requestHeaders?: Record<string, string>\n): string {\n const id = `${Date.now()}-${Math.random().toString(36).substring(2, 7)}`;\n const log: ApiCallLog = {\n id,\n timestamp: new Date().toISOString(),\n method,\n endpoint,\n requestBody,\n requestHeaders,\n responseStatus: null,\n responseBody: null,\n duration: 0,\n };\n\n apiLogs.unshift(log);\n if (apiLogs.length > MAX_LOGS) {\n apiLogs = apiLogs.slice(0, MAX_LOGS);\n }\n notifyListeners();\n return id;\n}\n\nexport function logApiResponse(\n logId: string,\n responseStatus: number,\n responseBody: unknown,\n startTime: number,\n error?: string\n): void {\n const log = apiLogs.find(l => l.id === logId);\n if (log) {\n log.responseStatus = responseStatus;\n log.responseBody = responseBody;\n log.duration = Date.now() - startTime;\n log.error = error;\n notifyListeners();\n }\n}\n\nexport function getApiLogs(): ApiCallLog[] {\n return [...apiLogs];\n}\n\nexport function clearApiLogs(): void {\n apiLogs = [];\n notifyListeners();\n}\n\nexport function subscribeToLogs(callback: (logs: ApiCallLog[]) => void): () => void {\n listeners.push(callback);\n return () => {\n listeners = listeners.filter(fn => fn !== callback);\n };\n}\n\nexport function exportLogsAsText(): string {\n if (apiLogs.length === 0) return 'Aucun appel API enregistré.';\n\n const lines: string[] = [\n '='.repeat(60),\n 'NATIVE SSO DEBUG LOGS',\n `Exporté le: ${new Date().toISOString()}`,\n '='.repeat(60),\n '',\n ];\n\n apiLogs.slice().reverse().forEach((log, index) => {\n const emoji = log.responseStatus === null ? '⏳' : (log.responseStatus >= 200 && log.responseStatus < 300 ? '✅' : '❌');\n lines.push(`[${index + 1}] ${emoji} ${log.method} ${log.endpoint}`);\n lines.push(` Status: ${log.responseStatus ?? 'En cours...'} | Durée: ${log.duration}ms`);\n if (log.requestBody) lines.push(` Request: ${JSON.stringify(log.requestBody)}`);\n if (log.responseBody) lines.push(` Response: ${JSON.stringify(log.responseBody)}`);\n if (log.error) lines.push(` ⚠️ Error: ${log.error}`);\n lines.push('');\n });\n\n return lines.join('\\n');\n}\n","/**\n * Client API pour @ollaid/native-sso\n * Gestion des requêtes HTTP avec timeout, device ID, token storage\n * \n * @version 1.0.0\n */\n\nimport { logApiCall, logApiResponse } from './debugLogger';\n\n// ============================================\n// Types d'erreur\n// ============================================\n\nexport type ApiErrorType = 'network' | 'timeout' | 'server' | 'validation' | 'auth' | 'unknown';\n\nexport class ApiError extends Error {\n type: ApiErrorType;\n statusCode?: number;\n errorType?: string;\n response?: unknown;\n\n constructor(\n message: string,\n type: ApiErrorType,\n statusCode?: number,\n errorType?: string,\n response?: unknown\n ) {\n super(message);\n this.name = 'ApiError';\n this.type = type;\n this.statusCode = statusCode;\n this.errorType = errorType;\n this.response = response;\n }\n}\n\n// ============================================\n// Configuration\n// ============================================\n\nexport interface NativeAuthConfig {\n /** URL du Backend SaaS (pour config et exchange) */\n saasApiUrl: string;\n /** URL du Backend IAM (pour encrypt, init, validate, etc.) */\n iamApiUrl: string;\n /** Timeout en ms (défaut: 30000) */\n timeout?: number;\n /** Mode debug (logs console) */\n debug?: boolean;\n}\n\nlet config: NativeAuthConfig = {\n saasApiUrl: '',\n iamApiUrl: '',\n timeout: 30000,\n debug: false,\n};\n\nexport const setNativeAuthConfig = (newConfig: Partial<NativeAuthConfig>): void => {\n config = { ...config, ...newConfig };\n \n if (config.debug) {\n console.log('🔐 @ollaid/native-sso Config:', {\n saasApiUrl: config.saasApiUrl,\n iamApiUrl: config.iamApiUrl,\n });\n }\n};\n\nexport const getNativeAuthConfig = (): NativeAuthConfig => ({ ...config });\n\nexport const isDebugMode = (): boolean => config.debug === true;\n\n// ============================================\n// Device ID\n// ============================================\n\nconst DEVICE_ID_KEY = 'native_sso_device_id';\n\nexport const getDeviceId = (): string => {\n if (typeof localStorage === 'undefined') return '';\n \n let deviceId = localStorage.getItem(DEVICE_ID_KEY);\n if (!deviceId) {\n deviceId = `nat_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\n }\n return deviceId;\n};\n\n// ============================================\n// Token storage (clés unifiées avec Web SSO)\n// ============================================\n\nconst STORAGE = {\n AUTH_TOKEN: 'auth_token',\n TOKEN: 'token',\n USER: 'user',\n ACCOUNT_TYPE: 'account_type',\n ALIAS_REFERENCE: 'alias_reference',\n} as const;\n\nexport const setAuthToken = (token: string): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE.AUTH_TOKEN, token);\n localStorage.setItem(STORAGE.TOKEN, token);\n }\n};\n\nexport const getAuthToken = (): string | null => {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(STORAGE.AUTH_TOKEN) || localStorage.getItem(STORAGE.TOKEN);\n};\n\nexport const clearAuthToken = (): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(STORAGE.AUTH_TOKEN);\n localStorage.removeItem(STORAGE.TOKEN);\n localStorage.removeItem(STORAGE.USER);\n localStorage.removeItem(STORAGE.ACCOUNT_TYPE);\n localStorage.removeItem(STORAGE.ALIAS_REFERENCE);\n }\n};\n\nexport const setAuthUser = (user: unknown): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE.USER, JSON.stringify(user));\n }\n};\n\nexport const getAuthUser = <T>(): T | null => {\n if (typeof localStorage === 'undefined') return null;\n const user = localStorage.getItem(STORAGE.USER);\n if (!user) return null;\n try {\n return JSON.parse(user);\n } catch {\n localStorage.removeItem(STORAGE.USER);\n return null;\n }\n};\n\nexport const setAccountType = (type: string): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE.ACCOUNT_TYPE, type);\n }\n};\n\nexport const getAccountType = (): string | null => {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(STORAGE.ACCOUNT_TYPE);\n};\n\nexport { STORAGE as STORAGE_KEYS };\n\n// ============================================\n// Fetch helper\n// ============================================\n\nexport async function fetchWithTimeout<T>(\n url: string,\n options: RequestInit,\n timeout: number\n): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const method = (options.method as 'GET' | 'POST' | 'PUT' | 'DELETE') || 'GET';\n const logId = isDebugMode() ? logApiCall(method, url, options.body ? JSON.parse(options.body as string) : undefined) : null;\n const startTime = Date.now();\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n const text = await response.text();\n if (isDebugMode()) {\n console.error('❌ Réponse non-JSON:', text.substring(0, 500));\n if (logId) logApiResponse(logId, response.status, { raw: text.substring(0, 200) }, startTime, 'Non-JSON response');\n }\n throw new ApiError(`Erreur serveur (${response.status})`, 'server', response.status);\n }\n\n const data = await response.json();\n\n if (!response.ok) {\n if (logId) logApiResponse(logId, response.status, data, startTime, data.message);\n throw new ApiError(\n data.message || `Erreur ${response.status}`,\n response.status === 401 ? 'auth' : response.status >= 500 ? 'server' : 'validation',\n response.status,\n data.error_type,\n data\n );\n }\n\n if (logId) logApiResponse(logId, response.status, data, startTime);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ApiError) throw error;\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n if (logId) logApiResponse(logId, 0, null, startTime, 'Timeout');\n throw new ApiError('Délai d\\'attente dépassé', 'timeout');\n }\n if (error instanceof TypeError) {\n if (logId) logApiResponse(logId, 0, null, startTime, 'Network error');\n throw new ApiError('Impossible de contacter le serveur', 'network');\n }\n }\n\n if (logId) logApiResponse(logId, 0, null, startTime, 'Unknown error');\n throw new ApiError('Erreur inattendue', 'unknown');\n }\n}\n\nexport function getHeaders(token?: string): HeadersInit {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n };\n\n const deviceId = getDeviceId();\n if (deviceId) {\n headers['X-Device-Id'] = deviceId;\n }\n\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n return headers;\n}\n\nexport default {\n getConfig: getNativeAuthConfig,\n setConfig: setNativeAuthConfig,\n};\n","/**\n * Service d'authentification Native Mobile SSO v1.0\n * Architecture Frontend-First : Direct IAM après encryption\n * \n * @version 1.0.0\n */\n\nimport { \n ApiError, \n fetchWithTimeout,\n getHeaders,\n getDeviceId,\n setAuthToken,\n setAuthUser,\n clearAuthToken,\n getNativeAuthConfig,\n setNativeAuthConfig,\n isDebugMode,\n} from './api';\n\nimport type {\n NativeAuthType,\n NativeEncryptRequest,\n NativeEncryptResponse,\n NativeInitResponse,\n NativeValidateResponse,\n NativeGrantAccessResponse,\n NativeResendOtpResponse,\n NativeExchangeResponse,\n NativeConfigResponse,\n NativeCredentials,\n} from '../types/native';\n\n// ============================================\n// Credentials en mémoire (jamais persistés)\n// ============================================\n\nlet credentials: NativeCredentials | null = null;\nlet credentialsLoadedAt: number = 0;\nlet credentialsTtl: number = 300; // Default 5 minutes\n\nconst DEFAULT_TTL = 300;\nconst REFRESH_MARGIN = 30; // Refresh 30s before expiration\n\n// ============================================\n// Service Native Auth\n// ============================================\n\nexport const nativeAuthService = {\n hasCredentials(): boolean {\n return credentials !== null;\n },\n\n getCredentials(): NativeCredentials | null {\n return credentials ? { ...credentials } : null;\n },\n\n getCredentialsTtl(): number {\n return credentialsTtl;\n },\n\n getCredentialsAge(): number {\n if (!credentialsLoadedAt) return Infinity;\n return (Date.now() - credentialsLoadedAt) / 1000;\n },\n\n areCredentialsExpiringSoon(): boolean {\n if (!credentials || !credentialsLoadedAt) return true;\n const age = this.getCredentialsAge();\n return age >= (credentialsTtl - REFRESH_MARGIN);\n },\n\n async ensureFreshCredentials(): Promise<void> {\n if (!credentials || this.areCredentialsExpiringSoon()) {\n if (isDebugMode()) {\n console.log('🔄 [Native] Credentials expirés ou proches — auto-refresh');\n }\n await this.loadCredentials();\n }\n },\n\n async loadCredentials(): Promise<NativeCredentials> {\n const config = getNativeAuthConfig();\n if (!config.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [SaaS] GET /native/config');\n }\n\n const response = await fetchWithTimeout<NativeConfigResponse>(\n `${config.saasApiUrl}/native/config`,\n { method: 'GET', headers: getHeaders() },\n config.timeout || 30000\n );\n\n if (!response.success || !response.encrypted_credentials || !response.app_key) {\n throw new ApiError('Configuration invalide reçue du SaaS (app_key ou encrypted_credentials manquant)', 'server');\n }\n\n credentials = {\n appKey: response.app_key,\n encryptedCredentials: response.encrypted_credentials,\n };\n\n credentialsLoadedAt = Date.now();\n credentialsTtl = response.credentials_ttl || DEFAULT_TTL;\n\n // Propager le debug mode depuis le backend (si défini)\n if (typeof response.debug === 'boolean') {\n const currentConfig = getNativeAuthConfig();\n if (currentConfig.debug !== true) {\n setNativeAuthConfig({ debug: response.debug });\n }\n }\n\n if (isDebugMode()) {\n console.log('✅ [SaaS] Credentials chargés (ttl:', credentialsTtl, 's, debug:', response.debug ?? 'non défini', ')');\n }\n\n return credentials;\n },\n\n async encrypt(\n type: NativeAuthType,\n data: Partial<NativeEncryptRequest>\n ): Promise<NativeEncryptResponse> {\n // Auto-refresh credentials if expiring soon\n await this.ensureFreshCredentials();\n\n if (!credentials) {\n throw new ApiError('Credentials non chargés. Appelez loadCredentials() d\\'abord.', 'auth');\n }\n\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n const payload: NativeEncryptRequest = {\n type,\n app_key: credentials.appKey,\n encrypted_credentials: credentials.encryptedCredentials,\n ...data,\n };\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/encrypt', { type, ...data });\n }\n\n const response = await fetchWithTimeout<NativeEncryptResponse>(\n `${config.iamApiUrl}/iam/native/encrypt`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify(payload),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] native_token reçu, expire dans', response.expires_in, 's');\n }\n\n return response;\n },\n\n async init(nativeToken: string): Promise<NativeInitResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/init');\n }\n\n const response = await fetchWithTimeout<NativeInitResponse>(\n `${config.iamApiUrl}/iam/native/init`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({ native_token: nativeToken }),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] Init:', { status: response.status, hasProcessToken: !!response.process_token });\n }\n\n return response;\n },\n\n async validate(\n processToken: string,\n creds: { password?: string; otp_code?: string }\n ): Promise<NativeValidateResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate');\n }\n\n const response = await fetchWithTimeout<NativeValidateResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n ...creds,\n }),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] Validate:', { \n hasCallback: !!response.callback_token, \n requires2fa: response.requires_2fa \n });\n }\n\n return response;\n },\n\n async verifyTotp(\n processToken: string,\n totpCode: string\n ): Promise<NativeValidateResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/verify-totp');\n }\n\n return fetchWithTimeout<NativeValidateResponse>(\n `${config.iamApiUrl}/iam/native/verify-totp`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n totp_code: totpCode,\n }),\n },\n config.timeout || 30000\n );\n },\n\n async grantAccess(processToken: string): Promise<NativeGrantAccessResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/grant-access');\n }\n\n return fetchWithTimeout<NativeGrantAccessResponse>(\n `${config.iamApiUrl}/iam/native/grant-access`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({ process_token: processToken }),\n },\n config.timeout || 30000\n );\n },\n\n async resendOtp(processToken: string): Promise<NativeResendOtpResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/resend-otp');\n }\n\n return fetchWithTimeout<NativeResendOtpResponse>(\n `${config.iamApiUrl}/iam/native/resend-otp`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({ process_token: processToken }),\n },\n config.timeout || 30000\n );\n },\n\n async exchange(callbackToken: string): Promise<NativeExchangeResponse> {\n const config = getNativeAuthConfig();\n if (!config.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [SaaS] POST /native/exchange');\n }\n\n const response = await fetchWithTimeout<NativeExchangeResponse>(\n `${config.saasApiUrl}/native/exchange`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({ callback_token: callbackToken }),\n },\n config.timeout || 30000\n );\n\n if (response.success && response.token) {\n setAuthToken(response.token);\n if (response.user) {\n setAuthUser(response.user);\n }\n }\n\n if (isDebugMode()) {\n console.log('✅ [SaaS] Session établie:', { user: response.user?.name });\n }\n\n return response;\n },\n\n async checkToken(token: string): Promise<{ valid: boolean; user_infos?: import('../types/native').UserInfos }> {\n const cfg = getNativeAuthConfig();\n if (!cfg.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [SaaS] POST /native/check-token');\n }\n\n try {\n const response = await fetchWithTimeout<{ success: boolean; valid: boolean; user_infos?: import('../types/native').UserInfos }>(\n `${cfg.saasApiUrl}/native/check-token`,\n {\n method: 'POST',\n headers: getHeaders(token),\n },\n 10000\n );\n return { valid: response.valid !== false, user_infos: response.user_infos };\n } catch (err) {\n if (err instanceof ApiError && err.statusCode === 401) {\n return { valid: false };\n }\n throw err; // Network/timeout → re-throw (caller will keep session)\n }\n },\n\n async logout(token?: string): Promise<{ success: boolean }> {\n const config = getNativeAuthConfig();\n if (!config.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n try {\n const response = await fetchWithTimeout<{ success: boolean }>(\n `${config.saasApiUrl}/native/logout`,\n {\n method: 'POST',\n headers: getHeaders(token),\n },\n config.timeout || 30000\n );\n\n clearAuthToken();\n credentials = null;\n credentialsLoadedAt = 0;\n return response;\n } catch {\n clearAuthToken();\n credentials = null;\n credentialsLoadedAt = 0;\n return { success: true };\n }\n },\n\n clearCredentials(): void {\n credentials = null;\n credentialsLoadedAt = 0;\n },\n\n // ============================================\n // High-level methods\n // ============================================\n\n async loginEmail(\n email: string,\n accountType: 'user' | 'admin' = 'user'\n ): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('login_email', {\n email,\n account_type: accountType,\n });\n return this.init(native_token);\n },\n\n async loginPhone(\n ccphone: string,\n phone: string,\n accountType: 'user' | 'admin' = 'user'\n ): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('login_phone', {\n ccphone,\n phone,\n account_type: accountType,\n });\n return this.init(native_token);\n },\n\n async loginAccessOtp(otpCode: string): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('login_access_otp', {\n otp_code: otpCode.replace(/[\\s-]/g, ''),\n });\n return this.init(native_token);\n },\n\n async register(data: {\n name: string;\n email?: string;\n ccphone: string;\n phone: string;\n town?: string;\n country?: string;\n registration_type?: 'email' | 'phone';\n }): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('register', {\n ...data,\n registration_type: data.registration_type || 'email',\n });\n return this.init(native_token);\n },\n\n async registerPhoneOnly(data: {\n name: string;\n ccphone: string;\n phone: string;\n town?: string;\n country?: string;\n }): Promise<NativeInitResponse> {\n if (data.ccphone !== '+221') {\n throw new ApiError(\n \"L'inscription par téléphone est réservée aux numéros sénégalais (+221)\",\n 'validation',\n 422,\n 'invalid_country_code'\n );\n }\n\n const { native_token } = await this.encrypt('register', {\n ...data,\n email: '',\n registration_type: 'phone',\n });\n return this.init(native_token);\n },\n\n async recoverPassword(\n method: 'email' | 'phone',\n identifier: { email?: string; ccphone?: string; phone?: string }\n ): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('recovery_password', {\n method,\n ...identifier,\n });\n return this.init(native_token);\n },\n};\n\nexport default nativeAuthService;\n","/**\n * Service de récupération de mot de passe v1.0\n * Architecture Frontend-First : Appels directs à l'IAM\n * \n * @version 1.0.0\n */\n\nimport { \n ApiError, \n fetchWithTimeout, \n getNativeAuthConfig, \n isDebugMode,\n} from './api';\nimport { nativeAuthService } from './nativeAuth';\n\nimport type {\n MobilePasswordInitResponse,\n MobilePasswordSelectMethodResponse,\n MobilePasswordResetResponse,\n MobilePasswordResendResponse,\n} from '../types/mobile';\n\n// ============================================\n// Credentials (shared with nativeAuth)\n// ============================================\n\nfunction getIAMHeaders(): HeadersInit {\n const creds = nativeAuthService.getCredentials();\n if (!creds) {\n throw new ApiError('Credentials non chargés. Appelez loadCredentials() d\\'abord.', 'auth');\n }\n\n return {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n };\n}\n\n// ============================================\n// Service\n// ============================================\n\nexport const mobilePasswordService = {\n hasCredentials(): boolean {\n return nativeAuthService.hasCredentials();\n },\n\n async loadCredentials() {\n return nativeAuthService.loadCredentials();\n },\n\n async initRecovery(email: string): Promise<MobilePasswordInitResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/init', { email });\n }\n\n const response = await fetchWithTimeout<MobilePasswordInitResponse>(\n `${config.iamApiUrl}/iam/native/password/init`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({ email }),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] Init recovery:', { \n status: response.status, \n hasOtp: !!response.otp_code,\n });\n }\n\n return response;\n },\n\n async selectMethod(\n processToken: string, \n receiveChoice: 'email' | 'phone'\n ): Promise<MobilePasswordSelectMethodResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/select-method', { receiveChoice });\n }\n\n return fetchWithTimeout<MobilePasswordSelectMethodResponse>(\n `${config.iamApiUrl}/iam/native/password/select-method`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({ \n process_token: processToken, \n receive_choice: receiveChoice,\n }),\n },\n config.timeout || 30000\n );\n },\n\n validateOtpLocally(inputCode: string, storedCode: string): boolean {\n return inputCode === storedCode;\n },\n\n async reset(\n processToken: string,\n password: string\n ): Promise<MobilePasswordResetResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/reset');\n }\n\n return fetchWithTimeout<MobilePasswordResetResponse>(\n `${config.iamApiUrl}/iam/native/password/reset`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n password,\n password_confirmation: password,\n }),\n },\n config.timeout || 30000\n );\n },\n\n async resendOtp(processToken: string): Promise<MobilePasswordResendResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/resend');\n }\n\n return fetchWithTimeout<MobilePasswordResendResponse>(\n `${config.iamApiUrl}/iam/native/password/resend`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({ process_token: processToken }),\n },\n config.timeout || 30000\n );\n },\n};\n\nexport { ApiError };\nexport default mobilePasswordService;\n","/**\n * Hook de récupération de mot de passe v1.0\n * Architecture Frontend-First avec appels directs à l'IAM\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { mobilePasswordService } from '../services/mobilePassword';\nimport { setNativeAuthConfig, ApiError } from '../services/api';\nimport type { MobilePasswordState } from '../types/mobile';\n\nexport interface UseMobilePasswordOptions {\n saasApiUrl: string;\n iamApiUrl: string;\n autoLoadCredentials?: boolean;\n \n}\n\ninterface MobilePasswordStateExtended extends MobilePasswordState {\n credentialsLoaded: boolean;\n errorType: string | null;\n}\n\nfunction getErrorMessage(err: unknown, context: string): { message: string; type: string } {\n if (err instanceof ApiError) {\n return { message: err.message, type: err.type };\n }\n if (err instanceof Error) {\n if (err.message.includes('fetch') || err.message.includes('network')) {\n return { message: 'Vérifiez votre connexion Internet', type: 'network' };\n }\n if (err.message.includes('timeout')) {\n return { message: 'Le serveur met trop de temps à répondre', type: 'timeout' };\n }\n return { message: err.message, type: 'unknown' };\n }\n return { message: `Erreur lors de ${context}`, type: 'unknown' };\n}\n\nexport function useMobilePassword(options: UseMobilePasswordOptions) {\n const { saasApiUrl, iamApiUrl, autoLoadCredentials = true } = options;\n\n const configuredRef = useRef(false);\n\n useEffect(() => {\n if (!configuredRef.current) {\n setNativeAuthConfig({ saasApiUrl, iamApiUrl });\n configuredRef.current = true;\n }\n }, [saasApiUrl, iamApiUrl]);\n\n const [state, setState] = useState<MobilePasswordStateExtended>({\n credentialsLoaded: false,\n processToken: null,\n status: 'idle',\n storedOtp: null,\n receiveMode: null,\n maskedEmail: null,\n maskedPhone: null,\n loading: false,\n error: null,\n errorType: null,\n });\n\n useEffect(() => {\n if (autoLoadCredentials && !state.credentialsLoaded) {\n loadCredentials();\n }\n }, [autoLoadCredentials, state.credentialsLoaded]);\n\n const loadCredentials = useCallback(async () => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n await mobilePasswordService.loadCredentials();\n setState(prev => ({ ...prev, credentialsLoaded: true, loading: false }));\n return { success: true };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le chargement');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const initRecovery = useCallback(async (email: string) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!mobilePasswordService.hasCredentials()) {\n await mobilePasswordService.loadCredentials();\n }\n const response = await mobilePasswordService.initRecovery(email);\n\n if (response.success && response.process_token) {\n if (response.status === 'choice_required') {\n setState(prev => ({\n ...prev,\n credentialsLoaded: true,\n processToken: response.process_token!,\n status: 'choice_required',\n maskedEmail: response.masked_email || null,\n maskedPhone: response.masked_phone || null,\n loading: false,\n }));\n return { success: true, status: 'choice_required' as const };\n } else {\n setState(prev => ({\n ...prev,\n credentialsLoaded: true,\n processToken: response.process_token!,\n status: 'pending_otp',\n storedOtp: response.otp_code || null,\n receiveMode: 'email',\n maskedEmail: response.masked_email || null,\n loading: false,\n }));\n return { success: true, status: 'pending_otp' as const };\n }\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Aucun compte trouvé avec cet email',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la recherche du compte');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const selectMethod = useCallback(async (choice: 'email' | 'phone') => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n const response = await mobilePasswordService.selectMethod(state.processToken, choice);\n if (response.success) {\n setState(prev => ({\n ...prev,\n status: 'pending_otp',\n storedOtp: response.otp_code || null,\n receiveMode: response.receive_mode || choice,\n loading: false,\n }));\n return { success: true };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Impossible d\\'envoyer le code',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'envoi du code');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const verifyOtp = useCallback((inputCode: string): boolean => {\n if (!state.storedOtp) {\n setState(prev => ({ ...prev, error: 'Session invalide', errorType: 'invalid_session' }));\n return false;\n }\n const isValid = mobilePasswordService.validateOtpLocally(inputCode, state.storedOtp);\n if (isValid) {\n setState(prev => ({ ...prev, status: 'pending_password', error: null, errorType: null }));\n return true;\n }\n setState(prev => ({ ...prev, error: 'Code incorrect', errorType: 'invalid_otp' }));\n return false;\n }, [state.storedOtp]);\n\n const resetPassword = useCallback(async (password: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n const response = await mobilePasswordService.reset(state.processToken, password);\n if (response.success) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de la réinitialisation',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la réinitialisation');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const resendOtp = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n const response = await mobilePasswordService.resendOtp(state.processToken);\n if (response.success && response.otp_code) {\n setState(prev => ({ ...prev, storedOtp: response.otp_code!, loading: false }));\n return { success: true, cooldown: response.cooldown_remaining };\n }\n setState(prev => ({ ...prev, loading: false }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le renvoi');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const reset = useCallback(() => {\n setState({\n credentialsLoaded: state.credentialsLoaded,\n processToken: null,\n status: 'idle',\n storedOtp: null,\n receiveMode: null,\n maskedEmail: null,\n maskedPhone: null,\n loading: false,\n error: null,\n errorType: null,\n });\n }, [state.credentialsLoaded]);\n\n const clearError = useCallback(() => {\n setState(prev => ({ ...prev, error: null, errorType: null }));\n }, []);\n\n return {\n credentialsLoaded: state.credentialsLoaded,\n processToken: state.processToken,\n status: state.status,\n storedOtp: state.storedOtp,\n receiveMode: state.receiveMode,\n maskedEmail: state.maskedEmail,\n maskedPhone: state.maskedPhone,\n loading: state.loading,\n error: state.error,\n errorType: state.errorType,\n\n isCompleted: state.status === 'completed',\n isChoiceRequired: state.status === 'choice_required',\n isPendingOtp: state.status === 'pending_otp',\n isPendingPassword: state.status === 'pending_password',\n\n loadCredentials,\n initRecovery,\n selectMethod,\n verifyOtp,\n resetPassword,\n resendOtp,\n reset,\n clearError,\n };\n}\n\nexport default useMobilePassword;\n","/**\n * Password Recovery Modal for @ollaid/native-sso\n * Flow: email → method-choice → OTP → new password → success\n * Design aligned with web SSO\n * \n * @version 1.0.0\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription,\n Button, Input, Label, RadioGroup, RadioGroupItem,\n IconLock, IconCheckCircle2, IconArrowLeft, IconKeyRound, IconLoader2,\n} from './ui';\nimport OTPInput from './OTPInput';\nimport { useMobilePassword } from '../hooks/useMobilePassword';\n\nexport interface PasswordRecoveryModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSuccess: () => void;\n saasApiUrl: string;\n iamApiUrl: string;\n \n}\n\ntype RecoveryStep = 'email' | 'method-choice' | 'otp' | 'password' | 'success';\n\nconst C = {\n primary: '#002147',\n green: '#16a34a',\n greenBg: '#dcfce7',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n gray900: '#111827',\n red: '#dc2626',\n redBg: '#fef2f2',\n white: '#ffffff',\n} as const;\n\nconst iconCircle = (bg: string, size = '3rem'): React.CSSProperties => ({\n margin: '0 auto', width: size, height: size, backgroundColor: bg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst backBtnStyle: React.CSSProperties = {\n position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nexport function PasswordRecoveryModal({ open, onOpenChange, onSuccess, saasApiUrl, iamApiUrl }: PasswordRecoveryModalProps) {\n const {\n status, loading: pwLoading, error: pwError, receiveMode, maskedEmail, maskedPhone,\n initRecovery, selectMethod, verifyOtp, resetPassword, resendOtp, reset: resetHook, clearError,\n } = useMobilePassword({ saasApiUrl, iamApiUrl });\n\n const [step, setStep] = useState<RecoveryStep>('email');\n const [email, setEmail] = useState('');\n const [otp, setOtp] = useState('');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [selectedMethod, setSelectedMethod] = useState<'email' | 'phone'>('email');\n const [resendCooldown, setResendCooldown] = useState(0);\n\n const error = localError || pwError;\n\n useEffect(() => {\n if (status === 'choice_required') setStep('method-choice');\n else if (status === 'pending_otp') { setStep('otp'); setResendCooldown(60); }\n else if (status === 'pending_password') setStep('password');\n else if (status === 'completed') setStep('success');\n }, [status]);\n\n useEffect(() => {\n if (resendCooldown > 0) {\n const timer = setTimeout(() => setResendCooldown(resendCooldown - 1), 1000);\n return () => clearTimeout(timer);\n }\n }, [resendCooldown]);\n\n const resetState = () => {\n setStep('email'); setEmail(''); setOtp(''); setPassword(''); setConfirmPassword('');\n setLocalError(null); setSelectedMethod('email'); setResendCooldown(0); resetHook();\n };\n\n const handleClose = () => { resetState(); onOpenChange(false); };\n const handleBackToLogin = () => { resetState(); onSuccess(); };\n\n const handleEmailSubmit = async () => {\n setLocalError(null); clearError();\n if (!email.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.trim())) { setLocalError('Veuillez entrer une adresse email valide'); return; }\n await initRecovery(email.trim());\n };\n\n const handleMethodSubmit = async () => {\n setLocalError(null); clearError();\n await selectMethod(selectedMethod);\n };\n\n const handleOTPSubmit = () => {\n if (otp.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n setLocalError(null); clearError();\n const isValid = verifyOtp(otp);\n if (!isValid) setLocalError('Code incorrect');\n };\n\n const handleResendOTP = async () => {\n if (resendCooldown > 0) return;\n const result = await resendOtp();\n if (result.success) { setResendCooldown(result.cooldown || 60); setOtp(''); setLocalError(null); }\n };\n\n const handlePasswordSubmit = async () => {\n if (password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n if (password !== confirmPassword) { setLocalError('Les mots de passe ne correspondent pas'); return; }\n setLocalError(null); clearError();\n await resetPassword(password);\n };\n\n const goBack = () => {\n setLocalError(null); clearError();\n if (step === 'method-choice') { setStep('email'); resetHook(); }\n else if (step === 'otp') { setStep(maskedPhone ? 'method-choice' : 'email'); resetHook(); }\n else if (step === 'password') setStep('otp');\n };\n\n // ===== SUCCESS =====\n if (step === 'success') {\n return (\n <Dialog open={open} onOpenChange={handleClose}>\n <DialogContent>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.greenBg), width: '5rem', height: '5rem' }}>\n <IconCheckCircle2 style={{ width: '3rem', height: '3rem', color: C.green }} />\n </div>\n <DialogTitle>Mot de passe modifié !</DialogTitle>\n <DialogDescription>Votre mot de passe a été changé avec succès.</DialogDescription>\n </DialogHeader>\n <Button onClick={handleBackToLogin} style={{ width: '100%', marginTop: '1rem' }}>Retour à la connexion</Button>\n </DialogContent>\n </Dialog>\n );\n }\n\n return (\n <Dialog open={open} onOpenChange={handleClose}>\n <DialogContent>\n {step !== 'email' && (\n <button onClick={goBack} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n )}\n\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary + '1a')}>\n {step === 'otp' ? (\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n ) : (\n <IconLock style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n )}\n </div>\n <DialogTitle>\n {step === 'email' && 'Récupération de mot de passe'}\n {step === 'method-choice' && 'Recevoir le code de vérification'}\n {step === 'otp' && 'Vérification'}\n {step === 'password' && 'Nouveau mot de passe'}\n </DialogTitle>\n <DialogDescription>\n {step === 'email' && 'Veuillez entrer votre adresse email'}\n {step === 'method-choice' && 'Comment souhaitez-vous recevoir le code ?'}\n {step === 'otp' && (receiveMode === 'phone' ? `Code envoyé par SMS au ${maskedPhone}` : `Code envoyé par email à ${maskedEmail}`)}\n {step === 'password' && 'Définissez votre nouveau mot de passe'}\n </DialogDescription>\n </DialogHeader>\n\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {error && <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg, color: C.red, fontSize: '0.875rem' }}>{error}</div>}\n\n {step === 'email' && (\n <>\n <div><Label htmlFor=\"recovery-email\">Adresse email</Label><Input id=\"recovery-email\" type=\"email\" placeholder=\"vous@exemple.com\" value={email} onChange={e => setEmail(e.target.value)} disabled={pwLoading} /></div>\n <Button onClick={handleEmailSubmit} disabled={pwLoading} style={{ width: '100%' }}>\n {pwLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n </span>\n ) : 'Continuer'}\n </Button>\n <Button variant=\"ghost\" onClick={handleBackToLogin} style={{ width: '100%' }}>Retour à la connexion</Button>\n </>\n )}\n\n {step === 'method-choice' && (\n <>\n <RadioGroup value={selectedMethod} onValueChange={v => setSelectedMethod(v as 'email' | 'phone')}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem', padding: '1rem', borderRadius: '0.5rem', border: `2px solid ${selectedMethod === 'email' ? C.primary : C.gray200}`, cursor: 'pointer' }} onClick={() => setSelectedMethod('email')}>\n <RadioGroupItem value=\"email\" id=\"method-email\" />\n <div><div style={{ fontWeight: 500 }}>Par email</div><div style={{ fontSize: '0.75rem', color: C.gray500 }}>{maskedEmail}</div></div>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem', padding: '1rem', borderRadius: '0.5rem', border: `2px solid ${selectedMethod === 'phone' ? C.primary : C.gray200}`, cursor: 'pointer' }} onClick={() => setSelectedMethod('phone')}>\n <RadioGroupItem value=\"phone\" id=\"method-phone\" />\n <div><div style={{ fontWeight: 500 }}>Par SMS</div><div style={{ fontSize: '0.75rem', color: C.gray500 }}>{maskedPhone}</div></div>\n </div>\n </div>\n </RadioGroup>\n <Button onClick={handleMethodSubmit} disabled={pwLoading} style={{ width: '100%' }}>\n {pwLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Envoi...\n </span>\n ) : 'Envoyer le code'}\n </Button>\n </>\n )}\n\n {step === 'otp' && (\n <>\n <OTPInput value={otp} onChange={setOtp} disabled={pwLoading} />\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n {resendCooldown > 0 ? <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span> : (\n <button type=\"button\" style={{ color: C.primary, background: 'none', border: 'none', cursor: 'pointer', textDecoration: 'underline' }} onClick={handleResendOTP}>Code non reçu ? Renvoyer</button>\n )}\n </div>\n <Button onClick={handleOTPSubmit} disabled={otp.length !== 6} style={{ width: '100%' }}>Vérifier</Button>\n </>\n )}\n\n {step === 'password' && (\n <>\n <div><Label>Nouveau mot de passe</Label><Input type=\"password\" placeholder=\"Minimum 8 caractères\" value={password} onChange={e => setPassword(e.target.value)} disabled={pwLoading} /></div>\n <div><Label>Confirmer le mot de passe</Label><Input type=\"password\" placeholder=\"Retapez votre mot de passe\" value={confirmPassword} onChange={e => setConfirmPassword(e.target.value)} disabled={pwLoading} /></div>\n <Button onClick={handlePasswordSubmit} disabled={pwLoading || !password || !confirmPassword} style={{ width: '100%' }}>\n {pwLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Modification...\n </span>\n ) : 'Modifier le mot de passe'}\n </Button>\n </>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default PasswordRecoveryModal;\n","/**\n * Hook de vérification périodique du token Sanctum\n * \n * - Premier check 2 min après login\n * - Checks suivants toutes les 5 min\n * - Ne déconnecte PAS si offline ou serveur inaccessible\n * - Déconnecte UNIQUEMENT si le backend retourne 401 (token invalide)\n * \n * @version 1.0.0\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { STORAGE_KEYS } from '../services/api';\nimport type { UserInfos } from '../types/native';\n\nconst FIRST_CHECK_DELAY = 2 * 60 * 1000; // 2 minutes\nconst INTERVAL_DELAY = 5 * 60 * 1000; // 5 minutes\n\nexport interface UseTokenHealthCheckOptions {\n /** Whether to enable health checks (true when authenticated) */\n enabled: boolean;\n /** SaaS API base URL */\n saasApiUrl: string;\n /** Called when the backend explicitly invalidates the token (401) */\n onTokenInvalid: () => void;\n /** Called when fresh user_infos are received */\n onUserUpdated?: (userInfos: UserInfos) => void;\n /** Debug mode */\n debug?: boolean;\n}\n\nasync function checkTokenValidity(\n saasApiUrl: string,\n token: string,\n debug: boolean\n): Promise<{ valid: boolean; user_infos?: UserInfos }> {\n // 1. Check connectivity first\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n if (debug) console.log('🔄 [HealthCheck] Offline — skip');\n throw new Error('offline');\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000); // 10s timeout\n\n try {\n const response = await fetch(`${saasApiUrl}/native/check-token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'Authorization': `Bearer ${token}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // 401 = token explicitly invalid/expired → the ONLY case we disconnect\n if (response.status === 401) {\n if (debug) console.log('🔄 [HealthCheck] Token invalide (401)');\n return { valid: false };\n }\n\n // Any other non-OK status = server issue, NOT token issue → keep session\n if (!response.ok) {\n if (debug) console.log(`🔄 [HealthCheck] Serveur erreur ${response.status} — session conservée`);\n throw new Error(`server_error_${response.status}`);\n }\n\n const data = await response.json();\n if (debug) console.log('🔄 [HealthCheck] Token valide ✅');\n\n return {\n valid: data.valid !== false,\n user_infos: data.user_infos,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Re-throw if it's our \"valid: false\" result wrapped in the return above\n if (error instanceof Error && error.message === 'offline') {\n throw error;\n }\n\n // Network errors, timeouts, server unreachable → do NOT invalidate\n if (debug) {\n const msg = error instanceof Error ? error.message : 'unknown';\n console.log(`🔄 [HealthCheck] Erreur réseau/serveur (${msg}) — session conservée`);\n }\n throw error;\n }\n}\n\nexport function useTokenHealthCheck(options: UseTokenHealthCheckOptions): void {\n const { enabled, saasApiUrl, onTokenInvalid, onUserUpdated, debug = false } = options;\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const enabledRef = useRef(enabled);\n const callbacksRef = useRef({ onTokenInvalid, onUserUpdated });\n\n // Keep refs up to date\n enabledRef.current = enabled;\n callbacksRef.current = { onTokenInvalid, onUserUpdated };\n\n const performCheck = useCallback(async () => {\n if (!enabledRef.current) return;\n\n const token = typeof localStorage !== 'undefined'\n ? localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN)\n : null;\n\n if (!token) {\n if (debug) console.log('🔄 [HealthCheck] Pas de token — arrêt');\n return;\n }\n\n try {\n const result = await checkTokenValidity(saasApiUrl, token, debug);\n\n if (!result.valid) {\n // Token explicitly rejected by backend → clear session\n callbacksRef.current.onTokenInvalid();\n return;\n }\n\n // Token valid — update user_infos if provided\n if (result.user_infos && callbacksRef.current.onUserUpdated) {\n callbacksRef.current.onUserUpdated(result.user_infos);\n }\n } catch {\n // Network/timeout/server error → silently keep session\n }\n }, [saasApiUrl, debug]);\n\n useEffect(() => {\n // Cleanup previous timers\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n\n if (!enabled || !saasApiUrl) return;\n\n if (debug) console.log('🔄 [HealthCheck] Activé — premier check dans 2 min');\n\n // First check after 2 minutes\n timerRef.current = setTimeout(() => {\n performCheck();\n\n // Then every 5 minutes\n intervalRef.current = setInterval(performCheck, INTERVAL_DELAY);\n }, FIRST_CHECK_DELAY);\n\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n if (intervalRef.current) clearInterval(intervalRef.current);\n };\n }, [enabled, saasApiUrl, performCheck, debug]);\n}\n\nexport default useTokenHealthCheck;\n","/**\n * Hook d'authentification Native SSO v1.0\n * Architecture Frontend-First avec appels directs à l'IAM\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { setNativeAuthConfig, STORAGE_KEYS, isDebugMode } from '../services/api';\nimport { useTokenHealthCheck } from './useTokenHealthCheck';\nimport type {\n NativeAuthState,\n NativeAuthStatus,\n NativeExchangeResponse,\n AccountType,\n UserInfos,\n} from '../types/native';\n\n/** Helper: persist session to localStorage (unified keys) */\nfunction saveSession(exchangeResult: NativeExchangeResponse, accountType: AccountType | 'user' | 'client') {\n const sanctumToken = exchangeResult.auth_token || exchangeResult.token;\n localStorage.setItem(STORAGE_KEYS.AUTH_TOKEN, sanctumToken);\n localStorage.setItem(STORAGE_KEYS.TOKEN, sanctumToken);\n \n // Build user object from user_infos if available, otherwise from user\n const baseUser = exchangeResult.user_infos \n ? { ...exchangeResult.user, ...exchangeResult.user_infos }\n : exchangeResult.user;\n \n // Enrich user with iam_reference and alias_reference\n const aliasRef = exchangeResult.user?.alias_reference || (exchangeResult as any).alias_reference || '';\n const iamRef = exchangeResult.user?.reference || '';\n \n const userToStore = {\n ...baseUser,\n iam_reference: iamRef,\n alias_reference: aliasRef,\n };\n \n // Store alias_reference separately for quick access\n if (aliasRef) {\n localStorage.setItem(STORAGE_KEYS.ALIAS_REFERENCE, aliasRef);\n }\n \n // account_type is stored SEPARATELY, never inside the user object\n // Use the accountType string directly (already resolved by the caller)\n const acctType = typeof accountType === 'string' ? accountType : 'user';\n localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(userToStore));\n localStorage.setItem(STORAGE_KEYS.ACCOUNT_TYPE, acctType);\n \n return { token: sanctumToken, user: userToStore };\n}\n\n/** Helper: clear session from localStorage */\nfunction clearSession() {\n localStorage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.TOKEN);\n localStorage.removeItem(STORAGE_KEYS.USER);\n localStorage.removeItem(STORAGE_KEYS.ACCOUNT_TYPE);\n localStorage.removeItem(STORAGE_KEYS.ALIAS_REFERENCE);\n}\n\nfunction getErrorMessage(err: unknown, context: string): { message: string; type: string } {\n if (err instanceof Error) {\n if (err.message.includes('fetch') || err.message.includes('network')) {\n return { message: 'Vérifiez votre connexion Internet', type: 'network' };\n }\n if (err.message.includes('timeout')) {\n return { message: 'Le serveur met trop de temps à répondre', type: 'timeout' };\n }\n return { message: err.message, type: 'unknown' };\n }\n return { message: `Erreur lors de ${context}`, type: 'unknown' };\n}\n\nexport interface UseNativeAuthOptions {\n /** URL du Backend SaaS */\n saasApiUrl: string;\n /** URL du Backend IAM */\n iamApiUrl: string;\n /** Charger les credentials automatiquement au montage */\n autoLoadCredentials?: boolean;\n /** Type de compte par défaut à persister (défaut: 'user') */\n defaultAccountType?: 'user' | 'client';\n}\n\nexport function useNativeAuth(options: UseNativeAuthOptions) {\n const { saasApiUrl, iamApiUrl, autoLoadCredentials = true, defaultAccountType = 'user' } = options;\n \n const configuredRef = useRef(false);\n \n // Debug is controlled by backend via /native/config — resolved via isDebugMode()\n const debug = isDebugMode();\n \n useEffect(() => {\n if (!configuredRef.current) {\n setNativeAuthConfig({ saasApiUrl, iamApiUrl });\n configuredRef.current = true;\n }\n }, [saasApiUrl, iamApiUrl]);\n\n const [state, setState] = useState<NativeAuthState & { otpMethod?: string | null; otpSentTo?: string | null }>({\n credentialsLoaded: false,\n processToken: null,\n status: null,\n user: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n loading: false,\n error: null,\n errorType: null,\n otpMethod: null,\n otpSentTo: null,\n });\n\n const [accountType, setAccountType] = useState<AccountType>('email');\n\n // --- Token Health Check ---\n const handleTokenInvalid = useCallback(() => {\n if (debug) console.log('🔐 [HealthCheck] Token invalide — déconnexion locale');\n clearSession();\n setState({\n credentialsLoaded: false,\n processToken: null,\n status: null,\n user: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n loading: false,\n error: null,\n errorType: null,\n otpMethod: null,\n otpSentTo: null,\n });\n }, [debug]);\n\n const handleUserUpdated = useCallback((userInfos: UserInfos) => {\n // Merge fresh user_infos into stored user\n const storedRaw = localStorage.getItem(STORAGE_KEYS.USER);\n if (storedRaw) {\n try {\n const stored = JSON.parse(storedRaw);\n const merged = { ...stored, ...userInfos };\n localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(merged));\n setState(prev => ({ ...prev, user: merged }));\n } catch { /* ignore */ }\n }\n }, []);\n\n useTokenHealthCheck({\n enabled: state.status === 'completed' && state.user !== null,\n saasApiUrl,\n onTokenInvalid: handleTokenInvalid,\n onUserUpdated: handleUserUpdated,\n debug,\n });\n\n // Check existing session\n useEffect(() => {\n const storedToken = localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN);\n const storedUser = localStorage.getItem(STORAGE_KEYS.USER);\n \n if (storedToken && storedUser) {\n try {\n const user = JSON.parse(storedUser);\n setState(prev => ({ ...prev, user, status: 'completed' }));\n } catch {\n clearSession();\n }\n }\n }, []);\n\n // Auto-load credentials\n useEffect(() => {\n if (autoLoadCredentials && !state.credentialsLoaded && !state.user) {\n loadCredentials();\n }\n }, [autoLoadCredentials, state.credentialsLoaded, state.user]);\n\n // Background auto-refresh of credentials before TTL expiration\n useEffect(() => {\n // Only refresh while user is NOT authenticated and credentials are loaded\n if (state.status === 'completed' || !state.credentialsLoaded) return;\n\n const ttl = nativeAuthService.getCredentialsTtl();\n const refreshInterval = Math.max((ttl - 30) * 1000, 30000); // At least 30s\n\n if (debug) {\n console.log(`🔄 [Native] Auto-refresh credentials every ${refreshInterval / 1000}s (TTL: ${ttl}s)`);\n }\n\n const timer = setInterval(async () => {\n try {\n await nativeAuthService.loadCredentials();\n if (debug) console.log('✅ [Native] Credentials auto-refreshed');\n } catch (err) {\n if (debug) console.warn('⚠️ [Native] Auto-refresh failed:', err);\n }\n }, refreshInterval);\n\n return () => clearInterval(timer);\n }, [state.status, state.credentialsLoaded, debug]);\n\n const loadCredentials = useCallback(async () => {\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n await nativeAuthService.loadCredentials();\n setState(prev => ({ ...prev, credentialsLoaded: true, loading: false }));\n return { success: true };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le chargement');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const loginWithEmail = useCallback(async (\n email: string,\n acctType: 'user' | 'admin' = 'user'\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const response = await nativeAuthService.loginEmail(email, acctType);\n\n // Garde: ancien backend peut retourner needs_access directement depuis init\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token || null,\n status: 'needs_access' as NativeAuthStatus,\n application: response.application || null,\n prompt: response.prompt || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n application: response.application || null,\n prompt: response.prompt || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n if (response.error_type === 'alias_disabled' && response.alternative_method) {\n setState(prev => ({\n ...prev,\n alternativeMethod: {\n type: response.alternative_method!,\n value: response.alternative_method === 'email' \n ? response.alternative_email! \n : response.alternative_phone!,\n },\n loading: false,\n error: 'Cette méthode de connexion est désactivée',\n errorType: 'alias_disabled',\n }));\n return { success: false, error_type: 'alias_disabled' };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur d\\'authentification',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'authentification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const loginWithPhone = useCallback(async (\n ccphone: string,\n phone: string,\n acctType: 'user' | 'admin' = 'user'\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const response = await nativeAuthService.loginPhone(ccphone, phone, acctType);\n\n // Garde: ancien backend peut retourner needs_access directement depuis init\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token || null,\n status: 'needs_access' as NativeAuthStatus,\n application: response.application || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n application: response.application || null,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur d\\'authentification',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'authentification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const loginWithAccessOtp = useCallback(async (otpCode: string) => {\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const response = await nativeAuthService.loginAccessOtp(otpCode);\n\n // v4.5: Handle needs_access (user needs to confirm access)\n if (response.success && response.needs_access && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: 'needs_access' as NativeAuthStatus,\n application: response.application || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n // v4.5: Handle direct callback_token (user already has access)\n if (response.success && response.callback_token) {\n setState(prev => ({ ...prev, loading: false }));\n return { success: true, status: 'completed', callback_token: response.callback_token };\n }\n\n // Legacy: Handle process_token response\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code invalide',\n errorType: response.error_type || 'invalid_otp',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'authentification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const register = useCallback(async (\n data: {\n name: string;\n email?: string;\n ccphone: string;\n phone: string;\n town?: string;\n country?: string;\n }\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const registrationType = accountType === 'phone-only' ? 'phone' : 'email';\n \n const response = await nativeAuthService.register({\n ...data,\n email: registrationType === 'phone' ? '' : data.email,\n registration_type: registrationType,\n });\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n otpMethod: response.otp_method || null,\n otpSentTo: response.otp_sent_to || null,\n conflict: response.conflict ? {\n type: response.conflict.type,\n maskedIdentifier: response.conflict.masked_identifier,\n options: {\n canLogin: response.conflict.options.can_login,\n canRecoverByEmail: response.conflict.options.can_recover_by_email,\n canRecoverBySms: response.conflict.options.can_recover_by_sms,\n maskedEmail: response.conflict.options.masked_email,\n maskedPhone: response.conflict.options.masked_phone,\n },\n } : null,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de l\\'inscription',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'inscription');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [accountType]);\n\n const submitPassword = useCallback(async (password: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.validate(state.processToken, { password });\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser, callback_token: response.callback_token };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: exchangeResult.message || 'Erreur lors de l\\'échange',\n errorType: 'exchange_failed',\n }));\n return { success: false, error_type: 'exchange_failed' };\n }\n\n if (response.requires_2fa) {\n setState(prev => ({ ...prev, status: 'pending_2fa', loading: false }));\n return { success: true, requires_2fa: true };\n }\n\n // needs_access after password validation — stocker le nouveau process_token\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n status: 'needs_access' as NativeAuthStatus,\n processToken: response.process_token || prev.processToken,\n application: response.application || prev.application,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : prev.user,\n prompt: response.prompt || prev.prompt,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Mot de passe incorrect',\n errorType: response.error_type || 'invalid_password',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la validation');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const submitOtp = useCallback(async (otpCode: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.validate(state.processToken, { otp_code: otpCode });\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser, callback_token: response.callback_token };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: exchangeResult.message || 'Erreur lors de l\\'échange',\n errorType: 'exchange_failed',\n }));\n return { success: false, error_type: 'exchange_failed' };\n }\n\n if (response.success && response.status === 'pending_registration') {\n setState(prev => ({ ...prev, status: 'pending_registration', loading: false }));\n return { success: true, status: 'pending_registration' };\n }\n\n // needs_access after OTP validation — stocker le nouveau process_token\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n status: 'needs_access' as NativeAuthStatus,\n processToken: response.process_token || prev.processToken,\n application: response.application || prev.application,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : prev.user,\n prompt: response.prompt || prev.prompt,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code incorrect',\n errorType: response.error_type || 'invalid_otp',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la vérification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const submitTotp = useCallback(async (totpCode: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.verifyTotp(state.processToken, totpCode);\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser };\n }\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code 2FA incorrect',\n errorType: response.error_type || 'invalid_totp',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la vérification 2FA');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const grantAccess = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.grantAccess(state.processToken);\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser, callback_token: response.callback_token };\n }\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de l\\'accès',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'accès');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const resendOtp = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.resendOtp(state.processToken);\n setState(prev => ({ ...prev, loading: false }));\n return { \n success: response.success, \n cooldown: response.cooldown_remaining,\n message: response.message,\n otp_code_dev: response.otp_code_dev,\n };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le renvoi');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const setSession = useCallback((data: NativeExchangeResponse) => {\n const { user: savedUser } = saveSession(data, defaultAccountType);\n setState(prev => ({\n ...prev,\n user: savedUser,\n status: 'completed',\n processToken: null,\n }));\n }, [defaultAccountType]);\n\n const logout = useCallback(async () => {\n const token = localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN);\n try {\n if (token) {\n await nativeAuthService.logout(token);\n }\n } catch { /* ignore */ }\n\n clearSession();\n \n setState({\n credentialsLoaded: false,\n processToken: null,\n status: null,\n user: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n loading: false,\n error: null,\n errorType: null,\n otpMethod: null,\n otpSentTo: null,\n });\n }, []);\n\n const reset = useCallback(() => {\n setState(prev => ({\n ...prev,\n processToken: null,\n status: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n error: null,\n errorType: null,\n }));\n }, []);\n\n const clearError = useCallback(() => {\n setState(prev => ({ ...prev, error: null, errorType: null }));\n }, []);\n\n return {\n // State\n credentialsLoaded: state.credentialsLoaded,\n processToken: state.processToken,\n status: state.status,\n user: state.user,\n application: state.application,\n prompt: state.prompt,\n alternativeMethod: state.alternativeMethod,\n conflict: state.conflict,\n loading: state.loading,\n error: state.error,\n errorType: state.errorType,\n isAuthenticated: state.status === 'completed' && state.user !== null,\n \n accountType,\n isPhoneOnly: accountType === 'phone-only',\n otpMethod: state.otpMethod,\n otpSentTo: state.otpSentTo,\n\n // Methods\n loadCredentials,\n loginWithEmail,\n loginWithPhone,\n loginWithAccessOtp,\n submitPassword,\n submitOtp,\n submitTotp,\n grantAccess,\n resendOtp,\n setSession,\n logout,\n reset,\n clearError,\n register,\n setAccountType,\n };\n}\n\nexport default useNativeAuth;\n","/**\n * Login Modal for @ollaid/native-sso\n * Complete login flow aligned with web SSO /sso/auth design\n * \n * @version 1.0.0\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription,\n Button, Input, Label,\n IconShieldCheck, IconMail, IconPhone, IconLock, IconKeyRound,\n IconArrowLeft, IconEye, IconEyeOff, IconCheckCircle2, IconLoader2,\n} from './ui';\nimport OTPInput from './OTPInput';\nimport PasswordRecoveryModal from './PasswordRecoveryModal';\nimport { useNativeAuth } from '../hooks/useNativeAuth';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport type { UserInfos } from '../types/native';\n\ntype LoginStep = 'choice' | 'email-check' | 'email-password' | 'email-otp' | 'email-create-password' | 'phone-input' | 'phone-otp' | 'access-otp';\n\nexport interface LoginModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSwitchToSignup: () => void;\n onLoginSuccess?: (token: string, user: UserInfos) => void;\n saasApiUrl: string;\n iamApiUrl: string;\n loading?: boolean;\n showSwitchToSignup?: boolean;\n /** Type de compte par défaut à persister dans localStorage */\n defaultAccountType?: 'user' | 'client';\n}\n\n// Design tokens\nconst C = {\n primary: '#002147',\n accent: '#e8430a',\n green: '#16a34a',\n greenBg: '#dcfce7',\n amber: '#f59e0b',\n amberBg: '#fef3c7',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n gray900: '#111827',\n red: '#dc2626',\n redBg: '#fef2f2',\n white: '#ffffff',\n} as const;\n\n// Reusable style helpers\nconst iconCircle = (bg: string): React.CSSProperties => ({\n margin: '0 auto', width: '3rem', height: '3rem', backgroundColor: bg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst backBtnStyle: React.CSSProperties = {\n position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nconst linkStyle: React.CSSProperties = {\n color: C.primary, cursor: 'pointer', background: 'none', border: 'none',\n fontWeight: 500, textDecoration: 'underline', fontSize: '0.875rem',\n};\n\nconst errorBoxStyle: React.CSSProperties = {\n padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg,\n color: C.red, fontSize: '0.875rem',\n};\n\nconst methodBtnStyle: React.CSSProperties = {\n width: '100%', height: '3.5rem', justifyContent: 'flex-start', gap: '0.75rem',\n textAlign: 'left' as const, backgroundColor: C.gray100, borderColor: C.gray200,\n};\n\nconst methodIconStyle = (bg: string): React.CSSProperties => ({\n width: '2.5rem', height: '2.5rem', backgroundColor: bg, borderRadius: '0.5rem',\n display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0,\n});\n\nexport function LoginModal({\n open, onOpenChange, onSwitchToSignup, onLoginSuccess, saasApiUrl, iamApiUrl, loading, showSwitchToSignup = true, defaultAccountType,\n}: LoginModalProps) {\n const {\n status, user, application, alternativeMethod, loading: authLoading, error: authError,\n loginWithEmail, loginWithPhone, submitPassword, submitOtp, grantAccess, loginWithAccessOtp,\n resendOtp, setSession, reset: resetAuth, clearError,\n } = useNativeAuth({ saasApiUrl, iamApiUrl, defaultAccountType });\n\n const [step, setStep] = useState<LoginStep>('choice');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [userName, setUserName] = useState<string | null>(null);\n const [phone, setPhone] = useState('');\n const [phoneOtpCode, setPhoneOtpCode] = useState('');\n const [emailOtpCode, setEmailOtpCode] = useState('');\n const [accessOtpCode, setAccessOtpCode] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [resendCooldown, setResendCooldown] = useState(0);\n const [loginSuccess, setLoginSuccess] = useState(false);\n const [loginData, setLoginData] = useState<{ token: string; user: UserInfos } | null>(null);\n const [showPasswordRecovery, setShowPasswordRecovery] = useState(false);\n\n const CCPHONE = '+221';\n const isSubmitting = authLoading || loading;\n const error = localError || authError;\n\n useEffect(() => {\n if (resendCooldown > 0) {\n const timer = setTimeout(() => setResendCooldown(p => p - 1), 1000);\n return () => clearTimeout(timer);\n }\n }, [resendCooldown]);\n\n useEffect(() => {\n if (status === 'pending_password') setStep('email-password');\n else if (status === 'pending_otp') {\n if (step === 'email-check' || step === 'email-password') setStep('email-otp');\n else if (step === 'phone-input') setStep('phone-otp');\n setResendCooldown(60);\n }\n }, [status, step]);\n\n useEffect(() => {\n if (loginSuccess && loginData) {\n const timer = setTimeout(() => {\n setSession({ success: true, token: loginData.token, expires_at: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), user: loginData.user as any });\n onLoginSuccess?.(loginData.token, loginData.user);\n }, 1000);\n return () => clearTimeout(timer);\n }\n }, [loginSuccess, loginData]);\n\n const resetState = () => {\n setStep('choice'); setEmail(''); setPassword('');\n setShowPassword(false); setUserName(null); setPhone(''); setPhoneOtpCode(''); setEmailOtpCode('');\n setAccessOtpCode(''); setLocalError(null); setLoginSuccess(false); setLoginData(null);\n setResendCooldown(0); resetAuth();\n };\n\n useEffect(() => { if (!open) resetState(); }, [open]);\n\n const exchangeCallbackToken = async (callbackToken: string) => {\n try {\n const response = await nativeAuthService.exchange(callbackToken);\n if (response.success && response.token) {\n setLoginData({ token: response.token, user: response.user as UserInfos });\n setLoginSuccess(true);\n } else {\n setLocalError('Erreur lors de la finalisation de la connexion');\n }\n } catch { setLocalError('Erreur de connexion au serveur'); }\n };\n\n const handleEmailCheck = async () => {\n setLocalError(null); clearError();\n if (!email.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) { setLocalError('Adresse email invalide'); return; }\n const result = await loginWithEmail(email.trim());\n if (result.success && user?.name) setUserName(user.name);\n };\n\n const handleEmailPasswordSubmit = async (e: React.FormEvent) => {\n e.preventDefault(); setLocalError(null); clearError();\n if (!password) { setLocalError('Le mot de passe est requis'); return; }\n if (password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n const result = await submitPassword(password);\n if (result.success && (result as any).callback_token) await exchangeCallbackToken((result as any).callback_token);\n };\n\n const handleEmailOtpVerify = async () => {\n setLocalError(null); clearError();\n if (emailOtpCode.length !== 6) { setLocalError('Le code doit contenir 6 chiffres'); return; }\n const result = await submitOtp(emailOtpCode);\n if (result.success && (result as any).callback_token) await exchangeCallbackToken((result as any).callback_token);\n };\n\n const handlePhoneInit = async () => {\n setLocalError(null); clearError();\n const cleanPhone = phone.replace(/\\s/g, '');\n if (cleanPhone.length !== 9) { setLocalError('Le numéro doit contenir exactement 9 chiffres'); return; }\n await loginWithPhone(CCPHONE, cleanPhone);\n };\n\n const handlePhoneVerify = async () => {\n setLocalError(null); clearError();\n if (phoneOtpCode.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n const result = await submitOtp(phoneOtpCode);\n if (result.success && (result as any).callback_token) await exchangeCallbackToken((result as any).callback_token);\n };\n\n const handleAccessOtpSubmit = async () => {\n setLocalError(null); clearError();\n if (accessOtpCode.length !== 8) { setLocalError('Veuillez entrer le code à 8 chiffres'); return; }\n const result = await loginWithAccessOtp(accessOtpCode);\n if (result.success) {\n if ((result as any).callback_token) {\n await exchangeCallbackToken((result as any).callback_token);\n }\n // needs_access is handled by status effect\n }\n };\n\n const handleGrantAccess = async () => {\n setLocalError(null); clearError();\n const result = await grantAccess();\n if (result.success && result.callback_token) await exchangeCallbackToken(result.callback_token);\n };\n\n const handleResendOTP = async () => {\n if (resendCooldown > 0) return;\n const result = await resendOtp();\n if (result.success) setResendCooldown(result.cooldown || 60);\n };\n\n const goBack = () => {\n setLocalError(null); clearError();\n switch (step) {\n case 'email-check': case 'phone-input': case 'access-otp': setStep('choice'); resetAuth(); break;\n case 'email-password': case 'email-otp': setStep('email-check'); resetAuth(); break;\n case 'phone-otp': setStep('phone-input'); resetAuth(); break;\n default: setStep('choice'); resetAuth();\n }\n };\n\n // Render helpers\n const renderError = () => error ? <div style={errorBoxStyle}>{error}</div> : null;\n\n const renderBackBtn = () => (\n <button onClick={goBack} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n );\n\n const renderResendLink = () => (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n {resendCooldown > 0 ? (\n <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span>\n ) : (\n <button type=\"button\" style={linkStyle} onClick={handleResendOTP}>\n Code non reçu ? Renvoyer\n </button>\n )}\n </div>\n );\n\n const renderLoaderBtn = (text: string, loadingText: string, onClick: () => void, disabled: boolean, extraStyle?: React.CSSProperties) => (\n <Button onClick={onClick} disabled={isSubmitting || disabled} style={{ width: '100%', ...extraStyle }}>\n {isSubmitting ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n {loadingText}\n </span>\n ) : text}\n </Button>\n );\n\n return (\n <>\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n\n {/* ===================== SUCCESS ===================== */}\n {loginSuccess && loginData ? (\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.greenBg), width: '5rem', height: '5rem' }}>\n <IconCheckCircle2 style={{ width: '3rem', height: '3rem', color: C.green }} />\n </div>\n <DialogTitle>Connexion réussie</DialogTitle>\n <DialogDescription>\n <span style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginTop: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n Redirection en cours...\n </span>\n </DialogDescription>\n </DialogHeader>\n\n /* ===================== NEEDS ACCESS ===================== */\n ) : status === 'needs_access' && user && application ? (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.primary + '1a'), width: '4rem', height: '4rem' }}>\n {(application as any).logo ? (\n <img src={(application as any).logo} alt={(application as any).name} style={{ width: '2.5rem', height: '2.5rem', borderRadius: '0.5rem' }} />\n ) : (\n <IconShieldCheck style={{ width: '2rem', height: '2rem', color: C.primary }} />\n )}\n </div>\n <DialogTitle>Bienvenue sur {(application as any).name} !</DialogTitle>\n <DialogDescription>\n Bonjour <strong style={{ color: C.gray900 }}>{user.name}</strong>, vous n'avez pas encore de compte sur <strong style={{ color: C.primary }}>{(application as any).name}</strong>.\n </DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem' }}>\n <div style={{ padding: '1rem', backgroundColor: C.gray100, borderRadius: '0.5rem', marginBottom: '1rem', fontSize: '0.875rem', color: C.gray500 }}>\n Votre compte <strong style={{ color: C.primary }}>iam.ollaid.com</strong> existe déjà. Cliquez sur Confirmer pour créer votre accès à <strong style={{ color: C.gray900 }}>{(application as any).name}</strong>.\n </div>\n {renderError()}\n <Button onClick={handleGrantAccess} disabled={isSubmitting} style={{ width: '100%', marginTop: '0.75rem' }}>\n {isSubmitting ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n Création en cours...\n </span>\n ) : 'Confirmer la création de mon compte'}\n </Button>\n <Button variant=\"outline\" onClick={() => { resetAuth(); setStep('choice'); }} disabled={isSubmitting} style={{ width: '100%', marginTop: '0.5rem' }}>\n Annuler\n </Button>\n </div>\n </>\n\n /* ===================== ALIAS DISABLED ===================== */\n ) : alternativeMethod ? (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.amberBg), width: '4rem', height: '4rem' }}>\n {alternativeMethod.type === 'email' ? (\n <IconMail style={{ width: '2rem', height: '2rem', color: C.amber }} />\n ) : (\n <IconPhone style={{ width: '2rem', height: '2rem', color: C.amber }} />\n )}\n </div>\n <DialogTitle>Moyen de connexion désactivé</DialogTitle>\n <DialogDescription>\n Vos identifiants sont corrects, mais vous avez désactivé ce moyen de connexion depuis votre compte IAM.\n </DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem' }}>\n {alternativeMethod.value && (\n <div style={{ padding: '1rem', backgroundColor: C.gray100, borderRadius: '0.5rem', marginBottom: '1rem' }}>\n <p style={{ fontSize: '0.875rem', color: C.gray500, marginBottom: '0.75rem' }}>Vous pouvez vous connecter avec :</p>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', fontSize: '0.875rem', fontWeight: 500, color: C.gray900 }}>\n {alternativeMethod.type === 'phone' ? (\n <IconPhone style={{ width: '1rem', height: '1rem', color: C.primary }} />\n ) : (\n <IconMail style={{ width: '1rem', height: '1rem', color: C.primary }} />\n )}\n <span>{alternativeMethod.value}</span>\n </div>\n </div>\n )}\n <Button onClick={() => {\n if (alternativeMethod.type === 'phone') setStep('phone-input');\n else setStep('email-check');\n resetAuth();\n }} style={{ width: '100%' }}>\n {alternativeMethod.type === 'phone' ? 'Se connecter par téléphone' : 'Se connecter par email'}\n </Button>\n <Button variant=\"outline\" onClick={() => window.open('https://iam.ollaid.com', '_blank')} style={{ width: '100%', marginTop: '0.5rem' }}>\n Réactiver depuis iam.ollaid.com\n </Button>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)} style={{ width: '100%', marginTop: '0.5rem' }}>\n Annuler\n </Button>\n </div>\n </>\n\n /* ===================== MAIN STEPS ===================== */\n ) : (\n <>\n {step !== 'choice' && renderBackBtn()}\n\n {/* ===== CHOICE ===== */}\n {step === 'choice' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.gray100)}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Connexion</DialogTitle>\n <DialogDescription>Choisissez votre méthode de connexion</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {renderError()}\n {/* Email */}\n <Button variant=\"outline\" onClick={() => setStep('email-check')} style={methodBtnStyle}>\n <div style={methodIconStyle(C.accent)}>\n <IconMail style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 500, color: C.gray900 }}>Adresse email</div>\n <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Connexion avec email</div>\n </div>\n </Button>\n {/* Phone */}\n <Button variant=\"outline\" onClick={() => setStep('phone-input')} style={methodBtnStyle}>\n <div style={methodIconStyle(C.accent)}>\n <IconPhone style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 500, color: C.gray900 }}>\n Numéro de téléphone <span style={{ color: C.gray500 }}>(Sénégal)</span>\n </div>\n <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Connexion avec code SMS</div>\n </div>\n </Button>\n {/* Access OTP */}\n <Button variant=\"outline\" onClick={() => setStep('access-otp')} style={methodBtnStyle}>\n <div style={methodIconStyle(C.primary)}>\n <IconKeyRound style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 500, color: C.gray900 }}>Accès OTP</div>\n <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Disponible sur le backoffice IAM</div>\n </div>\n </Button>\n\n {/* Forgot password */}\n <div style={{ textAlign: 'center', fontSize: '0.875rem', paddingTop: '0.5rem' }}>\n <span style={{ color: C.gray500 }}>Mot de passe oublié ? </span>\n <button type=\"button\" style={linkStyle} onClick={() => setShowPasswordRecovery(true)}>Récupérer</button>\n </div>\n\n {/* Separator */}\n <div style={{ position: 'relative', padding: '0.5rem 0' }}>\n <div style={{ position: 'absolute', inset: 0, display: 'flex', alignItems: 'center' }}>\n <span style={{ width: '100%', borderTop: `1px solid ${C.gray200}` }} />\n </div>\n </div>\n\n {/* Signup link */}\n {showSwitchToSignup && (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* ===== EMAIL CHECK ===== */}\n {step === 'email-check' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconMail style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Connexion par email</DialogTitle>\n <DialogDescription>Entrez votre adresse email</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label htmlFor=\"email\">Adresse email</Label>\n <Input id=\"email\" type=\"email\" placeholder=\"vous@exemple.com\" value={email}\n onChange={e => setEmail(e.target.value)} disabled={isSubmitting}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); handleEmailCheck(); } }}\n />\n </div>\n <div style={{ textAlign: 'right' }}>\n <button type=\"button\" style={{ ...linkStyle, fontSize: '0.75rem' }} onClick={() => setShowPasswordRecovery(true)}>\n Mot de passe oublié ?\n </button>\n </div>\n {renderLoaderBtn('Continuer', 'Vérification...', handleEmailCheck, !email.trim())}\n {showSwitchToSignup && (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* ===== EMAIL PASSWORD ===== */}\n {step === 'email-password' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconLock style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n {userName && <DialogTitle>Bonjour {userName} 👋</DialogTitle>}\n <DialogDescription>{email}</DialogDescription>\n </DialogHeader>\n <form onSubmit={handleEmailPasswordSubmit} style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <Label htmlFor=\"password\">Mot de passe</Label>\n <button type=\"button\" style={{ ...linkStyle, fontSize: '0.75rem' }} onClick={() => setShowPasswordRecovery(true)}>\n Mot de passe oublié ?\n </button>\n </div>\n <div style={{ position: 'relative' }}>\n <Input id=\"password\" type={showPassword ? 'text' : 'password'} placeholder=\"••••••••\" value={password}\n onChange={e => setPassword(e.target.value)} disabled={isSubmitting}\n style={{ paddingRight: '2.5rem' }}\n />\n <button type=\"button\" onClick={() => setShowPassword(!showPassword)}\n style={{ position: 'absolute', right: 0, top: 0, height: '100%', padding: '0 0.75rem', background: 'none', border: 'none', cursor: 'pointer' }}>\n {showPassword ? (\n <IconEyeOff style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n ) : (\n <IconEye style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n )}\n </button>\n </div>\n </div>\n <Button type=\"submit\" disabled={isSubmitting || !password} style={{ width: '100%' }}>\n {isSubmitting ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n Connexion...\n </span>\n ) : 'Se connecter'}\n </Button>\n </form>\n </>\n )}\n\n {/* ===== EMAIL OTP ===== */}\n {step === 'email-otp' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Vérification</DialogTitle>\n <DialogDescription>\n Un code de vérification a été envoyé à<br />\n <strong style={{ color: C.gray900 }}>{email}</strong>\n </DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <OTPInput value={emailOtpCode} onChange={setEmailOtpCode} disabled={isSubmitting} />\n {renderResendLink()}\n {renderLoaderBtn('Vérifier', 'Vérification...', handleEmailOtpVerify, emailOtpCode.length !== 6)}\n </div>\n </>\n )}\n\n {/* ===== PHONE INPUT ===== */}\n {step === 'phone-input' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconPhone style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Connexion par téléphone</DialogTitle>\n <DialogDescription>Entrez votre numéro pour recevoir un code SMS</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label>Indicatif</Label>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', padding: '0.75rem', backgroundColor: C.gray100, borderRadius: '0.375rem' }}>\n <span style={{ fontSize: '1.125rem' }}>🇸🇳</span>\n <span style={{ fontWeight: 500, color: C.gray900 }}>Sénégal (+221)</span>\n </div>\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label htmlFor=\"login-phone\">Numéro de téléphone</Label>\n <Input id=\"login-phone\" type=\"tel\" placeholder=\"77 123 45 67\" value={phone}\n onChange={e => { const val = e.target.value.replace(/\\D/g, '').slice(0, 9); setPhone(val); }}\n disabled={isSubmitting} maxLength={9}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); handlePhoneInit(); } }}\n />\n <p style={{ fontSize: '0.75rem', color: C.gray500 }}>9 chiffres requis ({phone.replace(/\\D/g, '').length}/9)</p>\n </div>\n {renderLoaderBtn('Recevoir le code SMS', 'Envoi en cours...', handlePhoneInit, phone.replace(/\\D/g, '').length !== 9)}\n {showSwitchToSignup && (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* ===== PHONE OTP ===== */}\n {step === 'phone-otp' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconPhone style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Vérification</DialogTitle>\n <DialogDescription>\n Un code a été envoyé au{' '}\n <strong style={{ color: C.gray900 }}>+221 {phone.slice(0, 2)}***{phone.slice(-2)}</strong>\n </DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <OTPInput value={phoneOtpCode} onChange={setPhoneOtpCode} disabled={isSubmitting} />\n {renderResendLink()}\n {renderLoaderBtn('Se connecter', 'Vérification...', handlePhoneVerify, phoneOtpCode.length !== 6)}\n </div>\n </>\n )}\n\n {/* ===== ACCESS OTP ===== */}\n {step === 'access-otp' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary)}>\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Code d'accès</DialogTitle>\n <DialogDescription>Entrez le code d'accès à 8 chiffres</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label>Code d'accès (8 chiffres)</Label>\n <Input type=\"text\" inputMode=\"numeric\" placeholder=\"0000-0000\" value={accessOtpCode}\n onChange={e => setAccessOtpCode(e.target.value.replace(/\\D/g, '').slice(0, 8))}\n disabled={isSubmitting}\n style={{ textAlign: 'center', fontSize: '1.5rem', letterSpacing: '0.15em', fontFamily: 'monospace' }}\n maxLength={8}\n />\n </div>\n {renderLoaderBtn('Se connecter', 'Vérification...', handleAccessOtpSubmit, accessOtpCode.length !== 8)}\n </div>\n </>\n )}\n </>\n )}\n </DialogContent>\n </Dialog>\n\n <PasswordRecoveryModal\n open={showPasswordRecovery}\n onOpenChange={setShowPasswordRecovery}\n onSuccess={() => setShowPasswordRecovery(false)}\n saasApiUrl={saasApiUrl}\n iamApiUrl={iamApiUrl}\n \n />\n </>\n );\n}\n\nexport default LoginModal;\n","/**\n * Phone Input component for @ollaid/native-sso\n */\n\nimport React from 'react';\n\ninterface PhoneInputProps {\n value: string;\n onChange: (value: string) => void;\n ccphone?: string;\n onCcphoneChange?: (value: string) => void;\n disabled?: boolean;\n error?: string;\n placeholder?: string;\n lockCcphone?: boolean;\n}\n\nconst SUPPORTED_COUNTRIES = [\n { code: '+221', name: 'Sénégal', flag: '🇸🇳', digits: 9 },\n { code: '+229', name: 'Bénin', flag: '🇧🇯', digits: 8 },\n { code: '+225', name: \"Côte d'Ivoire\", flag: '🇨🇮', digits: 10 },\n { code: '+228', name: 'Togo', flag: '🇹🇬', digits: 8 },\n { code: '+237', name: 'Cameroun', flag: '🇨🇲', digits: 9 },\n { code: '+33', name: 'France', flag: '🇫🇷', digits: 9 },\n];\n\nexport function PhoneInput({\n value, onChange, ccphone = '+221', onCcphoneChange, disabled = false, error, placeholder = '77 123 45 67', lockCcphone = false,\n}: PhoneInputProps) {\n const selectedCountry = SUPPORTED_COUNTRIES.find(c => c.code === ccphone) || SUPPORTED_COUNTRIES[0];\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const cleaned = e.target.value.replace(/\\D/g, '');\n onChange(cleaned.slice(0, selectedCountry.digits));\n };\n\n const formatPhone = (phone: string): string => {\n if (phone.length <= 2) return phone;\n if (phone.length <= 5) return `${phone.slice(0, 2)} ${phone.slice(2)}`;\n if (phone.length <= 7) return `${phone.slice(0, 2)} ${phone.slice(2, 5)} ${phone.slice(5)}`;\n return `${phone.slice(0, 2)} ${phone.slice(2, 5)} ${phone.slice(5, 7)} ${phone.slice(7)}`;\n };\n\n return (\n <div>\n <div style={{\n display: 'flex', alignItems: 'center', border: `2px solid ${error ? '#ef4444' : '#d1d5db'}`,\n borderRadius: '0.5rem', overflow: 'hidden', opacity: disabled ? 0.5 : 1,\n backgroundColor: disabled ? '#f3f4f6' : 'white',\n }}>\n {onCcphoneChange && !lockCcphone ? (\n <select\n value={ccphone}\n onChange={(e) => onCcphoneChange(e.target.value)}\n disabled={disabled}\n style={{ padding: '0.75rem', backgroundColor: '#f9fafb', borderRight: '1px solid #e5e7eb', fontWeight: 500, color: '#374151', outline: 'none', border: 'none' }}\n >\n {SUPPORTED_COUNTRIES.map((c) => (\n <option key={c.code} value={c.code}>{c.flag} {c.code}</option>\n ))}\n </select>\n ) : (\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', padding: '0.75rem', backgroundColor: '#f9fafb', borderRight: '1px solid #e5e7eb' }}>\n <span style={{ fontSize: '1.125rem' }}>{selectedCountry.flag}</span>\n <span style={{ fontWeight: 500, color: '#374151' }}>{selectedCountry.code}</span>\n </div>\n )}\n <input\n type=\"tel\"\n inputMode=\"numeric\"\n value={formatPhone(value)}\n onChange={handleChange}\n disabled={disabled}\n placeholder={placeholder}\n style={{ flex: 1, padding: '0.75rem', fontSize: '1.125rem', border: 'none', outline: 'none', backgroundColor: 'transparent' }}\n />\n </div>\n {error && <p style={{ fontSize: '0.875rem', color: '#ef4444', marginTop: '0.25rem' }}>{error}</p>}\n <p style={{ fontSize: '0.75rem', color: '#6b7280', marginTop: '0.25rem' }}>\n {selectedCountry.digits} chiffres requis ({value.length}/{selectedCountry.digits})\n </p>\n </div>\n );\n}\n\nexport default PhoneInput;\n","/**\n * Apps Logo Slider for @ollaid/native-sso\n */\n\nimport { useEffect, useRef, useState } from 'react';\nimport { getNativeAuthConfig } from '../services/api';\n\ninterface AppsLogoSliderProps {\n speed?: 'slow' | 'normal' | 'fast';\n className?: string;\n}\n\ninterface AppInfo { id: number; name: string; logo: string | null; }\n\nexport function AppsLogoSlider({ speed = 'normal', className = '' }: AppsLogoSliderProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [isPaused, setIsPaused] = useState(false);\n const [applications, setApplications] = useState<AppInfo[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n const speedMap = { slow: 50, normal: 30, fast: 15 };\n\n useEffect(() => {\n const fetchApps = async () => {\n try {\n const config = getNativeAuthConfig();\n const iamBaseUrl = config.iamApiUrl.replace('/api', '');\n const response = await fetch(`${iamBaseUrl}/api/public/applications`, { headers: { 'Accept': 'application/json' } });\n if (response.ok) {\n const data = await response.json();\n if (data.success && Array.isArray(data.data)) setApplications(data.data);\n }\n } catch { /* ignore */ } finally { setIsLoading(false); }\n };\n fetchApps();\n }, []);\n\n useEffect(() => {\n const container = scrollRef.current;\n if (!container || applications.length === 0) return;\n let pos = 0;\n const id = setInterval(() => {\n if (!isPaused && container) {\n pos += 1;\n if (pos >= container.scrollWidth / 2) pos = 0;\n container.scrollLeft = pos;\n }\n }, speedMap[speed]);\n return () => clearInterval(id);\n }, [isPaused, speed, applications.length]);\n\n const getLogoUrl = (logo: string | null): string | null => {\n if (!logo) return null;\n if (logo.startsWith('http')) return logo;\n const config = getNativeAuthConfig();\n return `${config.iamApiUrl.replace('/api', '')}/storage/applications/${logo}`;\n };\n\n if (isLoading) {\n return (\n <div className={className} style={{ overflow: 'hidden' }}>\n <div style={{ display: 'flex', gap: '1rem', padding: '0.5rem 0' }}>\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} style={{ flexShrink: 0, display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '0.5rem' }}>\n <div style={{ width: '3rem', height: '3rem', borderRadius: '0.75rem', backgroundColor: '#e5e7eb' }} />\n <div style={{ width: '2.5rem', height: '0.75rem', borderRadius: '0.25rem', backgroundColor: '#e5e7eb' }} />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n if (applications.length === 0) return null;\n\n const displayApps = [...applications, ...applications];\n\n return (\n <div\n className={className}\n style={{ position: 'relative', overflow: 'hidden' }}\n onMouseEnter={() => setIsPaused(true)}\n onMouseLeave={() => setIsPaused(false)}\n >\n <div ref={scrollRef} style={{ display: 'flex', gap: '1rem', overflow: 'hidden', padding: '0.5rem 0' }}>\n {displayApps.map((app, index) => {\n const logoUrl = getLogoUrl(app.logo);\n return (\n <div key={`${app.id}-${index}`} style={{ flexShrink: 0, display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '0.5rem' }}>\n <div style={{ width: '3rem', height: '3rem', borderRadius: '0.75rem', display: 'flex', alignItems: 'center', justifyContent: 'center', boxShadow: '0 1px 3px rgba(0,0,0,0.1)', backgroundColor: 'white', border: '1px solid #f3f4f6' }}>\n {logoUrl ? (\n <img src={logoUrl} alt={app.name} style={{ width: '2.5rem', height: '2.5rem', objectFit: 'contain', borderRadius: '0.5rem' }} />\n ) : (\n <span style={{ fontWeight: 700, fontSize: '1.125rem', color: 'hsl(var(--primary, 222 47% 11%))' }}>\n {app.name.charAt(0).toUpperCase()}\n </span>\n )}\n </div>\n <span style={{ fontSize: '0.75rem', color: '#6b7280', fontWeight: 500 }}>{app.name}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport default AppsLogoSlider;\n","/**\n * Service d'inscription Mobile SSO v1.0\n * Architecture Frontend-First : Appels directs à l'IAM via nativeAuth\n * \n * @version 1.0.0\n */\n\nimport { nativeAuthService } from './nativeAuth';\nimport { \n ApiError, \n fetchWithTimeout, \n getHeaders,\n getNativeAuthConfig, \n isDebugMode,\n} from './api';\n\nimport type {\n MobileRegistrationFormData,\n MobileVerifyOtpResponse,\n MobileRegistrationCompleteResponse,\n MobileResendOtpResponse,\n} from '../types/mobile';\nimport type { NativeInitResponse } from '../types/native';\n\nexport const mobileRegistrationService = {\n /**\n * Init registration via nativeAuth.register() (Frontend-First)\n */\n async init(\n data: Omit<MobileRegistrationFormData, 'password' | 'password_confirmation'>\n ): Promise<NativeInitResponse> {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n\n return nativeAuthService.register({\n name: data.name,\n email: data.email,\n ccphone: data.ccphone,\n phone: data.phone,\n town: data.town,\n country: data.country,\n registration_type: data.registration_type,\n });\n },\n\n /**\n * Verify OTP via nativeAuth.validate()\n */\n async verifyOtp(\n processToken: string,\n otpCode: string\n ): Promise<MobileVerifyOtpResponse> {\n const config = getNativeAuthConfig();\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate (registration OTP)');\n }\n\n return fetchWithTimeout<MobileVerifyOtpResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n otp_code: otpCode,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Complete registration with password\n */\n async complete(\n processToken: string,\n password: string\n ): Promise<MobileRegistrationCompleteResponse> {\n const config = getNativeAuthConfig();\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate (registration complete)');\n }\n\n return fetchWithTimeout<MobileRegistrationCompleteResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n password,\n password_confirmation: password,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Complete phone-only registration (no password)\n */\n async completePhoneOnly(\n processToken: string\n ): Promise<MobileRegistrationCompleteResponse> {\n const config = getNativeAuthConfig();\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate (phone-only complete)');\n }\n\n return fetchWithTimeout<MobileRegistrationCompleteResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Resend OTP\n */\n async resendOtp(processToken: string): Promise<MobileResendOtpResponse> {\n return nativeAuthService.resendOtp(processToken) as unknown as MobileResendOtpResponse;\n },\n};\n\nexport default mobileRegistrationService;\n","/**\n * Hook d'inscription Mobile SSO v1.0\n * Gère le flow: init → verify-otp → complete\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { mobileRegistrationService } from '../services/mobileRegistration';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { setNativeAuthConfig } from '../services/api';\nimport type { \n MobileRegistrationFormData,\n AccountType,\n} from '../types/mobile';\n\ninterface RegistrationConflict {\n type: 'email' | 'phone';\n masked_identifier: string;\n options: {\n can_login: boolean;\n can_recover_by_email: boolean;\n can_recover_by_sms: boolean;\n masked_email?: string;\n masked_phone?: string;\n };\n}\n\ninterface RegistrationState {\n processToken: string | null;\n status: 'idle' | 'pending_otp' | 'pending_password' | 'pending_registration' | 'completed';\n loading: boolean;\n error: string | null;\n conflict: RegistrationConflict | null;\n}\n\nfunction getErrorMessage(err: unknown, context: string): string {\n if (err instanceof Error) {\n if (err.message.includes('fetch') || err.message.includes('network')) {\n return 'Vérifiez votre connexion Internet';\n }\n if (err.message.includes('timeout')) {\n return 'Le serveur met trop de temps à répondre';\n }\n return err.message;\n }\n return `Erreur lors de ${context}`;\n}\n\nexport interface UseMobileRegistrationOptions {\n saasApiUrl: string;\n iamApiUrl: string;\n \n}\n\nexport function useMobileRegistration(options?: UseMobileRegistrationOptions) {\n const configuredRef = useRef(false);\n\n useEffect(() => {\n if (options && !configuredRef.current) {\n setNativeAuthConfig({ \n saasApiUrl: options.saasApiUrl, \n iamApiUrl: options.iamApiUrl,\n });\n configuredRef.current = true;\n }\n }, [options]);\n\n const [state, setState] = useState<RegistrationState>({\n processToken: null,\n status: 'idle',\n loading: false,\n error: null,\n conflict: null,\n });\n\n const [formData, setFormData] = useState<Partial<MobileRegistrationFormData>>({});\n const [accountType, setAccountType] = useState<AccountType>('email');\n\n const updateFormData = useCallback((data: Partial<MobileRegistrationFormData>) => {\n setFormData(prev => ({ ...prev, ...data }));\n }, []);\n\n const initRegistration = useCallback(async (\n data: Omit<MobileRegistrationFormData, 'password' | 'password_confirmation'>\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, conflict: null }));\n \n const enrichedData = {\n ...data,\n email: accountType === 'phone-only' ? '' : data.email,\n registration_type: accountType === 'phone-only' ? 'phone' as const : 'email' as const,\n };\n \n setFormData(enrichedData);\n\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n\n const response = await mobileRegistrationService.init(enrichedData);\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: 'pending_otp',\n loading: false,\n conflict: null,\n }));\n return { \n success: true, \n otp_code_dev: response.otp_code_dev,\n otp_method: response.otp_method,\n otp_sent_to: response.otp_sent_to,\n };\n }\n\n if (response.conflict) {\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Ce compte existe déjà',\n conflict: response.conflict!,\n }));\n return { success: false, error_type: response.error_type };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de l\\'inscription',\n conflict: null,\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'l\\'inscription');\n setState(prev => ({ ...prev, loading: false, error: message, conflict: null }));\n return { success: false };\n }\n }, [accountType]);\n\n const verifyOtp = useCallback(async (otpCode: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.verifyOtp(state.processToken, otpCode);\n\n if (response.success) {\n if (response.status === 'completed' && response.callback_token) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true, completed: true, callback_token: response.callback_token };\n }\n\n setState(prev => ({ ...prev, status: 'pending_password', loading: false }));\n return { success: true, completed: false };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code incorrect',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'la vérification');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const completeRegistration = useCallback(async (password: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.complete(state.processToken, password);\n\n if (response.success && response.callback_token) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true, callback_token: response.callback_token };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de la finalisation',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'la finalisation');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const completePhoneOnlyRegistration = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.completePhoneOnly(state.processToken);\n\n if (response.success && response.callback_token) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true, callback_token: response.callback_token };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de la finalisation',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'la finalisation');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const resendOtp = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.resendOtp(state.processToken);\n setState(prev => ({ ...prev, loading: false }));\n return { \n success: response.success, \n cooldown: response.cooldown_remaining,\n otp_code_dev: response.otp_code_dev,\n };\n } catch (err) {\n const message = getErrorMessage(err, 'le renvoi');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const reset = useCallback(() => {\n setState({\n processToken: null,\n status: 'idle',\n loading: false,\n error: null,\n conflict: null,\n });\n setFormData({});\n setAccountType('email');\n }, []);\n\n const clearError = useCallback(() => {\n setState(prev => ({ ...prev, error: null, conflict: null }));\n }, []);\n\n return {\n processToken: state.processToken,\n status: state.status,\n formData,\n loading: state.loading,\n error: state.error,\n conflict: state.conflict,\n isCompleted: state.status === 'completed',\n hasConflict: state.conflict !== null,\n \n accountType,\n setAccountType,\n isPhoneOnly: accountType === 'phone-only',\n\n updateFormData,\n initRegistration,\n verifyOtp,\n completeRegistration,\n completePhoneOnlyRegistration,\n resendOtp,\n reset,\n clearError,\n };\n}\n\nexport default useMobileRegistration;\n","/**\n * Signup Modal for @ollaid/native-sso — Design aligned with web SSO\n * Full signup flow: intro → account-type → info → OTP → password → confirm → success\n * \n * @version 1.0.0\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription,\n Button, Input, Label,\n IconShieldCheck, IconCheckCircle2, IconMail, IconSmartphone, IconArrowLeft,\n IconKeyRound, IconLock, IconLoader2,\n IconHome, IconCalendar, IconBell, IconMessageCircle, IconUsers, IconSettings,\n} from './ui';\nimport PhoneInput from './PhoneInput';\nimport OTPInput from './OTPInput';\nimport AppsLogoSlider from './AppsLogoSlider';\nimport { useMobileRegistration } from '../hooks/useMobileRegistration';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport type { UserInfos } from '../types/native';\n\ntype SignupStep = 'intro' | 'account-type' | 'info' | 'otp' | 'password' | 'confirm';\n\nexport interface SignupModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSwitchToLogin: () => void;\n onSignupSuccess: (token: string, user: UserInfos) => void;\n saasApiUrl: string;\n iamApiUrl: string;\n /** Type de compte par défaut à persister dans localStorage */\n defaultAccountType?: 'user' | 'client';\n}\n\nconst C = {\n primary: '#002147',\n accent: '#e8430a',\n green: '#16a34a',\n greenBg: '#dcfce7',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n gray900: '#111827',\n red: '#dc2626',\n redBg: '#fef2f2',\n amber: '#f59e0b',\n amberBg: '#fef3c7',\n white: '#ffffff',\n} as const;\n\nconst iconCircle = (bg: string, size = '3rem'): React.CSSProperties => ({\n margin: '0 auto', width: size, height: size, backgroundColor: bg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst backBtnStyle: React.CSSProperties = {\n position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nconst linkStyle: React.CSSProperties = {\n color: C.primary, cursor: 'pointer', background: 'none', border: 'none',\n fontWeight: 500, textDecoration: 'underline', fontSize: '0.875rem',\n};\n\nconst TOTAL_STEPS = 6;\n\nfunction StepIndicator({ current }: { current: number }) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginTop: '0.75rem' }}>\n {Array.from({ length: TOTAL_STEPS }, (_, i) => (\n <div key={i} style={{\n width: i + 1 === current ? '1.5rem' : '0.5rem',\n height: '0.5rem',\n borderRadius: '9999px',\n backgroundColor: i + 1 <= current ? C.accent : C.gray200,\n transition: 'all 0.2s',\n }} />\n ))}\n <span style={{ fontSize: '0.75rem', color: C.gray500, marginLeft: '0.5rem' }}>Étape {current}/{TOTAL_STEPS}</span>\n </div>\n );\n}\n\n// Orbit success animation\nfunction SuccessOrbit() {\n const orbitIcons = [IconHome, IconCalendar, IconBell, IconMessageCircle, IconUsers, IconSettings];\n return (\n <div style={{ position: 'relative', width: '10rem', height: '10rem', margin: '0 auto' }}>\n {/* Center shield */}\n <div style={{\n position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)',\n width: '4rem', height: '4rem', backgroundColor: C.greenBg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 2,\n }}>\n <IconShieldCheck style={{ width: '2rem', height: '2rem', color: C.green }} />\n </div>\n {/* Orbiting icons */}\n {orbitIcons.map((Icon, i) => {\n const angle = (i * 360) / orbitIcons.length;\n return (\n <div key={i} style={{\n position: 'absolute', top: '50%', left: '50%', width: '2rem', height: '2rem',\n transform: `rotate(${angle}deg) translate(4rem) rotate(-${angle}deg)`,\n transformOrigin: '0 0',\n animation: `spin ${8 + i}s linear infinite`,\n }}>\n <div style={{\n width: '2rem', height: '2rem', backgroundColor: C.gray100, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n }}>\n <Icon style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function SignupModal({ open, onOpenChange, onSwitchToLogin, onSignupSuccess, saasApiUrl, iamApiUrl, defaultAccountType }: SignupModalProps) {\n const {\n status, formData, loading: regLoading, error: regError, accountType, setAccountType, isPhoneOnly,\n updateFormData, initRegistration, verifyOtp, completeRegistration, resendOtp, reset: resetReg, clearError,\n } = useMobileRegistration({ saasApiUrl, iamApiUrl });\n\n const [step, setStep] = useState<SignupStep>('intro');\n const [otpCode, setOtpCode] = useState('');\n const [password, setPassword] = useState('');\n const [passwordConfirm, setPasswordConfirm] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [resendCooldown, setResendCooldown] = useState(0);\n const [signupSuccess, setSignupSuccess] = useState(false);\n const [signupData, setSignupData] = useState<{ token: string; user: UserInfos } | null>(null);\n\n const error = localError || regError;\n\n useEffect(() => { if (!open) { setStep('intro'); setOtpCode(''); setPassword(''); setPasswordConfirm(''); setLocalError(null); setSignupSuccess(false); setSignupData(null); setResendCooldown(0); resetReg(); } }, [open]);\n useEffect(() => { if (status === 'pending_otp') { setStep('otp'); setResendCooldown(60); } else if (status === 'pending_password') setStep('password'); }, [status]);\n useEffect(() => { if (resendCooldown > 0) { const t = setTimeout(() => setResendCooldown(r => r - 1), 1000); return () => clearTimeout(t); } }, [resendCooldown]);\n useEffect(() => { if (signupSuccess && signupData) { const t = setTimeout(() => onSignupSuccess(signupData.token, signupData.user), 2000); return () => clearTimeout(t); } }, [signupSuccess, signupData]);\n\n const exchangeCallbackToken = async (callbackToken: string) => {\n try {\n const response = await nativeAuthService.exchange(callbackToken);\n if (response.success && response.token) {\n setSignupData({ token: response.token, user: response.user as UserInfos });\n setSignupSuccess(true);\n } else setLocalError(\"Erreur lors de la finalisation de l'inscription\");\n } catch { setLocalError('Erreur de connexion au serveur'); }\n };\n\n const handleInfoSubmit = async (e: React.FormEvent) => {\n e.preventDefault(); setLocalError(null); clearError();\n if (!formData.name?.trim()) { setLocalError('Le nom est requis'); return; }\n if (!isPhoneOnly && !formData.email?.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n if (!formData.phone?.trim() || (formData.phone?.length || 0) < 6) { setLocalError('Numéro de téléphone invalide'); return; }\n if (isPhoneOnly && formData.ccphone !== '+221') { setLocalError(\"L'inscription par téléphone est réservée aux numéros sénégalais (+221)\"); return; }\n if (!formData.town?.trim()) { setLocalError('La ville est requise'); return; }\n if (!formData.country?.trim()) { setLocalError('Le pays est requis'); return; }\n await initRegistration({ name: formData.name || '', email: formData.email || '', ccphone: formData.ccphone || '+221', phone: formData.phone || '', town: formData.town, country: formData.country } as any);\n };\n\n const handleOTPSubmit = async () => {\n if (otpCode.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n setLocalError(null); clearError();\n const result = await verifyOtp(otpCode);\n if (result.success && result.completed && result.callback_token) await exchangeCallbackToken(result.callback_token);\n };\n\n const handlePasswordSubmit = (e: React.FormEvent) => {\n e.preventDefault(); setLocalError(null);\n if (!password || password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n if (password !== passwordConfirm) { setLocalError('Les mots de passe ne correspondent pas'); return; }\n setStep('confirm');\n };\n\n const handleConfirm = async () => {\n setLocalError(null); clearError();\n const result = await completeRegistration(password);\n if (result.success && result.callback_token) await exchangeCallbackToken(result.callback_token);\n };\n\n const handleResendOTP = async () => { if (resendCooldown > 0) return; const r = await resendOtp(); if (r.success) setResendCooldown(r.cooldown || 60); };\n\n const goToStep = (s: SignupStep) => { setLocalError(null); clearError(); setStep(s); };\n\n const handleAccountTypeSelect = (type: 'email' | 'phone-only') => {\n setAccountType(type);\n if (type === 'phone-only') updateFormData({ ccphone: '+221', country: 'Sénégal', email: '' });\n goToStep('info');\n };\n\n const stepNumber = { intro: 1, 'account-type': 2, info: 3, otp: 4, password: 5, confirm: 6 }[step];\n\n const renderError = () => error ? <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg, color: C.red, fontSize: '0.875rem' }}>{error}</div> : null;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n\n {/* ===================== SUCCESS ===================== */}\n {signupSuccess && signupData ? (\n <DialogHeader style={{ textAlign: 'center' }}>\n <SuccessOrbit />\n <DialogTitle>Félicitations !</DialogTitle>\n <DialogDescription>\n Votre compte a été créé avec succès. Bienvenue {formData.name} !\n </DialogDescription>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', fontSize: '0.875rem', color: C.gray500, marginTop: '1rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n Connexion automatique en cours...\n </div>\n </DialogHeader>\n ) : (\n <>\n {/* ===== INTRO ===== */}\n {step === 'intro' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent + '1a', '4rem')}>\n <IconShieldCheck style={{ width: '2rem', height: '2rem', color: C.accent }} />\n </div>\n <DialogTitle>Ouvrez un compte Ollaid</DialogTitle>\n <DialogDescription>Un compte unique qui vous donne accès à toutes les applications</DialogDescription>\n </DialogHeader>\n <AppsLogoSlider />\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', fontSize: '0.875rem', color: C.gray500, margin: '1rem 0' }}>\n {['Un seul compte pour toutes les applications', 'Plus besoin de multiples mots de passe', 'Connexion simplifiée et sécurisée'].map(text => (\n <div key={text} style={{ display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <IconCheckCircle2 style={{ width: '1.25rem', height: '1.25rem', color: C.green, flexShrink: 0 }} />\n {text}\n </div>\n ))}\n </div>\n <StepIndicator current={1} />\n <Button onClick={() => goToStep('account-type')} style={{ width: '100%', marginTop: '1rem' }}>Suivant →</Button>\n <div style={{ textAlign: 'center', fontSize: '0.875rem', marginTop: '1rem' }}>\n <span style={{ color: C.gray500 }}>Déjà un compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToLogin}>Connectez-vous</button>\n </div>\n </>\n )}\n\n {/* ===== ACCOUNT TYPE ===== */}\n {step === 'account-type' && (\n <>\n <button onClick={() => goToStep('intro')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.gray100)}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Choisissez votre type de compte</DialogTitle>\n </DialogHeader>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', marginTop: '1rem' }}>\n <button type=\"button\" onClick={() => handleAccountTypeSelect('email')}\n style={{ width: '100%', padding: '1rem', border: `2px solid ${C.gray200}`, borderRadius: '0.5rem', textAlign: 'left', cursor: 'pointer', background: C.white, display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <div style={{ width: '2.5rem', height: '2.5rem', backgroundColor: C.accent, borderRadius: '0.5rem', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\n <IconMail style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 600, color: C.gray900 }}>Email + Téléphone</div>\n <div style={{ fontSize: '0.875rem', color: C.gray500 }}>Compte complet</div>\n </div>\n </button>\n <button type=\"button\" onClick={() => handleAccountTypeSelect('phone-only')}\n style={{ width: '100%', padding: '1rem', border: `2px solid ${C.gray200}`, borderRadius: '0.5rem', textAlign: 'left', cursor: 'pointer', background: C.white, display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <div style={{ width: '2.5rem', height: '2.5rem', backgroundColor: C.accent, borderRadius: '0.5rem', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\n <IconSmartphone style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 600, color: C.gray900 }}>Téléphone uniquement</div>\n <div style={{ fontSize: '0.875rem', color: C.gray500 }}>🇸🇳 Sénégal uniquement</div>\n </div>\n </button>\n </div>\n <StepIndicator current={2} />\n </>\n )}\n\n {/* ===== INFO ===== */}\n {step === 'info' && (\n <>\n <button onClick={() => goToStep('account-type')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary + '1a')}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Créer votre compte</DialogTitle>\n </DialogHeader>\n {isPhoneOnly && (\n <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.accent + '1a', color: C.accent, fontSize: '0.8125rem', marginTop: '0.5rem', textAlign: 'center' }}>\n 📱 Inscription par téléphone — 🇸🇳 Sénégal uniquement\n </div>\n )}\n {!isPhoneOnly && (\n <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.amberBg, color: '#92400e', fontSize: '0.8125rem', marginTop: '0.5rem', textAlign: 'center' }}>\n ⚠️ Un code OTP sera envoyé par email pour vérification\n </div>\n )}\n <form onSubmit={handleInfoSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', marginTop: '0.75rem' }}>\n {renderError()}\n <div><Label>Nom complet</Label><Input placeholder=\"Jean Dupont\" value={formData.name || ''} onChange={e => updateFormData({ name: e.target.value })} disabled={regLoading} /></div>\n {!isPhoneOnly && <div><Label>Adresse email</Label><Input type=\"email\" placeholder=\"vous@exemple.com\" value={formData.email || ''} onChange={e => updateFormData({ email: e.target.value })} disabled={regLoading} /></div>}\n <div><Label>Numéro de téléphone</Label><PhoneInput value={formData.phone || ''} onChange={p => updateFormData({ phone: p })} ccphone={formData.ccphone || '+221'} onCcphoneChange={c => updateFormData({ ccphone: c })} disabled={regLoading} lockCcphone={isPhoneOnly} /></div>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '0.75rem' }}>\n <div><Label>Ville</Label><Input placeholder=\"Dakar\" value={formData.town || ''} onChange={e => updateFormData({ town: e.target.value })} disabled={regLoading} /></div>\n <div><Label>Pays</Label><Input placeholder=\"Sénégal\" value={formData.country || ''} onChange={e => updateFormData({ country: e.target.value })} disabled={regLoading || isPhoneOnly} /></div>\n </div>\n <StepIndicator current={3} />\n <Button type=\"submit\" disabled={regLoading} style={{ width: '100%' }}>\n {regLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n </span>\n ) : 'Continuer'}\n </Button>\n </form>\n </>\n )}\n\n {/* ===== OTP ===== */}\n {step === 'otp' && (\n <>\n <button onClick={() => goToStep('info')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Vérification</DialogTitle>\n <DialogDescription>Entrez le code envoyé {isPhoneOnly ? `au ${formData.ccphone} ${formData.phone}` : `à ${formData.email}`}</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <OTPInput value={otpCode} onChange={setOtpCode} disabled={regLoading} />\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n {resendCooldown > 0 ? <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span> : <button type=\"button\" onClick={handleResendOTP} style={linkStyle}>Code non reçu ? Renvoyer</button>}\n </div>\n <StepIndicator current={4} />\n <Button onClick={handleOTPSubmit} disabled={regLoading || otpCode.length !== 6} style={{ width: '100%' }}>\n {regLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n </span>\n ) : 'Vérifier'}\n </Button>\n </div>\n </>\n )}\n\n {/* ===== PASSWORD ===== */}\n {step === 'password' && (\n <>\n <button onClick={() => goToStep('otp')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconLock style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Créer un mot de passe</DialogTitle>\n </DialogHeader>\n <form onSubmit={handlePasswordSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', marginTop: '0.75rem' }}>\n {renderError()}\n <div><Label>Mot de passe</Label><Input type=\"password\" placeholder=\"Minimum 8 caractères\" value={password} onChange={e => setPassword(e.target.value)} disabled={regLoading} /></div>\n <div><Label>Confirmer le mot de passe</Label><Input type=\"password\" placeholder=\"••••••••\" value={passwordConfirm} onChange={e => setPasswordConfirm(e.target.value)} disabled={regLoading} /></div>\n <StepIndicator current={5} />\n <Button type=\"submit\" disabled={regLoading} style={{ width: '100%' }}>Continuer</Button>\n </form>\n </>\n )}\n\n {/* ===== CONFIRM ===== */}\n {step === 'confirm' && (\n <>\n <button onClick={() => goToStep('password')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary + '1a')}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Confirmer votre inscription</DialogTitle>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {renderError()}\n <div style={{ backgroundColor: C.gray100, borderRadius: '0.5rem', padding: '1rem' }}>\n {[['Nom', formData.name], ...(!isPhoneOnly ? [['Email', formData.email]] : []), ['Téléphone', `${formData.ccphone} ${formData.phone}`], ['Ville', formData.town], ['Pays', formData.country]].map(([label, value]) => (\n <div key={label as string} style={{ display: 'flex', justifyContent: 'space-between', padding: '0.375rem 0' }}>\n <span style={{ fontSize: '0.875rem', color: C.gray500 }}>{label}</span>\n <span style={{ fontSize: '0.875rem', fontWeight: 500 }}>{value as string}</span>\n </div>\n ))}\n </div>\n <StepIndicator current={6} />\n <Button onClick={handleConfirm} disabled={regLoading} style={{ width: '100%' }}>\n {regLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Création du compte...\n </span>\n ) : 'Créer mon compte'}\n </Button>\n </div>\n </>\n )}\n </>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default SignupModal;\n","/**\n * OnboardingModal — Post-login modal for missing profile info\n * Asks for photo + phone if not present in user_infos\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback } from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Button, Label } from './ui';\nimport { PhoneInput } from './PhoneInput';\nimport type { NativeUser } from '../types/native';\n\n// Design tokens matching package modals\nconst C = {\n primary: '#002147',\n accent: '#e8430a',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n white: '#ffffff',\n} as const;\n\nexport interface OnboardingModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n user: NativeUser;\n /** Called with updated data when user submits */\n onComplete: (data: { image_url?: string; ccphone?: string; phone?: string; email?: string }) => void;\n /** Called when user skips onboarding */\n onSkip: () => void;\n}\n\nexport function OnboardingModal({ open, onOpenChange, user, onComplete, onSkip }: OnboardingModalProps) {\n const needsPhoto = !user.image_url;\n const needsPhone = !user.phone;\n const needsEmail = !user.email;\n\n const [photoPreview, setPhotoPreview] = useState<string>('');\n const [photoFile, setPhotoFile] = useState<File | null>(null);\n const [ccphone, setCcphone] = useState(user.ccphone || '+221');\n const [phone, setPhone] = useState(user.phone || '');\n const [email, setEmail] = useState('');\n const [confirmed, setConfirmed] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n\n const [fileError, setFileError] = useState('');\n\n const handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Validation taille max 2 Mo\n if (file.size > 2 * 1024 * 1024) {\n setFileError('Le fichier dépasse 2 Mo. Veuillez choisir une image plus légère.');\n e.target.value = '';\n return;\n }\n setFileError('');\n setPhotoFile(file);\n const reader = new FileReader();\n reader.onload = () => setPhotoPreview(reader.result as string);\n reader.readAsDataURL(file);\n }, []);\n\n const canSubmit = confirmed && (\n (needsPhoto ? !!photoPreview : true) &&\n (needsPhone ? phone.length >= 7 : true)\n );\n\n const handleSubmit = useCallback(() => {\n if (!canSubmit) return;\n setSubmitting(true);\n \n const data: { image_url?: string; ccphone?: string; phone?: string; email?: string } = {};\n if (needsPhoto && photoPreview) {\n data.image_url = photoPreview;\n }\n if (needsPhone && phone) {\n data.ccphone = ccphone;\n data.phone = phone;\n }\n if (needsEmail && email.trim()) {\n data.email = email.trim();\n }\n \n onComplete(data);\n }, [canSubmit, needsPhoto, needsPhone, needsEmail, photoPreview, ccphone, phone, email, onComplete]);\n\n // Shield check icon inline\n const ShieldIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={C.accent} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', marginBottom: '0.25rem' }}>\n <ShieldIcon />\n <DialogTitle>Complétez votre profil</DialogTitle>\n </div>\n <DialogDescription>\n Ajoutez les informations manquantes pour finaliser votre compte.\n </DialogDescription>\n </DialogHeader>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1.25rem', marginTop: '1rem' }}>\n {/* Photo upload */}\n {needsPhoto && (\n <div>\n <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n Photo de profil\n </Label>\n <div style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>\n {/* Preview circle */}\n <div style={{\n width: '4rem',\n height: '4rem',\n borderRadius: '50%',\n backgroundColor: C.gray100,\n border: `2px dashed ${C.gray200}`,\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}>\n {photoPreview ? (\n <img src={photoPreview} alt=\"Preview\" style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n ) : (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={C.gray500} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"8\" r=\"4\" />\n <path d=\"M5.5 21a8.38 8.38 0 0 1 13 0\" />\n </svg>\n )}\n </div>\n {/* File input */}\n <div style={{ flex: 1 }}>\n <label style={{\n display: 'inline-block',\n padding: '0.5rem 1rem',\n backgroundColor: C.gray100,\n border: `1px solid ${C.gray200}`,\n borderRadius: '0.375rem',\n cursor: 'pointer',\n fontSize: '0.875rem',\n color: C.gray700,\n fontWeight: 500,\n }}>\n Choisir une photo\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileChange}\n style={{ display: 'none' }}\n />\n </label>\n <p style={{ fontSize: '0.75rem', color: fileError ? '#dc2626' : C.gray500, marginTop: '0.25rem' }}>\n {fileError || 'JPG, PNG. Max 2 Mo.'}\n </p>\n </div>\n </div>\n </div>\n )}\n\n {/* Phone input */}\n {needsPhone && (\n <div>\n <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n Numéro de téléphone\n </Label>\n <PhoneInput\n value={phone}\n onChange={setPhone}\n ccphone={ccphone}\n onCcphoneChange={setCcphone}\n />\n </div>\n )}\n\n {/* Email input — optional, not blocking */}\n {needsEmail && (\n <div>\n <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n Adresse email <span style={{ color: C.gray500, fontWeight: 400 }}>(optionnel)</span>\n </Label>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"email@exemple.com\"\n style={{\n width: '100%',\n height: '2.5rem',\n padding: '0 0.75rem',\n border: `1px solid ${C.gray200}`,\n borderRadius: '0.375rem',\n fontSize: '0.875rem',\n color: C.gray700,\n backgroundColor: C.white,\n outline: 'none',\n }}\n />\n </div>\n )}\n\n {/* Confirmation checkbox */}\n <label style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '0.5rem',\n cursor: 'pointer',\n fontSize: '0.875rem',\n color: C.gray700,\n }}>\n <input\n type=\"checkbox\"\n checked={confirmed}\n onChange={(e) => setConfirmed(e.target.checked)}\n style={{\n width: '1rem',\n height: '1rem',\n marginTop: '0.125rem',\n accentColor: C.primary,\n cursor: 'pointer',\n }}\n />\n <span>Je confirme que ces informations sont exactes</span>\n </label>\n\n {/* Actions */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n <Button\n onClick={handleSubmit}\n disabled={!canSubmit || submitting}\n style={{ width: '100%', height: '2.75rem', opacity: canSubmit && !submitting ? 1 : 0.5 }}\n >\n {submitting ? 'Enregistrement...' : 'Valider'}\n </Button>\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={submitting}\n style={{ width: '100%', height: '2.75rem' }}\n >\n Passer pour l'instant\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default OnboardingModal;\n","/**\n * DebugPanel — Panneau de debug flottant pour @ollaid/native-sso\n * Affiche l'historique des appels API en temps réel (style terminal)\n * N'apparaît que quand debug=true\n * @version 1.0.0\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { subscribeToLogs, clearApiLogs, exportLogsAsText, type ApiCallLog } from '../services/debugLogger';\n\ninterface DebugPanelProps {\n saasApiUrl: string;\n iamApiUrl: string;\n}\n\nexport function DebugPanel({ saasApiUrl, iamApiUrl }: DebugPanelProps) {\n const [logs, setLogs] = useState<ApiCallLog[]>([]);\n const [expanded, setExpanded] = useState(true);\n const [selectedLog, setSelectedLog] = useState<string | null>(null);\n\n useEffect(() => {\n return subscribeToLogs(setLogs);\n }, []);\n\n const handleCopy = useCallback(() => {\n const text = exportLogsAsText();\n navigator.clipboard?.writeText(text).catch(() => {});\n }, []);\n\n const handleClear = useCallback(() => {\n clearApiLogs();\n setSelectedLog(null);\n }, []);\n\n const statusColor = (status: number | null) => {\n if (status === null) return '#f59e0b';\n if (status >= 200 && status < 300) return '#22c55e';\n return '#ef4444';\n };\n\n const statusEmoji = (status: number | null) => {\n if (status === null) return '⏳';\n if (status >= 200 && status < 300) return '✅';\n return '❌';\n };\n\n const selected = selectedLog ? logs.find(l => l.id === selectedLog) : null;\n\n return (\n <div style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n zIndex: 99999,\n fontFamily: 'monospace',\n fontSize: '12px',\n }}>\n {/* Header bar */}\n <div\n onClick={() => setExpanded(!expanded)}\n style={{\n background: '#1a1a2e',\n color: '#e2e8f0',\n padding: '6px 12px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n borderTop: '2px solid #6366f1',\n }}\n >\n <span>🔐 Debug SSO — {logs.length} appel{logs.length > 1 ? 's' : ''}</span>\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n {expanded && (\n <>\n <button onClick={(e) => { e.stopPropagation(); handleCopy(); }}\n style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: 'pointer', fontSize: '11px' }}>\n 📋 Copier\n </button>\n <button onClick={(e) => { e.stopPropagation(); handleClear(); }}\n style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: 'pointer', fontSize: '11px' }}>\n 🗑️ Effacer\n </button>\n </>\n )}\n <span>{expanded ? '▼' : '▲'}</span>\n </div>\n </div>\n\n {/* Body */}\n {expanded && (\n <div style={{\n background: '#0f0f23',\n color: '#e2e8f0',\n maxHeight: '300px',\n overflowY: 'auto',\n }}>\n {/* Config bar */}\n <div style={{ padding: '4px 12px', background: '#1e1e3f', fontSize: '10px', color: '#94a3b8', display: 'flex', gap: '16px' }}>\n <span>SaaS: <span style={{ color: '#6366f1' }}>{saasApiUrl}</span></span>\n <span>IAM: <span style={{ color: '#6366f1' }}>{iamApiUrl}</span></span>\n </div>\n\n {logs.length === 0 ? (\n <div style={{ padding: '20px', textAlign: 'center', color: '#64748b' }}>\n Aucun appel API. Tentez une connexion pour voir les logs.\n </div>\n ) : (\n <div>\n {logs.map(log => (\n <div key={log.id}>\n <div\n onClick={() => setSelectedLog(selectedLog === log.id ? null : log.id)}\n style={{\n padding: '4px 12px',\n borderBottom: '1px solid #1e293b',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n background: selectedLog === log.id ? '#1e293b' : 'transparent',\n }}\n >\n <span>{statusEmoji(log.responseStatus)}</span>\n <span style={{\n background: log.method === 'GET' ? '#22c55e' : '#3b82f6',\n color: '#fff',\n padding: '0 4px',\n borderRadius: '2px',\n fontSize: '10px',\n fontWeight: 'bold',\n }}>{log.method}</span>\n <span style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {log.endpoint}\n </span>\n <span style={{ color: statusColor(log.responseStatus), minWidth: '30px' }}>\n {log.responseStatus ?? '...'}\n </span>\n <span style={{ color: '#64748b', minWidth: '50px', textAlign: 'right' }}>\n {log.duration ? `${log.duration}ms` : '...'}\n </span>\n </div>\n\n {/* Detail view */}\n {selectedLog === log.id && selected && (\n <div style={{ padding: '8px 12px 8px 32px', background: '#111827', borderBottom: '1px solid #1e293b' }}>\n <div style={{ color: '#94a3b8', marginBottom: '4px' }}>\n ⏰ {new Date(log.timestamp).toLocaleTimeString()}\n </div>\n {log.requestBody ? (\n <div style={{ marginBottom: '4px' }}>\n <div style={{ color: '#6366f1', fontSize: '10px' }}>REQUEST:</div>\n <pre style={{ color: '#cbd5e1', whiteSpace: 'pre-wrap', wordBreak: 'break-all', margin: 0, maxHeight: '80px', overflow: 'auto' }}>\n {JSON.stringify(log.requestBody, null, 2)}\n </pre>\n </div>\n ) : null}\n {log.responseBody ? (\n <div>\n <div style={{ color: '#6366f1', fontSize: '10px' }}>RESPONSE:</div>\n <pre style={{ color: '#cbd5e1', whiteSpace: 'pre-wrap', wordBreak: 'break-all', margin: 0, maxHeight: '120px', overflow: 'auto' }}>\n {JSON.stringify(log.responseBody, null, 2)}\n </pre>\n </div>\n ) : null}\n {log.error && (\n <div style={{ color: '#ef4444', marginTop: '4px' }}>⚠️ {log.error}</div>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default DebugPanel;\n","/**\n * NativeSSOPage — Page autonome complète pour @ollaid/native-sso\n * Design aligné sur /sso/auth (fond primary, card blanche, ShieldCheck branding)\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport { LoginModal } from './LoginModal';\nimport { SignupModal } from './SignupModal';\nimport { OnboardingModal } from './OnboardingModal';\nimport AppsLogoSlider from './AppsLogoSlider';\nimport { DebugPanel } from './DebugPanel';\nimport { Button } from './ui';\nimport { STORAGE_KEYS, isDebugMode } from '../services/api';\nimport type { UserInfos, NativeUser } from '../types/native';\n\nexport interface NativeSSOPageProps {\n /** URL du Backend SaaS */\n saasApiUrl: string;\n /** URL du Backend IAM */\n iamApiUrl: string;\n /** Callback après login/signup réussi — reçoit le token et l'utilisateur */\n onLoginSuccess?: (token: string, user: UserInfos) => void;\n /** Callback après logout */\n onLogout?: () => void;\n /** Callback quand l'utilisateur complète l'onboarding (photo/phone) */\n onOnboardingComplete?: (data: { image_url?: string; ccphone?: string; phone?: string }) => void;\n /** Type de compte à persister dans localStorage (défaut: 'user') */\n accountType?: 'user' | 'client';\n /** Titre personnalisé */\n title?: string;\n /** Description personnalisée */\n description?: string;\n /** Logo URL personnalisé */\n logoUrl?: string;\n /** Masquer le footer \"Propulsé par\" */\n hideFooter?: boolean;\n}\n\ntype ModalState = 'none' | 'login' | 'signup';\n\n// Design tokens matching /sso/auth\nconst COLORS = {\n primary: '#002147',\n primaryForeground: '#ffffff',\n accent: '#e8430a',\n card: '#ffffff',\n cardForeground: '#1a2332',\n muted: '#6b7280',\n border: '#e5e7eb',\n shadow: '0 10px 25px -5px rgba(0,0,0,0.2)',\n} as const;\n\n// Light mode CSS variables to force on mount\nconst LIGHT_VARS: Record<string, string> = {\n \"--background\": \"40 20% 96%\",\n \"--foreground\": \"220 15% 15%\",\n \"--card\": \"0 0% 100%\",\n \"--card-foreground\": \"220 15% 15%\",\n \"--popover\": \"0 0% 100%\",\n \"--popover-foreground\": \"220 15% 15%\",\n \"--primary\": \"209 100% 13%\",\n \"--primary-foreground\": \"0 0% 100%\",\n \"--secondary\": \"40 15% 92%\",\n \"--secondary-foreground\": \"220 15% 25%\",\n \"--muted\": \"40 10% 90%\",\n \"--muted-foreground\": \"220 10% 50%\",\n \"--accent\": \"16 99% 52%\",\n \"--accent-foreground\": \"0 0% 100%\",\n \"--destructive\": \"0 84.2% 60.2%\",\n \"--destructive-foreground\": \"210 40% 98%\",\n \"--border\": \"40 15% 88%\",\n \"--input\": \"40 15% 88%\",\n \"--ring\": \"209 100% 13%\",\n};\n\n// Shield check SVG inline (no lucide dependency needed)\nconst ShieldCheckIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={COLORS.accent} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n);\n\n/** Check if user needs onboarding (missing photo or phone) */\nfunction needsOnboarding(user: NativeUser | UserInfos): boolean {\n return !user.image_url || !user.phone;\n}\n\nexport function NativeSSOPage({\n saasApiUrl,\n iamApiUrl,\n onLoginSuccess,\n onLogout,\n onOnboardingComplete,\n accountType = 'user',\n title = 'Un compte, plusieurs accès',\n description = 'Connectez-vous avec votre compte Ollaid pour accéder à toutes les applications partenaires.',\n logoUrl,\n hideFooter = false,\n}: NativeSSOPageProps) {\n const [modal, setModal] = useState<ModalState>('none');\n const [showOnboarding, setShowOnboarding] = useState(false);\n const [pendingSession, setPendingSession] = useState<{ token: string; user: NativeUser } | null>(null);\n const [session, setSession] = useState<{ token: string; user: NativeUser } | null>(() => {\n try {\n const token = localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN);\n const userStr = localStorage.getItem(STORAGE_KEYS.USER);\n if (token && userStr) return { token, user: JSON.parse(userStr) };\n } catch {}\n return null;\n });\n\n // Debug: contrôlé uniquement par le backend via /native/config\n const resolvedDebug = isDebugMode();\n\n // Force light mode CSS variables (same pattern as /sso/auth)\n useEffect(() => {\n const root = document.documentElement;\n const originalValues: Record<string, string> = {};\n \n Object.keys(LIGHT_VARS).forEach((key) => {\n originalValues[key] = root.style.getPropertyValue(key);\n });\n Object.entries(LIGHT_VARS).forEach(([key, value]) => {\n root.style.setProperty(key, value);\n });\n root.classList.add('light');\n root.classList.remove('dark');\n root.style.colorScheme = 'light';\n\n // Empêcher le navigateur d'appliquer son dark mode natif (scrollbars, formulaires, etc.)\n const meta = document.createElement('meta');\n meta.name = 'color-scheme';\n meta.content = 'light';\n document.head.appendChild(meta);\n\n return () => {\n Object.entries(originalValues).forEach(([key, value]) => {\n if (value) root.style.setProperty(key, value);\n else root.style.removeProperty(key);\n });\n root.classList.remove('light');\n root.style.colorScheme = '';\n meta.remove();\n };\n }, []);\n\n const openLogin = useCallback(() => setModal('login'), []);\n const openSignup = useCallback(() => setModal('signup'), []);\n const closeModal = useCallback(() => setModal('none'), []);\n\n const switchToSignup = useCallback(() => {\n setModal('none');\n setTimeout(() => setModal('signup'), 150);\n }, []);\n\n const switchToLogin = useCallback(() => {\n setModal('none');\n setTimeout(() => setModal('login'), 150);\n }, []);\n\n const handleLoginSuccess = useCallback((token: string, user: UserInfos) => {\n // Build NativeUser-compatible object from UserInfos\n const userObj: NativeUser = {\n reference: '',\n name: user.name,\n email: user.email || undefined,\n phone: user.phone,\n ccphone: user.ccphone,\n image_url: user.image_url,\n account_type: (user as any).account_type || 'user',\n };\n \n setModal('none');\n \n // Check if onboarding needed\n if (needsOnboarding(userObj)) {\n setPendingSession({ token, user: userObj });\n setShowOnboarding(true);\n } else {\n setSession({ token, user: userObj });\n onLoginSuccess?.(token, user);\n }\n }, [onLoginSuccess]);\n\n const handleOnboardingComplete = useCallback((data: { image_url?: string; ccphone?: string; phone?: string }) => {\n if (!pendingSession) return;\n \n // Merge onboarding data into user\n const updatedUser = { ...pendingSession.user, ...data };\n \n // Update localStorage\n localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(updatedUser));\n \n setShowOnboarding(false);\n setSession({ token: pendingSession.token, user: updatedUser });\n setPendingSession(null);\n \n onOnboardingComplete?.(data);\n onLoginSuccess?.(pendingSession.token, updatedUser as unknown as UserInfos);\n }, [pendingSession, onLoginSuccess, onOnboardingComplete]);\n\n const handleOnboardingSkip = useCallback(() => {\n if (!pendingSession) return;\n \n setShowOnboarding(false);\n setSession(pendingSession);\n setPendingSession(null);\n \n onLoginSuccess?.(pendingSession.token, pendingSession.user as unknown as UserInfos);\n }, [pendingSession, onLoginSuccess]);\n\n const handleLogout = useCallback(() => {\n localStorage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.TOKEN);\n localStorage.removeItem(STORAGE_KEYS.USER);\n localStorage.removeItem(STORAGE_KEYS.ACCOUNT_TYPE);\n localStorage.removeItem(STORAGE_KEYS.ALIAS_REFERENCE);\n setSession(null);\n onLogout?.();\n }, [onLogout]);\n\n // Shared styles\n const containerStyle: React.CSSProperties = {\n minHeight: '100vh',\n backgroundColor: COLORS.primary,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '1rem',\n };\n\n const cardStyle: React.CSSProperties = {\n width: '100%',\n maxWidth: '28rem',\n backgroundColor: COLORS.card,\n border: `1px solid ${COLORS.border}`,\n borderRadius: '0.75rem',\n boxShadow: COLORS.shadow,\n overflow: 'hidden',\n };\n\n const footerStyle: React.CSSProperties = {\n marginTop: '1.5rem',\n fontSize: '0.75rem',\n color: 'rgba(255,255,255,0.6)',\n textAlign: 'center' as const,\n };\n\n // Branding header (ShieldCheck + iam.ollaid.com) — inside card\n const BrandingHeader = () => (\n <div style={{ textAlign: 'center', marginBottom: '1.5rem' }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginBottom: '0.5rem' }}>\n <ShieldCheckIcon />\n <span style={{ fontSize: '1.125rem', fontWeight: 700, color: COLORS.primary }}>\n iam.<span style={{ color: COLORS.accent }}>ollaid</span>.com\n </span>\n </div>\n </div>\n );\n\n // Authenticated view\n if (session) {\n return (\n <div style={containerStyle}>\n {/* Apps slider */}\n <div style={{ width: '100%', maxWidth: '28rem', marginBottom: '1.5rem' }}>\n <AppsLogoSlider />\n </div>\n\n <div style={cardStyle}>\n <div style={{ padding: '2rem 1.5rem 1.5rem' }}>\n <BrandingHeader />\n <h2 style={{ fontSize: '1.25rem', fontWeight: 600, textAlign: 'center', color: COLORS.cardForeground }}>\n Bienvenue, {session.user.name}\n </h2>\n <p style={{ fontSize: '0.875rem', color: COLORS.muted, textAlign: 'center', marginTop: '0.25rem' }}>\n Vous êtes connecté à votre compte Ollaid SSO\n </p>\n <div style={{ marginTop: '1.5rem' }}>\n <Button variant=\"outline\" onClick={handleLogout} style={{ width: '100%' }}>\n Déconnexion\n </Button>\n </div>\n </div>\n </div>\n\n {!hideFooter && (\n <p style={footerStyle}>\n Géré par{' '}\n <a href=\"https://iam.ollaid.com\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: COLORS.accent, textDecoration: 'none' }}>\n iam.ollaid.com\n </a>\n {' '}— Identity Access Manager\n </p>\n )}\n </div>\n );\n }\n\n // Unauthenticated view\n return (\n <div style={containerStyle}>\n {/* Apps slider BEFORE card */}\n <div style={{ width: '100%', maxWidth: '28rem', marginBottom: '1.5rem' }}>\n {logoUrl ? (\n <img src={logoUrl} alt=\"Logo\" style={{ height: '3rem', margin: '0 auto' }} />\n ) : (\n <AppsLogoSlider />\n )}\n </div>\n\n {/* Main card */}\n <div style={cardStyle}>\n <div style={{ padding: '2rem 1.5rem 1.5rem' }}>\n <BrandingHeader />\n\n <h2 style={{ fontSize: '1.25rem', fontWeight: 600, textAlign: 'center', color: COLORS.cardForeground, marginBottom: '0.5rem' }}>\n {title}\n </h2>\n <p style={{ fontSize: '0.875rem', color: COLORS.muted, textAlign: 'center', marginBottom: '1.5rem' }}>\n {description}\n </p>\n\n {/* Action buttons */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <Button onClick={openLogin} style={{ width: '100%', height: '2.75rem' }}>\n Connexion\n </Button>\n <Button\n variant=\"outline\"\n onClick={openSignup}\n style={{\n width: '100%',\n height: '2.75rem',\n borderColor: COLORS.cardForeground,\n color: COLORS.cardForeground,\n }}\n >\n Inscription\n </Button>\n </div>\n </div>\n </div>\n\n {/* Footer */}\n {!hideFooter && (\n <p style={footerStyle}>\n Géré par{' '}\n <a href=\"https://iam.ollaid.com\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: COLORS.accent, textDecoration: 'none' }}>\n iam.ollaid.com\n </a>\n {' '}— Identity Access Manager\n </p>\n )}\n\n <LoginModal\n open={modal === 'login'}\n onOpenChange={open => { if (!open) closeModal(); }}\n onSwitchToSignup={switchToSignup}\n onLoginSuccess={handleLoginSuccess}\n saasApiUrl={saasApiUrl}\n iamApiUrl={iamApiUrl}\n defaultAccountType={accountType}\n />\n\n <SignupModal\n open={modal === 'signup'}\n onOpenChange={open => { if (!open) closeModal(); }}\n onSwitchToLogin={switchToLogin}\n onSignupSuccess={handleLoginSuccess}\n saasApiUrl={saasApiUrl}\n iamApiUrl={iamApiUrl}\n defaultAccountType={accountType}\n />\n\n {/* Onboarding modal for missing profile info */}\n {pendingSession && (\n <OnboardingModal\n open={showOnboarding}\n onOpenChange={(open) => { if (!open) handleOnboardingSkip(); }}\n user={pendingSession.user}\n onComplete={handleOnboardingComplete}\n onSkip={handleOnboardingSkip}\n />\n )}\n\n {resolvedDebug && <DebugPanel saasApiUrl={saasApiUrl} iamApiUrl={iamApiUrl} />}\n </div>\n );\n}\n\nexport default NativeSSOPage;\n","/**\n * NativeSSOProvider — React Context pour @ollaid/native-sso\n * Centralise la configuration pour les hooks et composants individuels\n * \n * @version 1.0.0\n */\n\nimport { createContext, useContext, useEffect, useRef, type ReactNode } from 'react';\nimport { setNativeAuthConfig, type NativeAuthConfig } from './services/api';\n\nexport interface NativeSSOConfig {\n /** URL du Backend SaaS (ex: https://mon-saas.com/api) */\n saasApiUrl: string;\n /** URL du Backend IAM (ex: https://identityam.ollaid.com/api) */\n iamApiUrl: string;\n /** Timeout en ms (défaut: 30000) */\n timeout?: number;\n /** Mode debug (logs console) */\n debug?: boolean;\n}\n\nconst NativeSSOContext = createContext<NativeSSOConfig | null>(null);\n\nexport interface NativeSSOProviderProps {\n config: NativeSSOConfig;\n children: ReactNode;\n}\n\n/**\n * Provider React pour centraliser la config SSO.\n * \n * Usage :\n * ```tsx\n * <NativeSSOProvider config={{ saasApiUrl: '...', iamApiUrl: '...' }}>\n * <App />\n * </NativeSSOProvider>\n * ```\n */\nexport function NativeSSOProvider({ config, children }: NativeSSOProviderProps) {\n const configuredRef = useRef(false);\n\n useEffect(() => {\n if (!configuredRef.current) {\n setNativeAuthConfig(config);\n configuredRef.current = true;\n }\n }, [config]);\n\n return (\n <NativeSSOContext.Provider value={config}>\n {children}\n </NativeSSOContext.Provider>\n );\n}\n\n/**\n * Hook pour accéder à la config SSO depuis le Provider.\n * Optionnel : les hooks acceptent aussi la config en paramètre.\n */\nexport function useNativeSSOConfig(): NativeSSOConfig {\n const ctx = useContext(NativeSSOContext);\n if (!ctx) {\n throw new Error('useNativeSSOConfig doit être utilisé dans un <NativeSSOProvider>');\n }\n return ctx;\n}\n\nexport default NativeSSOProvider;\n","/**\n * Service IAM Account — APIs server-to-server\n * link-phone, link-email, refresh-user-info, update-avatar, reset-avatar\n * \n * ⚠️ ATTENTION — SERVER-TO-SERVER UNIQUEMENT\n * Ces APIs utilisent la `secret_key` de votre application IAM.\n * Elles doivent être appelées EXCLUSIVEMENT depuis un backend (Node.js, PHP, etc.).\n * Ne JAMAIS appeler ces méthodes depuis du code frontend/navigateur car la\n * secret_key serait exposée dans les DevTools réseau.\n * \n * @version 1.0.0\n */\n\nimport { fetchWithTimeout, getHeaders, getNativeAuthConfig } from './api';\nimport { nativeAuthService } from './nativeAuth';\n\nimport type {\n LinkPhoneRequest,\n LinkPhoneResponse,\n LinkEmailRequest,\n LinkEmailResponse,\n RefreshUserInfoSingleRequest,\n RefreshUserInfoSingleResponse,\n RefreshUserInfoBulkRequest,\n RefreshUserInfoBulkResponse,\n UpdateAvatarRequest,\n UpdateAvatarResponse,\n ResetAvatarRequest,\n ResetAvatarResponse,\n} from '../types/native';\n\n// ============================================\n// Helper — auto-fill credentials if available\n// ============================================\n\nfunction getCredentialsOrThrow(params: { app_key?: string; secret_key?: string }) {\n const app_key = params.app_key;\n const secret_key = params.secret_key;\n\n if (!app_key || !secret_key) {\n throw new Error('app_key et secret_key sont requis en paramètre. Ces APIs sont server-to-server et ne peuvent pas utiliser les encrypted_credentials.');\n }\n\n return { app_key, secret_key };\n}\n\n// ============================================\n// Service\n// ============================================\n\nexport const iamAccountService = {\n\n /**\n * Lier un numéro de téléphone à un compte utilisateur existant\n * POST {iamApiUrl}/iam/link-phone\n */\n async linkPhone(params: Partial<Pick<LinkPhoneRequest, 'app_key' | 'secret_key'>> & Omit<LinkPhoneRequest, 'app_key' | 'secret_key'>): Promise<LinkPhoneResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<LinkPhoneResponse>(\n `${config.iamApiUrl}/iam/link-phone`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n iam_reference: params.iam_reference,\n ccphone: params.ccphone,\n phone: params.phone,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Lier une adresse email à un compte utilisateur existant\n * POST {iamApiUrl}/iam/link-email\n */\n async linkEmail(params: Partial<Pick<LinkEmailRequest, 'app_key' | 'secret_key'>> & Omit<LinkEmailRequest, 'app_key' | 'secret_key'>): Promise<LinkEmailResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<LinkEmailResponse>(\n `${config.iamApiUrl}/iam/link-email`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n iam_reference: params.iam_reference,\n email: params.email,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Récupérer les user_infos d'un utilisateur (mode single)\n * POST {iamApiUrl}/iam/refresh-user-info\n */\n async refreshUserInfo(params: Partial<Pick<RefreshUserInfoSingleRequest, 'secret_key'>> & Omit<RefreshUserInfoSingleRequest, 'secret_key'>): Promise<RefreshUserInfoSingleResponse> {\n const config = getNativeAuthConfig();\n \n const secret_key = params.secret_key;\n\n if (!secret_key) {\n throw new Error('secret_key est requis. Chargez les credentials ou passez-la en paramètre.');\n }\n\n return fetchWithTimeout<RefreshUserInfoSingleResponse>(\n `${config.iamApiUrl}/iam/refresh-user-info`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n secret_key,\n alias_reference: params.alias_reference,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Récupérer les user_infos en bulk (max 100 alias_references)\n * POST {iamApiUrl}/iam/refresh-user-info\n */\n async refreshUserInfoBulk(params: Partial<Pick<RefreshUserInfoBulkRequest, 'secret_key'>> & Omit<RefreshUserInfoBulkRequest, 'secret_key'>): Promise<RefreshUserInfoBulkResponse> {\n const config = getNativeAuthConfig();\n \n const secret_key = params.secret_key;\n\n if (!secret_key) {\n throw new Error('secret_key est requis. Chargez les credentials ou passez-la en paramètre.');\n }\n\n if (params.alias_references.length > 100) {\n throw new Error('Maximum 100 alias_references par requête bulk.');\n }\n\n return fetchWithTimeout<RefreshUserInfoBulkResponse>(\n `${config.iamApiUrl}/iam/refresh-user-info`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n secret_key,\n alias_references: params.alias_references,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Mettre à jour l'avatar d'un utilisateur pour une application spécifique\n * POST {iamApiUrl}/iam/update-avatar\n */\n async updateAvatar(params: Partial<Pick<UpdateAvatarRequest, 'app_key' | 'secret_key'>> & Omit<UpdateAvatarRequest, 'app_key' | 'secret_key'>): Promise<UpdateAvatarResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<UpdateAvatarResponse>(\n `${config.iamApiUrl}/iam/update-avatar`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n alias_reference: params.alias_reference,\n avatar_url: params.avatar_url,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Réinitialiser l'avatar d'un utilisateur (remettre à null pour utiliser l'image globale)\n * POST {iamApiUrl}/iam/reset-avatar\n */\n async resetAvatar(params: Partial<Pick<ResetAvatarRequest, 'app_key' | 'secret_key'>> & Omit<ResetAvatarRequest, 'app_key' | 'secret_key'>): Promise<ResetAvatarResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<ResetAvatarResponse>(\n `${config.iamApiUrl}/iam/reset-avatar`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n alias_reference: params.alias_reference,\n }),\n },\n config.timeout || 30000\n );\n },\n};\n"],"names":["jsxs","jsx","createContext","useEffect","useContext","forwardRef","useRef","useState","config","getErrorMessage","useCallback","C","iconCircle","backBtnStyle","Fragment","STORAGE_KEYS","linkStyle"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/components/ui.tsx","../src/components/OTPInput.tsx","../src/services/debugLogger.ts","../src/services/api.ts","../src/services/nativeAuth.ts","../src/services/mobilePassword.ts","../src/hooks/useMobilePassword.ts","../src/components/PasswordRecoveryModal.tsx","../src/hooks/useTokenHealthCheck.ts","../src/hooks/useNativeAuth.ts","../src/components/LoginModal.tsx","../src/components/PhoneInput.tsx","../src/components/AppsLogoSlider.tsx","../src/services/mobileRegistration.ts","../src/hooks/useMobileRegistration.ts","../src/components/SignupModal.tsx","../src/components/OnboardingModal.tsx","../src/components/DebugPanel.tsx","../src/components/NativeSSOPage.tsx","../src/provider.tsx","../src/services/iamAccount.ts"],"sourcesContent":["/**\n * Embedded UI primitives for @ollaid/native-sso\n * Lightweight replacements for shadcn/ui components + inline SVG icons\n * No external dependencies required\n * \n * @version 1.0.0\n */\n\nimport React, { forwardRef, createContext, useContext, useEffect } from 'react';\n\n// ============================================\n// SVG Icons (inline, no lucide dependency)\n// ============================================\n\nconst iconProps = { width: '100%', height: '100%', viewBox: '0 0 24 24', fill: 'none', stroke: 'currentColor', strokeWidth: 2, strokeLinecap: 'round' as const, strokeLinejoin: 'round' as const };\n\nexport function IconShieldCheck(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n}\n\nexport function IconMail(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n );\n}\n\nexport function IconPhone(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\" />\n </svg>\n );\n}\n\nexport function IconLock(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n );\n}\n\nexport function IconKeyRound(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z\" />\n <circle cx=\"16.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport function IconArrowLeft(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"m12 19-7-7 7-7\" />\n <path d=\"M19 12H5\" />\n </svg>\n );\n}\n\nexport function IconEye(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function IconEyeOff(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n </svg>\n );\n}\n\nexport function IconCheckCircle2(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n}\n\nexport function IconLoader2(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props} style={{ animation: 'spin 1s linear infinite', ...(props.style || {}) }}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\nexport function IconAlertTriangle(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n}\n\nexport function IconSmartphone(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <rect width=\"14\" height=\"20\" x=\"5\" y=\"2\" rx=\"2\" ry=\"2\" />\n <path d=\"M12 18h.01\" />\n </svg>\n );\n}\n\nexport function IconHome(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\" />\n <path d=\"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n </svg>\n );\n}\n\nexport function IconCalendar(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M8 2v4\" /><path d=\"M16 2v4\" />\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"4\" rx=\"2\" />\n <path d=\"M3 10h18\" />\n </svg>\n );\n}\n\nexport function IconBell(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M6 8a6 6 0 0 1 12 0c0 7 3 9 3 9H3s3-2 3-9\" />\n <path d=\"M10.3 21a1.94 1.94 0 0 0 3.4 0\" />\n </svg>\n );\n}\n\nexport function IconMessageCircle(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22z\" />\n </svg>\n );\n}\n\nexport function IconUsers(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M22 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n );\n}\n\nexport function IconSettings(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nexport function IconGlobe(props: React.SVGProps<SVGSVGElement>) {\n return (\n <svg {...iconProps} {...props}>\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\" />\n <path d=\"M2 12h20\" />\n </svg>\n );\n}\n\n// ============================================\n// Dialog\n// ============================================\n\ninterface DialogContextValue {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\nconst DialogContext = createContext<DialogContextValue>({ open: false, onOpenChange: () => {} });\n\nexport function Dialog({ open, onOpenChange, children }: { open: boolean; onOpenChange: (open: boolean) => void; children: React.ReactNode }) {\n useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => { document.body.style.overflow = ''; };\n }, [open]);\n\n if (!open) return null;\n\n return (\n <DialogContext.Provider value={{ open, onOpenChange }}>\n {children}\n </DialogContext.Provider>\n );\n}\n\nexport function DialogContent({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n const { onOpenChange } = useContext(DialogContext);\n\n return (\n <div style={{ position: 'fixed', inset: 0, zIndex: 50, display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <div \n style={{ position: 'fixed', inset: 0, backgroundColor: 'rgba(0,0,0,0.5)' }}\n onClick={() => onOpenChange(false)} \n />\n <div \n className={className}\n style={{ \n position: 'relative', zIndex: 51, width: '100%', maxWidth: '28rem', \n margin: '1rem', padding: '1.5rem', borderRadius: '0.75rem',\n backgroundColor: 'white', boxShadow: '0 25px 50px -12px rgba(0,0,0,0.25)',\n maxHeight: '90vh', overflowY: 'auto',\n }}\n >\n <button\n onClick={() => onOpenChange(false)}\n style={{ position: 'absolute', right: '1rem', top: '1rem', background: 'none', border: 'none', cursor: 'pointer', fontSize: '1.25rem', color: '#9ca3af', lineHeight: 1 }}\n aria-label=\"Close\"\n >\n ✕\n </button>\n {children}\n </div>\n </div>\n );\n}\n\nexport function DialogHeader({ children, className = '', style }: { children: React.ReactNode; className?: string; style?: React.CSSProperties }) {\n return <div className={className} style={{ marginBottom: '0.5rem', ...style }}>{children}</div>;\n}\n\nexport function DialogTitle({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n return <h2 className={className} style={{ fontSize: '1.25rem', fontWeight: 600, color: '#111827' }}>{children}</h2>;\n}\n\nexport function DialogDescription({ children, className = '' }: { children: React.ReactNode; className?: string }) {\n return <p className={className} style={{ fontSize: '0.875rem', color: '#6b7280', marginTop: '0.25rem' }}>{children}</p>;\n}\n\n// ============================================\n// Button\n// ============================================\n\ninterface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'default' | 'outline' | 'ghost';\n size?: 'default' | 'sm' | 'lg';\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(({ \n variant = 'default', size = 'default', className = '', style, disabled, children, ...props \n}, ref) => {\n const baseStyle: React.CSSProperties = {\n display: 'inline-flex', alignItems: 'center', justifyContent: 'center',\n borderRadius: '0.5rem', fontWeight: 500, cursor: disabled ? 'not-allowed' : 'pointer',\n transition: 'all 0.15s', border: 'none', opacity: disabled ? 0.5 : 1,\n fontSize: size === 'sm' ? '0.875rem' : '0.9375rem',\n padding: size === 'sm' ? '0.375rem 0.75rem' : size === 'lg' ? '0.75rem 1.5rem' : '0.625rem 1rem',\n height: size === 'sm' ? '2rem' : size === 'lg' ? '3rem' : '2.5rem',\n ...(variant === 'default' ? { backgroundColor: '#002147', color: 'white' } : {}),\n ...(variant === 'outline' ? { backgroundColor: 'transparent', border: '1px solid #d1d5db', color: '#374151' } : {}),\n ...(variant === 'ghost' ? { backgroundColor: 'transparent', color: '#374151' } : {}),\n ...style,\n };\n\n return (\n <button ref={ref} className={className} style={baseStyle} disabled={disabled} {...props}>\n {children}\n </button>\n );\n});\nButton.displayName = 'Button';\n\n// ============================================\n// Input\n// ============================================\n\nexport const Input = forwardRef<HTMLInputElement, React.InputHTMLAttributes<HTMLInputElement> & { className?: string }>(\n ({ className = '', style, ...props }, ref) => {\n return (\n <input\n ref={ref}\n className={className}\n style={{\n width: '100%', padding: '0.5rem 0.75rem', borderRadius: '0.375rem',\n border: '1px solid #d1d5db', fontSize: '0.9375rem', outline: 'none',\n transition: 'border-color 0.15s', backgroundColor: '#f9fafb', color: '#111827',\n ...style,\n }}\n {...props}\n />\n );\n }\n);\nInput.displayName = 'Input';\n\n// ============================================\n// Label\n// ============================================\n\nexport const Label = forwardRef<HTMLLabelElement, React.LabelHTMLAttributes<HTMLLabelElement>>(\n ({ className = '', style, ...props }, ref) => {\n return (\n <label\n ref={ref}\n className={className}\n style={{ fontSize: '0.875rem', fontWeight: 500, color: '#374151', ...style }}\n {...props}\n />\n );\n }\n);\nLabel.displayName = 'Label';\n\n// ============================================\n// RadioGroup (simplified)\n// ============================================\n\ninterface RadioGroupProps {\n value: string;\n onValueChange: (value: string) => void;\n children: React.ReactNode;\n className?: string;\n}\n\nconst RadioGroupContext = createContext<{ value: string; onValueChange: (v: string) => void }>({ value: '', onValueChange: () => {} });\n\nexport function RadioGroup({ value, onValueChange, children, className = '' }: RadioGroupProps) {\n return (\n <RadioGroupContext.Provider value={{ value, onValueChange }}>\n <div className={className}>{children}</div>\n </RadioGroupContext.Provider>\n );\n}\n\nexport function RadioGroupItem({ value, id }: { value: string; id: string }) {\n const { value: groupValue, onValueChange } = useContext(RadioGroupContext);\n return (\n <input\n type=\"radio\"\n id={id}\n checked={groupValue === value}\n onChange={() => onValueChange(value)}\n style={{ width: '1rem', height: '1rem', accentColor: '#002147' }}\n />\n );\n}\n\n// Global keyframes for spinner\nif (typeof document !== 'undefined') {\n const styleId = 'ollaid-sso-keyframes';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = `@keyframes spin { to { transform: rotate(360deg); } }`;\n document.head.appendChild(style);\n }\n}\n","/**\n * OTP Input component for @ollaid/native-sso\n */\n\nimport { useRef, useState, useEffect, KeyboardEvent, ClipboardEvent } from 'react';\n\ninterface OTPInputProps {\n length?: 6 | 8;\n value: string;\n onChange: (value: string) => void;\n onComplete?: (value: string) => void;\n disabled?: boolean;\n autoFocus?: boolean;\n}\n\nexport function OTPInput({\n length = 6, value, onChange, onComplete, disabled = false, autoFocus = true,\n}: OTPInputProps) {\n const inputRefs = useRef<(HTMLInputElement | null)[]>([]);\n const [activeIndex, setActiveIndex] = useState(0);\n\n useEffect(() => { inputRefs.current = inputRefs.current.slice(0, length); }, [length]);\n\n useEffect(() => {\n if (autoFocus && inputRefs.current[0]) inputRefs.current[0].focus();\n }, [autoFocus]);\n\n useEffect(() => {\n if (value.length === length && onComplete) onComplete(value);\n }, [value, length, onComplete]);\n\n const handleChange = (index: number, char: string) => {\n if (disabled) return;\n const digit = char.replace(/[^0-9]/g, '');\n if (!digit) return;\n const newValue = value.split('');\n newValue[index] = digit;\n onChange(newValue.join('').slice(0, length));\n if (index < length - 1) {\n inputRefs.current[index + 1]?.focus();\n setActiveIndex(index + 1);\n }\n };\n\n const handleKeyDown = (index: number, e: KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n if (e.key === 'Backspace') {\n e.preventDefault();\n const newValue = value.split('');\n if (value[index]) {\n newValue[index] = '';\n onChange(newValue.join(''));\n } else if (index > 0) {\n newValue[index - 1] = '';\n onChange(newValue.join(''));\n inputRefs.current[index - 1]?.focus();\n setActiveIndex(index - 1);\n }\n } else if (e.key === 'ArrowLeft' && index > 0) {\n inputRefs.current[index - 1]?.focus();\n setActiveIndex(index - 1);\n } else if (e.key === 'ArrowRight' && index < length - 1) {\n inputRefs.current[index + 1]?.focus();\n setActiveIndex(index + 1);\n }\n };\n\n const handlePaste = (e: ClipboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n e.preventDefault();\n const pasted = e.clipboardData.getData('text').replace(/[^0-9]/g, '');\n if (pasted) {\n const newValue = pasted.slice(0, length);\n onChange(newValue);\n const focusIndex = Math.min(newValue.length, length - 1);\n inputRefs.current[focusIndex]?.focus();\n setActiveIndex(focusIndex);\n }\n };\n\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem' }}>\n {Array.from({ length }).map((_, index) => (\n <input\n key={index}\n ref={(el) => (inputRefs.current[index] = el)}\n type=\"text\"\n inputMode=\"numeric\"\n maxLength={1}\n value={value[index] || ''}\n onChange={(e) => handleChange(index, e.target.value)}\n onKeyDown={(e) => handleKeyDown(index, e)}\n onPaste={handlePaste}\n onFocus={() => setActiveIndex(index)}\n disabled={disabled}\n aria-label={`Digit ${index + 1}`}\n style={{\n width: '2.5rem', height: '3rem', textAlign: 'center', fontSize: '1.25rem',\n fontWeight: 600, borderRadius: '0.375rem', border: '2px solid',\n borderColor: activeIndex === index && !disabled ? 'hsl(var(--primary, 222 47% 11%))' : value[index] ? 'hsl(var(--primary, 222 47% 11%) / 0.5)' : '#d1d5db',\n backgroundColor: value[index] ? 'hsl(var(--primary, 222 47% 11%) / 0.05)' : 'white',\n outline: 'none', transition: 'all 0.2s',\n opacity: disabled ? 0.5 : 1, cursor: disabled ? 'not-allowed' : 'text',\n }}\n />\n ))}\n </div>\n );\n}\n\nexport default OTPInput;\n","/**\n * Debug Logger pour @ollaid/native-sso\n * Stocke l'historique des appels API en mémoire pour le DebugPanel\n * @version 1.0.0\n */\n\nexport interface ApiCallLog {\n id: string;\n timestamp: string;\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n endpoint: string;\n requestBody: unknown;\n requestHeaders?: Record<string, string>;\n responseStatus: number | null;\n responseBody: unknown;\n duration: number;\n error?: string;\n}\n\nconst MAX_LOGS = 50;\nlet apiLogs: ApiCallLog[] = [];\nlet listeners: ((logs: ApiCallLog[]) => void)[] = [];\n\nfunction notifyListeners() {\n listeners.forEach(fn => fn([...apiLogs]));\n}\n\nexport function logApiCall(\n method: ApiCallLog['method'],\n endpoint: string,\n requestBody: unknown,\n requestHeaders?: Record<string, string>\n): string {\n const id = `${Date.now()}-${Math.random().toString(36).substring(2, 7)}`;\n const log: ApiCallLog = {\n id,\n timestamp: new Date().toISOString(),\n method,\n endpoint,\n requestBody,\n requestHeaders,\n responseStatus: null,\n responseBody: null,\n duration: 0,\n };\n\n apiLogs.unshift(log);\n if (apiLogs.length > MAX_LOGS) {\n apiLogs = apiLogs.slice(0, MAX_LOGS);\n }\n notifyListeners();\n return id;\n}\n\nexport function logApiResponse(\n logId: string,\n responseStatus: number,\n responseBody: unknown,\n startTime: number,\n error?: string\n): void {\n const log = apiLogs.find(l => l.id === logId);\n if (log) {\n log.responseStatus = responseStatus;\n log.responseBody = responseBody;\n log.duration = Date.now() - startTime;\n log.error = error;\n notifyListeners();\n }\n}\n\nexport function getApiLogs(): ApiCallLog[] {\n return [...apiLogs];\n}\n\nexport function clearApiLogs(): void {\n apiLogs = [];\n notifyListeners();\n}\n\nexport function subscribeToLogs(callback: (logs: ApiCallLog[]) => void): () => void {\n listeners.push(callback);\n return () => {\n listeners = listeners.filter(fn => fn !== callback);\n };\n}\n\nexport function exportLogsAsText(): string {\n if (apiLogs.length === 0) return 'Aucun appel API enregistré.';\n\n const lines: string[] = [\n '='.repeat(60),\n 'NATIVE SSO DEBUG LOGS',\n `Exporté le: ${new Date().toISOString()}`,\n '='.repeat(60),\n '',\n ];\n\n apiLogs.slice().reverse().forEach((log, index) => {\n const emoji = log.responseStatus === null ? '⏳' : (log.responseStatus >= 200 && log.responseStatus < 300 ? '✅' : '❌');\n lines.push(`[${index + 1}] ${emoji} ${log.method} ${log.endpoint}`);\n lines.push(` Status: ${log.responseStatus ?? 'En cours...'} | Durée: ${log.duration}ms`);\n if (log.requestBody) lines.push(` Request: ${JSON.stringify(log.requestBody)}`);\n if (log.responseBody) lines.push(` Response: ${JSON.stringify(log.responseBody)}`);\n if (log.error) lines.push(` ⚠️ Error: ${log.error}`);\n lines.push('');\n });\n\n return lines.join('\\n');\n}\n","/**\n * Client API pour @ollaid/native-sso\n * Gestion des requêtes HTTP avec timeout, device ID, token storage\n * \n * @version 1.0.0\n */\n\nimport { logApiCall, logApiResponse } from './debugLogger';\n\n// ============================================\n// Types d'erreur\n// ============================================\n\nexport type ApiErrorType = 'network' | 'timeout' | 'server' | 'validation' | 'auth' | 'unknown';\n\nexport class ApiError extends Error {\n type: ApiErrorType;\n statusCode?: number;\n errorType?: string;\n response?: unknown;\n\n constructor(\n message: string,\n type: ApiErrorType,\n statusCode?: number,\n errorType?: string,\n response?: unknown\n ) {\n super(message);\n this.name = 'ApiError';\n this.type = type;\n this.statusCode = statusCode;\n this.errorType = errorType;\n this.response = response;\n }\n}\n\n// ============================================\n// Configuration\n// ============================================\n\nexport interface NativeAuthConfig {\n /** URL du Backend SaaS (pour config et exchange) */\n saasApiUrl: string;\n /** URL du Backend IAM (pour encrypt, init, validate, etc.) */\n iamApiUrl: string;\n /** Timeout en ms (défaut: 30000) */\n timeout?: number;\n /** Mode debug (logs console) */\n debug?: boolean;\n /** \n * Préfixe de configuration IAM côté backend (défaut: 'iam').\n * Permet le multi-tenant : chaque frontend envoie son préfixe\n * pour que le backend SaaS lise le bon bloc config/services.php.\n * Ex: 'iam', 'iam_vendor', 'iam_client', 'iam_admin'\n */\n configPrefix?: string;\n}\n\nlet config: NativeAuthConfig = {\n saasApiUrl: '',\n iamApiUrl: '',\n timeout: 30000,\n debug: false,\n configPrefix: 'iam',\n};\n\nexport const setNativeAuthConfig = (newConfig: Partial<NativeAuthConfig>): void => {\n config = { ...config, ...newConfig };\n \n if (config.debug) {\n console.log('🔐 @ollaid/native-sso Config:', {\n saasApiUrl: config.saasApiUrl,\n iamApiUrl: config.iamApiUrl,\n });\n }\n};\n\nexport const getNativeAuthConfig = (): NativeAuthConfig => ({ ...config });\n\nexport const isDebugMode = (): boolean => config.debug === true;\n\n// ============================================\n// Device ID\n// ============================================\n\nconst DEVICE_ID_KEY = 'native_sso_device_id';\n\nexport const getDeviceId = (): string => {\n if (typeof localStorage === 'undefined') return '';\n \n let deviceId = localStorage.getItem(DEVICE_ID_KEY);\n if (!deviceId) {\n deviceId = `nat_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`;\n localStorage.setItem(DEVICE_ID_KEY, deviceId);\n }\n return deviceId;\n};\n\n// ============================================\n// Token storage (clés unifiées avec Web SSO)\n// ============================================\n\nconst STORAGE = {\n AUTH_TOKEN: 'auth_token',\n TOKEN: 'token',\n USER: 'user',\n ACCOUNT_TYPE: 'account_type',\n ALIAS_REFERENCE: 'alias_reference',\n} as const;\n\nexport const setAuthToken = (token: string): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE.AUTH_TOKEN, token);\n localStorage.setItem(STORAGE.TOKEN, token);\n }\n};\n\nexport const getAuthToken = (): string | null => {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(STORAGE.AUTH_TOKEN) || localStorage.getItem(STORAGE.TOKEN);\n};\n\nexport const clearAuthToken = (): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(STORAGE.AUTH_TOKEN);\n localStorage.removeItem(STORAGE.TOKEN);\n localStorage.removeItem(STORAGE.USER);\n localStorage.removeItem(STORAGE.ACCOUNT_TYPE);\n localStorage.removeItem(STORAGE.ALIAS_REFERENCE);\n }\n};\n\nexport const setAuthUser = (user: unknown): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE.USER, JSON.stringify(user));\n }\n};\n\nexport const getAuthUser = <T>(): T | null => {\n if (typeof localStorage === 'undefined') return null;\n const user = localStorage.getItem(STORAGE.USER);\n if (!user) return null;\n try {\n return JSON.parse(user);\n } catch {\n localStorage.removeItem(STORAGE.USER);\n return null;\n }\n};\n\nexport const setAccountType = (type: string): void => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE.ACCOUNT_TYPE, type);\n }\n};\n\nexport const getAccountType = (): string | null => {\n if (typeof localStorage === 'undefined') return null;\n return localStorage.getItem(STORAGE.ACCOUNT_TYPE);\n};\n\nexport { STORAGE as STORAGE_KEYS };\n\n// ============================================\n// Fetch helper\n// ============================================\n\nexport async function fetchWithTimeout<T>(\n url: string,\n options: RequestInit,\n timeout: number\n): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const method = (options.method as 'GET' | 'POST' | 'PUT' | 'DELETE') || 'GET';\n const logId = isDebugMode() ? logApiCall(method, url, options.body ? JSON.parse(options.body as string) : undefined) : null;\n const startTime = Date.now();\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n const contentType = response.headers.get('content-type');\n if (!contentType?.includes('application/json')) {\n const text = await response.text();\n if (isDebugMode()) {\n console.error('❌ Réponse non-JSON:', text.substring(0, 500));\n if (logId) logApiResponse(logId, response.status, { raw: text.substring(0, 200) }, startTime, 'Non-JSON response');\n }\n throw new ApiError(`Erreur serveur (${response.status})`, 'server', response.status);\n }\n\n const data = await response.json();\n\n if (!response.ok) {\n if (logId) logApiResponse(logId, response.status, data, startTime, data.message);\n throw new ApiError(\n data.message || `Erreur ${response.status}`,\n response.status === 401 ? 'auth' : response.status >= 500 ? 'server' : 'validation',\n response.status,\n data.error_type,\n data\n );\n }\n\n if (logId) logApiResponse(logId, response.status, data, startTime);\n return data;\n } catch (error) {\n clearTimeout(timeoutId);\n\n if (error instanceof ApiError) throw error;\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n if (logId) logApiResponse(logId, 0, null, startTime, 'Timeout');\n throw new ApiError('Délai d\\'attente dépassé', 'timeout');\n }\n if (error instanceof TypeError) {\n if (logId) logApiResponse(logId, 0, null, startTime, 'Network error');\n throw new ApiError('Impossible de contacter le serveur', 'network');\n }\n }\n\n if (logId) logApiResponse(logId, 0, null, startTime, 'Unknown error');\n throw new ApiError('Erreur inattendue', 'unknown');\n }\n}\n\nexport function getHeaders(token?: string, includeConfigPrefix = false): HeadersInit {\n const headers: HeadersInit = {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n };\n\n const deviceId = getDeviceId();\n if (deviceId) {\n headers['X-Device-Id'] = deviceId;\n }\n\n // Multi-tenant: envoyer le préfixe de config au backend SaaS\n if (includeConfigPrefix && config.configPrefix) {\n headers['X-IAM-Config-Prefix'] = config.configPrefix;\n }\n\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n return headers;\n}\n\nexport default {\n getConfig: getNativeAuthConfig,\n setConfig: setNativeAuthConfig,\n};\n","/**\n * Service d'authentification Native Mobile SSO v1.0\n * Architecture Frontend-First : Direct IAM après encryption\n * \n * @version 1.0.0\n */\n\nimport { \n ApiError, \n fetchWithTimeout,\n getHeaders,\n getDeviceId,\n setAuthToken,\n setAuthUser,\n clearAuthToken,\n getNativeAuthConfig,\n setNativeAuthConfig,\n isDebugMode,\n} from './api';\n\nimport type {\n NativeAuthType,\n NativeEncryptRequest,\n NativeEncryptResponse,\n NativeInitResponse,\n NativeValidateResponse,\n NativeGrantAccessResponse,\n NativeResendOtpResponse,\n NativeExchangeResponse,\n NativeConfigResponse,\n NativeCredentials,\n} from '../types/native';\n\n// ============================================\n// Credentials en mémoire (jamais persistés)\n// ============================================\n\nlet credentials: NativeCredentials | null = null;\nlet credentialsLoadedAt: number = 0;\nlet credentialsTtl: number = 300; // Default 5 minutes\n\nconst DEFAULT_TTL = 300;\nconst REFRESH_MARGIN = 30; // Refresh 30s before expiration\n\n// ============================================\n// Service Native Auth\n// ============================================\n\nexport const nativeAuthService = {\n hasCredentials(): boolean {\n return credentials !== null;\n },\n\n getCredentials(): NativeCredentials | null {\n return credentials ? { ...credentials } : null;\n },\n\n getCredentialsTtl(): number {\n return credentialsTtl;\n },\n\n getCredentialsAge(): number {\n if (!credentialsLoadedAt) return Infinity;\n return (Date.now() - credentialsLoadedAt) / 1000;\n },\n\n areCredentialsExpiringSoon(): boolean {\n if (!credentials || !credentialsLoadedAt) return true;\n const age = this.getCredentialsAge();\n return age >= (credentialsTtl - REFRESH_MARGIN);\n },\n\n async ensureFreshCredentials(): Promise<void> {\n if (!credentials || this.areCredentialsExpiringSoon()) {\n if (isDebugMode()) {\n console.log('🔄 [Native] Credentials expirés ou proches — auto-refresh');\n }\n await this.loadCredentials();\n }\n },\n\n async loadCredentials(): Promise<NativeCredentials> {\n const config = getNativeAuthConfig();\n if (!config.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [SaaS] GET /native/config');\n }\n\n const response = await fetchWithTimeout<NativeConfigResponse>(\n `${config.saasApiUrl}/native/config`,\n { method: 'GET', headers: getHeaders(undefined, true) },\n config.timeout || 30000\n );\n\n if (!response.success || !response.encrypted_credentials || !response.app_key) {\n throw new ApiError('Configuration invalide reçue du SaaS (app_key ou encrypted_credentials manquant)', 'server');\n }\n\n credentials = {\n appKey: response.app_key,\n encryptedCredentials: response.encrypted_credentials,\n };\n\n credentialsLoadedAt = Date.now();\n credentialsTtl = response.credentials_ttl || DEFAULT_TTL;\n\n // Propager le debug mode depuis le backend (si défini)\n if (typeof response.debug === 'boolean') {\n const currentConfig = getNativeAuthConfig();\n if (currentConfig.debug !== true) {\n setNativeAuthConfig({ debug: response.debug });\n }\n }\n\n if (isDebugMode()) {\n console.log('✅ [SaaS] Credentials chargés (ttl:', credentialsTtl, 's, debug:', response.debug ?? 'non défini', ')');\n }\n\n return credentials;\n },\n\n async encrypt(\n type: NativeAuthType,\n data: Partial<NativeEncryptRequest>\n ): Promise<NativeEncryptResponse> {\n // Auto-refresh credentials if expiring soon\n await this.ensureFreshCredentials();\n\n if (!credentials) {\n throw new ApiError('Credentials non chargés. Appelez loadCredentials() d\\'abord.', 'auth');\n }\n\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n const payload: NativeEncryptRequest = {\n type,\n app_key: credentials.appKey,\n encrypted_credentials: credentials.encryptedCredentials,\n ...data,\n };\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/encrypt', { type, ...data });\n }\n\n const response = await fetchWithTimeout<NativeEncryptResponse>(\n `${config.iamApiUrl}/iam/native/encrypt`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify(payload),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] native_token reçu, expire dans', response.expires_in, 's');\n }\n\n return response;\n },\n\n async init(nativeToken: string): Promise<NativeInitResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/init');\n }\n\n const response = await fetchWithTimeout<NativeInitResponse>(\n `${config.iamApiUrl}/iam/native/init`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({ native_token: nativeToken }),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] Init:', { status: response.status, hasProcessToken: !!response.process_token });\n }\n\n return response;\n },\n\n async validate(\n processToken: string,\n creds: { password?: string; otp_code?: string }\n ): Promise<NativeValidateResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate');\n }\n\n const response = await fetchWithTimeout<NativeValidateResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n ...creds,\n }),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] Validate:', { \n hasCallback: !!response.callback_token, \n requires2fa: response.requires_2fa \n });\n }\n\n return response;\n },\n\n async verifyTotp(\n processToken: string,\n totpCode: string\n ): Promise<NativeValidateResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/verify-totp');\n }\n\n return fetchWithTimeout<NativeValidateResponse>(\n `${config.iamApiUrl}/iam/native/verify-totp`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n totp_code: totpCode,\n }),\n },\n config.timeout || 30000\n );\n },\n\n async grantAccess(processToken: string): Promise<NativeGrantAccessResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/grant-access');\n }\n\n return fetchWithTimeout<NativeGrantAccessResponse>(\n `${config.iamApiUrl}/iam/native/grant-access`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({ process_token: processToken }),\n },\n config.timeout || 30000\n );\n },\n\n async resendOtp(processToken: string): Promise<NativeResendOtpResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/resend-otp');\n }\n\n return fetchWithTimeout<NativeResendOtpResponse>(\n `${config.iamApiUrl}/iam/native/resend-otp`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({ process_token: processToken }),\n },\n config.timeout || 30000\n );\n },\n\n async exchange(callbackToken: string): Promise<NativeExchangeResponse> {\n const config = getNativeAuthConfig();\n if (!config.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [SaaS] POST /native/exchange');\n }\n\n const response = await fetchWithTimeout<NativeExchangeResponse>(\n `${config.saasApiUrl}/native/exchange`,\n {\n method: 'POST',\n headers: getHeaders(undefined, true),\n body: JSON.stringify({ callback_token: callbackToken }),\n },\n config.timeout || 30000\n );\n\n if (response.success && response.token) {\n setAuthToken(response.token);\n if (response.user) {\n setAuthUser(response.user);\n }\n }\n\n if (isDebugMode()) {\n console.log('✅ [SaaS] Session établie:', { user: response.user?.name });\n }\n\n return response;\n },\n\n async checkToken(token: string): Promise<{ valid: boolean; user_infos?: import('../types/native').UserInfos }> {\n const cfg = getNativeAuthConfig();\n if (!cfg.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [SaaS] POST /native/check-token');\n }\n\n try {\n const response = await fetchWithTimeout<{ success: boolean; valid: boolean; user_infos?: import('../types/native').UserInfos }>(\n `${cfg.saasApiUrl}/native/check-token`,\n {\n method: 'POST',\n headers: getHeaders(token, true),\n },\n 10000\n );\n return { valid: response.valid !== false, user_infos: response.user_infos };\n } catch (err) {\n if (err instanceof ApiError && err.statusCode === 401) {\n return { valid: false };\n }\n throw err; // Network/timeout → re-throw (caller will keep session)\n }\n },\n\n async logout(token?: string): Promise<{ success: boolean }> {\n const config = getNativeAuthConfig();\n if (!config.saasApiUrl) {\n throw new ApiError('saasApiUrl non configurée', 'unknown');\n }\n\n try {\n const response = await fetchWithTimeout<{ success: boolean }>(\n `${config.saasApiUrl}/native/logout`,\n {\n method: 'POST',\n headers: getHeaders(token, true),\n },\n config.timeout || 30000\n );\n\n clearAuthToken();\n credentials = null;\n credentialsLoadedAt = 0;\n return response;\n } catch {\n clearAuthToken();\n credentials = null;\n credentialsLoadedAt = 0;\n return { success: true };\n }\n },\n\n clearCredentials(): void {\n credentials = null;\n credentialsLoadedAt = 0;\n },\n\n // ============================================\n // High-level methods\n // ============================================\n\n async loginEmail(\n email: string,\n accountType: 'user' | 'admin' = 'user'\n ): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('login_email', {\n email,\n account_type: accountType,\n });\n return this.init(native_token);\n },\n\n async loginPhone(\n ccphone: string,\n phone: string,\n accountType: 'user' | 'admin' = 'user'\n ): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('login_phone', {\n ccphone,\n phone,\n account_type: accountType,\n });\n return this.init(native_token);\n },\n\n async loginAccessOtp(otpCode: string): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('login_access_otp', {\n otp_code: otpCode.replace(/[\\s-]/g, ''),\n });\n return this.init(native_token);\n },\n\n async register(data: {\n name: string;\n email?: string;\n ccphone: string;\n phone: string;\n town?: string;\n country?: string;\n registration_type?: 'email' | 'phone';\n }): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('register', {\n ...data,\n registration_type: data.registration_type || 'email',\n });\n return this.init(native_token);\n },\n\n async registerPhoneOnly(data: {\n name: string;\n ccphone: string;\n phone: string;\n town?: string;\n country?: string;\n }): Promise<NativeInitResponse> {\n if (data.ccphone !== '+221') {\n throw new ApiError(\n \"L'inscription par téléphone est réservée aux numéros sénégalais (+221)\",\n 'validation',\n 422,\n 'invalid_country_code'\n );\n }\n\n const { native_token } = await this.encrypt('register', {\n ...data,\n email: '',\n registration_type: 'phone',\n });\n return this.init(native_token);\n },\n\n async recoverPassword(\n method: 'email' | 'phone',\n identifier: { email?: string; ccphone?: string; phone?: string }\n ): Promise<NativeInitResponse> {\n const { native_token } = await this.encrypt('recovery_password', {\n method,\n ...identifier,\n });\n return this.init(native_token);\n },\n};\n\nexport default nativeAuthService;\n","/**\n * Service de récupération de mot de passe v1.0\n * Architecture Frontend-First : Appels directs à l'IAM\n * \n * @version 1.0.0\n */\n\nimport { \n ApiError, \n fetchWithTimeout, \n getNativeAuthConfig, \n isDebugMode,\n} from './api';\nimport { nativeAuthService } from './nativeAuth';\n\nimport type {\n MobilePasswordInitResponse,\n MobilePasswordSelectMethodResponse,\n MobilePasswordResetResponse,\n MobilePasswordResendResponse,\n} from '../types/mobile';\n\n// ============================================\n// Credentials (shared with nativeAuth)\n// ============================================\n\nfunction getIAMHeaders(): HeadersInit {\n const creds = nativeAuthService.getCredentials();\n if (!creds) {\n throw new ApiError('Credentials non chargés. Appelez loadCredentials() d\\'abord.', 'auth');\n }\n\n return {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n };\n}\n\n// ============================================\n// Service\n// ============================================\n\nexport const mobilePasswordService = {\n hasCredentials(): boolean {\n return nativeAuthService.hasCredentials();\n },\n\n async loadCredentials() {\n return nativeAuthService.loadCredentials();\n },\n\n async initRecovery(email: string): Promise<MobilePasswordInitResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/init', { email });\n }\n\n const response = await fetchWithTimeout<MobilePasswordInitResponse>(\n `${config.iamApiUrl}/iam/native/password/init`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({ email }),\n },\n config.timeout || 30000\n );\n\n if (isDebugMode()) {\n console.log('✅ [IAM] Init recovery:', { \n status: response.status, \n hasOtp: !!response.otp_code,\n });\n }\n\n return response;\n },\n\n async selectMethod(\n processToken: string, \n receiveChoice: 'email' | 'phone'\n ): Promise<MobilePasswordSelectMethodResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/select-method', { receiveChoice });\n }\n\n return fetchWithTimeout<MobilePasswordSelectMethodResponse>(\n `${config.iamApiUrl}/iam/native/password/select-method`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({ \n process_token: processToken, \n receive_choice: receiveChoice,\n }),\n },\n config.timeout || 30000\n );\n },\n\n validateOtpLocally(inputCode: string, storedCode: string): boolean {\n return inputCode === storedCode;\n },\n\n async reset(\n processToken: string,\n password: string\n ): Promise<MobilePasswordResetResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/reset');\n }\n\n return fetchWithTimeout<MobilePasswordResetResponse>(\n `${config.iamApiUrl}/iam/native/password/reset`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n password,\n password_confirmation: password,\n }),\n },\n config.timeout || 30000\n );\n },\n\n async resendOtp(processToken: string): Promise<MobilePasswordResendResponse> {\n const config = getNativeAuthConfig();\n if (!config.iamApiUrl) {\n throw new ApiError('iamApiUrl non configurée', 'unknown');\n }\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/password/resend');\n }\n\n return fetchWithTimeout<MobilePasswordResendResponse>(\n `${config.iamApiUrl}/iam/native/password/resend`,\n {\n method: 'POST',\n headers: getIAMHeaders(),\n body: JSON.stringify({ process_token: processToken }),\n },\n config.timeout || 30000\n );\n },\n};\n\nexport { ApiError };\nexport default mobilePasswordService;\n","/**\n * Hook de récupération de mot de passe v1.0\n * Architecture Frontend-First avec appels directs à l'IAM\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { mobilePasswordService } from '../services/mobilePassword';\nimport { setNativeAuthConfig, ApiError } from '../services/api';\nimport type { MobilePasswordState } from '../types/mobile';\n\nexport interface UseMobilePasswordOptions {\n saasApiUrl: string;\n iamApiUrl: string;\n autoLoadCredentials?: boolean;\n \n}\n\ninterface MobilePasswordStateExtended extends MobilePasswordState {\n credentialsLoaded: boolean;\n errorType: string | null;\n}\n\nfunction getErrorMessage(err: unknown, context: string): { message: string; type: string } {\n if (err instanceof ApiError) {\n return { message: err.message, type: err.type };\n }\n if (err instanceof Error) {\n if (err.message.includes('fetch') || err.message.includes('network')) {\n return { message: 'Vérifiez votre connexion Internet', type: 'network' };\n }\n if (err.message.includes('timeout')) {\n return { message: 'Le serveur met trop de temps à répondre', type: 'timeout' };\n }\n return { message: err.message, type: 'unknown' };\n }\n return { message: `Erreur lors de ${context}`, type: 'unknown' };\n}\n\nexport function useMobilePassword(options: UseMobilePasswordOptions) {\n const { saasApiUrl, iamApiUrl, autoLoadCredentials = true } = options;\n\n const configuredRef = useRef(false);\n\n useEffect(() => {\n if (!configuredRef.current) {\n setNativeAuthConfig({ saasApiUrl, iamApiUrl });\n configuredRef.current = true;\n }\n }, [saasApiUrl, iamApiUrl]);\n\n const [state, setState] = useState<MobilePasswordStateExtended>({\n credentialsLoaded: false,\n processToken: null,\n status: 'idle',\n storedOtp: null,\n receiveMode: null,\n maskedEmail: null,\n maskedPhone: null,\n loading: false,\n error: null,\n errorType: null,\n });\n\n useEffect(() => {\n if (autoLoadCredentials && !state.credentialsLoaded) {\n loadCredentials();\n }\n }, [autoLoadCredentials, state.credentialsLoaded]);\n\n const loadCredentials = useCallback(async () => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n await mobilePasswordService.loadCredentials();\n setState(prev => ({ ...prev, credentialsLoaded: true, loading: false }));\n return { success: true };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le chargement');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const initRecovery = useCallback(async (email: string) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!mobilePasswordService.hasCredentials()) {\n await mobilePasswordService.loadCredentials();\n }\n const response = await mobilePasswordService.initRecovery(email);\n\n if (response.success && response.process_token) {\n if (response.status === 'choice_required') {\n setState(prev => ({\n ...prev,\n credentialsLoaded: true,\n processToken: response.process_token!,\n status: 'choice_required',\n maskedEmail: response.masked_email || null,\n maskedPhone: response.masked_phone || null,\n loading: false,\n }));\n return { success: true, status: 'choice_required' as const };\n } else {\n setState(prev => ({\n ...prev,\n credentialsLoaded: true,\n processToken: response.process_token!,\n status: 'pending_otp',\n storedOtp: response.otp_code || null,\n receiveMode: 'email',\n maskedEmail: response.masked_email || null,\n loading: false,\n }));\n return { success: true, status: 'pending_otp' as const };\n }\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Aucun compte trouvé avec cet email',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la recherche du compte');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const selectMethod = useCallback(async (choice: 'email' | 'phone') => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n const response = await mobilePasswordService.selectMethod(state.processToken, choice);\n if (response.success) {\n setState(prev => ({\n ...prev,\n status: 'pending_otp',\n storedOtp: response.otp_code || null,\n receiveMode: response.receive_mode || choice,\n loading: false,\n }));\n return { success: true };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Impossible d\\'envoyer le code',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'envoi du code');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const verifyOtp = useCallback((inputCode: string): boolean => {\n if (!state.storedOtp) {\n setState(prev => ({ ...prev, error: 'Session invalide', errorType: 'invalid_session' }));\n return false;\n }\n const isValid = mobilePasswordService.validateOtpLocally(inputCode, state.storedOtp);\n if (isValid) {\n setState(prev => ({ ...prev, status: 'pending_password', error: null, errorType: null }));\n return true;\n }\n setState(prev => ({ ...prev, error: 'Code incorrect', errorType: 'invalid_otp' }));\n return false;\n }, [state.storedOtp]);\n\n const resetPassword = useCallback(async (password: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n const response = await mobilePasswordService.reset(state.processToken, password);\n if (response.success) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de la réinitialisation',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la réinitialisation');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const resendOtp = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n const response = await mobilePasswordService.resendOtp(state.processToken);\n if (response.success && response.otp_code) {\n setState(prev => ({ ...prev, storedOtp: response.otp_code!, loading: false }));\n return { success: true, cooldown: response.cooldown_remaining };\n }\n setState(prev => ({ ...prev, loading: false }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le renvoi');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const reset = useCallback(() => {\n setState({\n credentialsLoaded: state.credentialsLoaded,\n processToken: null,\n status: 'idle',\n storedOtp: null,\n receiveMode: null,\n maskedEmail: null,\n maskedPhone: null,\n loading: false,\n error: null,\n errorType: null,\n });\n }, [state.credentialsLoaded]);\n\n const clearError = useCallback(() => {\n setState(prev => ({ ...prev, error: null, errorType: null }));\n }, []);\n\n return {\n credentialsLoaded: state.credentialsLoaded,\n processToken: state.processToken,\n status: state.status,\n storedOtp: state.storedOtp,\n receiveMode: state.receiveMode,\n maskedEmail: state.maskedEmail,\n maskedPhone: state.maskedPhone,\n loading: state.loading,\n error: state.error,\n errorType: state.errorType,\n\n isCompleted: state.status === 'completed',\n isChoiceRequired: state.status === 'choice_required',\n isPendingOtp: state.status === 'pending_otp',\n isPendingPassword: state.status === 'pending_password',\n\n loadCredentials,\n initRecovery,\n selectMethod,\n verifyOtp,\n resetPassword,\n resendOtp,\n reset,\n clearError,\n };\n}\n\nexport default useMobilePassword;\n","/**\n * Password Recovery Modal for @ollaid/native-sso\n * Flow: email → method-choice → OTP → new password → success\n * Design aligned with web SSO\n * \n * @version 1.0.0\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription,\n Button, Input, Label, RadioGroup, RadioGroupItem,\n IconLock, IconCheckCircle2, IconArrowLeft, IconKeyRound, IconLoader2,\n} from './ui';\nimport OTPInput from './OTPInput';\nimport { useMobilePassword } from '../hooks/useMobilePassword';\n\nexport interface PasswordRecoveryModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSuccess: () => void;\n saasApiUrl: string;\n iamApiUrl: string;\n \n}\n\ntype RecoveryStep = 'email' | 'method-choice' | 'otp' | 'password' | 'success';\n\nconst C = {\n primary: '#002147',\n green: '#16a34a',\n greenBg: '#dcfce7',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n gray900: '#111827',\n red: '#dc2626',\n redBg: '#fef2f2',\n white: '#ffffff',\n} as const;\n\nconst iconCircle = (bg: string, size = '3rem'): React.CSSProperties => ({\n margin: '0 auto', width: size, height: size, backgroundColor: bg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst backBtnStyle: React.CSSProperties = {\n position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nexport function PasswordRecoveryModal({ open, onOpenChange, onSuccess, saasApiUrl, iamApiUrl }: PasswordRecoveryModalProps) {\n const {\n status, loading: pwLoading, error: pwError, receiveMode, maskedEmail, maskedPhone,\n initRecovery, selectMethod, verifyOtp, resetPassword, resendOtp, reset: resetHook, clearError,\n } = useMobilePassword({ saasApiUrl, iamApiUrl });\n\n const [step, setStep] = useState<RecoveryStep>('email');\n const [email, setEmail] = useState('');\n const [otp, setOtp] = useState('');\n const [password, setPassword] = useState('');\n const [confirmPassword, setConfirmPassword] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [selectedMethod, setSelectedMethod] = useState<'email' | 'phone'>('email');\n const [resendCooldown, setResendCooldown] = useState(0);\n\n const error = localError || pwError;\n\n useEffect(() => {\n if (status === 'choice_required') setStep('method-choice');\n else if (status === 'pending_otp') { setStep('otp'); setResendCooldown(60); }\n else if (status === 'pending_password') setStep('password');\n else if (status === 'completed') setStep('success');\n }, [status]);\n\n useEffect(() => {\n if (resendCooldown > 0) {\n const timer = setTimeout(() => setResendCooldown(resendCooldown - 1), 1000);\n return () => clearTimeout(timer);\n }\n }, [resendCooldown]);\n\n const resetState = () => {\n setStep('email'); setEmail(''); setOtp(''); setPassword(''); setConfirmPassword('');\n setLocalError(null); setSelectedMethod('email'); setResendCooldown(0); resetHook();\n };\n\n const handleClose = () => { resetState(); onOpenChange(false); };\n const handleBackToLogin = () => { resetState(); onSuccess(); };\n\n const handleEmailSubmit = async () => {\n setLocalError(null); clearError();\n if (!email.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.trim())) { setLocalError('Veuillez entrer une adresse email valide'); return; }\n await initRecovery(email.trim());\n };\n\n const handleMethodSubmit = async () => {\n setLocalError(null); clearError();\n await selectMethod(selectedMethod);\n };\n\n const handleOTPSubmit = () => {\n if (otp.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n setLocalError(null); clearError();\n const isValid = verifyOtp(otp);\n if (!isValid) setLocalError('Code incorrect');\n };\n\n const handleResendOTP = async () => {\n if (resendCooldown > 0) return;\n const result = await resendOtp();\n if (result.success) { setResendCooldown(result.cooldown || 60); setOtp(''); setLocalError(null); }\n };\n\n const handlePasswordSubmit = async () => {\n if (password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n if (password !== confirmPassword) { setLocalError('Les mots de passe ne correspondent pas'); return; }\n setLocalError(null); clearError();\n await resetPassword(password);\n };\n\n const goBack = () => {\n setLocalError(null); clearError();\n if (step === 'method-choice') { setStep('email'); resetHook(); }\n else if (step === 'otp') { setStep(maskedPhone ? 'method-choice' : 'email'); resetHook(); }\n else if (step === 'password') setStep('otp');\n };\n\n // ===== SUCCESS =====\n if (step === 'success') {\n return (\n <Dialog open={open} onOpenChange={handleClose}>\n <DialogContent>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.greenBg), width: '5rem', height: '5rem' }}>\n <IconCheckCircle2 style={{ width: '3rem', height: '3rem', color: C.green }} />\n </div>\n <DialogTitle>Mot de passe modifié !</DialogTitle>\n <DialogDescription>Votre mot de passe a été changé avec succès.</DialogDescription>\n </DialogHeader>\n <Button onClick={handleBackToLogin} style={{ width: '100%', marginTop: '1rem' }}>Retour à la connexion</Button>\n </DialogContent>\n </Dialog>\n );\n }\n\n return (\n <Dialog open={open} onOpenChange={handleClose}>\n <DialogContent>\n {step !== 'email' && (\n <button onClick={goBack} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n )}\n\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary + '1a')}>\n {step === 'otp' ? (\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n ) : (\n <IconLock style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n )}\n </div>\n <DialogTitle>\n {step === 'email' && 'Récupération de mot de passe'}\n {step === 'method-choice' && 'Recevoir le code de vérification'}\n {step === 'otp' && 'Vérification'}\n {step === 'password' && 'Nouveau mot de passe'}\n </DialogTitle>\n <DialogDescription>\n {step === 'email' && 'Veuillez entrer votre adresse email'}\n {step === 'method-choice' && 'Comment souhaitez-vous recevoir le code ?'}\n {step === 'otp' && (receiveMode === 'phone' ? `Code envoyé par SMS au ${maskedPhone}` : `Code envoyé par email à ${maskedEmail}`)}\n {step === 'password' && 'Définissez votre nouveau mot de passe'}\n </DialogDescription>\n </DialogHeader>\n\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {error && <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg, color: C.red, fontSize: '0.875rem' }}>{error}</div>}\n\n {step === 'email' && (\n <>\n <div><Label htmlFor=\"recovery-email\">Adresse email</Label><Input id=\"recovery-email\" type=\"email\" placeholder=\"vous@exemple.com\" value={email} onChange={e => setEmail(e.target.value)} disabled={pwLoading} /></div>\n <Button onClick={handleEmailSubmit} disabled={pwLoading} style={{ width: '100%' }}>\n {pwLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n </span>\n ) : 'Continuer'}\n </Button>\n <Button variant=\"ghost\" onClick={handleBackToLogin} style={{ width: '100%' }}>Retour à la connexion</Button>\n </>\n )}\n\n {step === 'method-choice' && (\n <>\n <RadioGroup value={selectedMethod} onValueChange={v => setSelectedMethod(v as 'email' | 'phone')}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem', padding: '1rem', borderRadius: '0.5rem', border: `2px solid ${selectedMethod === 'email' ? C.primary : C.gray200}`, cursor: 'pointer' }} onClick={() => setSelectedMethod('email')}>\n <RadioGroupItem value=\"email\" id=\"method-email\" />\n <div><div style={{ fontWeight: 500 }}>Par email</div><div style={{ fontSize: '0.75rem', color: C.gray500 }}>{maskedEmail}</div></div>\n </div>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.75rem', padding: '1rem', borderRadius: '0.5rem', border: `2px solid ${selectedMethod === 'phone' ? C.primary : C.gray200}`, cursor: 'pointer' }} onClick={() => setSelectedMethod('phone')}>\n <RadioGroupItem value=\"phone\" id=\"method-phone\" />\n <div><div style={{ fontWeight: 500 }}>Par SMS</div><div style={{ fontSize: '0.75rem', color: C.gray500 }}>{maskedPhone}</div></div>\n </div>\n </div>\n </RadioGroup>\n <Button onClick={handleMethodSubmit} disabled={pwLoading} style={{ width: '100%' }}>\n {pwLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Envoi...\n </span>\n ) : 'Envoyer le code'}\n </Button>\n </>\n )}\n\n {step === 'otp' && (\n <>\n <OTPInput value={otp} onChange={setOtp} disabled={pwLoading} />\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n {resendCooldown > 0 ? <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span> : (\n <button type=\"button\" style={{ color: C.primary, background: 'none', border: 'none', cursor: 'pointer', textDecoration: 'underline' }} onClick={handleResendOTP}>Code non reçu ? Renvoyer</button>\n )}\n </div>\n <Button onClick={handleOTPSubmit} disabled={otp.length !== 6} style={{ width: '100%' }}>Vérifier</Button>\n </>\n )}\n\n {step === 'password' && (\n <>\n <div><Label>Nouveau mot de passe</Label><Input type=\"password\" placeholder=\"Minimum 8 caractères\" value={password} onChange={e => setPassword(e.target.value)} disabled={pwLoading} /></div>\n <div><Label>Confirmer le mot de passe</Label><Input type=\"password\" placeholder=\"Retapez votre mot de passe\" value={confirmPassword} onChange={e => setConfirmPassword(e.target.value)} disabled={pwLoading} /></div>\n <Button onClick={handlePasswordSubmit} disabled={pwLoading || !password || !confirmPassword} style={{ width: '100%' }}>\n {pwLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Modification...\n </span>\n ) : 'Modifier le mot de passe'}\n </Button>\n </>\n )}\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default PasswordRecoveryModal;\n","/**\n * Hook de vérification périodique du token Sanctum\n * \n * - Premier check 2 min après login\n * - Checks suivants toutes les 5 min\n * - Ne déconnecte PAS si offline ou serveur inaccessible\n * - Déconnecte UNIQUEMENT si le backend retourne 401 (token invalide)\n * \n * @version 1.0.0\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\nimport { STORAGE_KEYS } from '../services/api';\nimport type { UserInfos } from '../types/native';\n\nconst FIRST_CHECK_DELAY = 2 * 60 * 1000; // 2 minutes\nconst INTERVAL_DELAY = 5 * 60 * 1000; // 5 minutes\n\nexport interface UseTokenHealthCheckOptions {\n /** Whether to enable health checks (true when authenticated) */\n enabled: boolean;\n /** SaaS API base URL */\n saasApiUrl: string;\n /** Called when the backend explicitly invalidates the token (401) */\n onTokenInvalid: () => void;\n /** Called when fresh user_infos are received */\n onUserUpdated?: (userInfos: UserInfos) => void;\n /** Debug mode */\n debug?: boolean;\n}\n\nasync function checkTokenValidity(\n saasApiUrl: string,\n token: string,\n debug: boolean\n): Promise<{ valid: boolean; user_infos?: UserInfos }> {\n // 1. Check connectivity first\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n if (debug) console.log('🔄 [HealthCheck] Offline — skip');\n throw new Error('offline');\n }\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 10000); // 10s timeout\n\n try {\n const response = await fetch(`${saasApiUrl}/native/check-token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'Authorization': `Bearer ${token}`,\n },\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n // 401 = token explicitly invalid/expired → the ONLY case we disconnect\n if (response.status === 401) {\n if (debug) console.log('🔄 [HealthCheck] Token invalide (401)');\n return { valid: false };\n }\n\n // Any other non-OK status = server issue, NOT token issue → keep session\n if (!response.ok) {\n if (debug) console.log(`🔄 [HealthCheck] Serveur erreur ${response.status} — session conservée`);\n throw new Error(`server_error_${response.status}`);\n }\n\n const data = await response.json();\n if (debug) console.log('🔄 [HealthCheck] Token valide ✅');\n\n return {\n valid: data.valid !== false,\n user_infos: data.user_infos,\n };\n } catch (error) {\n clearTimeout(timeoutId);\n\n // Re-throw if it's our \"valid: false\" result wrapped in the return above\n if (error instanceof Error && error.message === 'offline') {\n throw error;\n }\n\n // Network errors, timeouts, server unreachable → do NOT invalidate\n if (debug) {\n const msg = error instanceof Error ? error.message : 'unknown';\n console.log(`🔄 [HealthCheck] Erreur réseau/serveur (${msg}) — session conservée`);\n }\n throw error;\n }\n}\n\nexport function useTokenHealthCheck(options: UseTokenHealthCheckOptions): void {\n const { enabled, saasApiUrl, onTokenInvalid, onUserUpdated, debug = false } = options;\n\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const enabledRef = useRef(enabled);\n const callbacksRef = useRef({ onTokenInvalid, onUserUpdated });\n\n // Keep refs up to date\n enabledRef.current = enabled;\n callbacksRef.current = { onTokenInvalid, onUserUpdated };\n\n const performCheck = useCallback(async () => {\n if (!enabledRef.current) return;\n\n const token = typeof localStorage !== 'undefined'\n ? localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN)\n : null;\n\n if (!token) {\n if (debug) console.log('🔄 [HealthCheck] Pas de token — arrêt');\n return;\n }\n\n try {\n const result = await checkTokenValidity(saasApiUrl, token, debug);\n\n if (!result.valid) {\n // Token explicitly rejected by backend → clear session\n callbacksRef.current.onTokenInvalid();\n return;\n }\n\n // Token valid — update user_infos if provided\n if (result.user_infos && callbacksRef.current.onUserUpdated) {\n callbacksRef.current.onUserUpdated(result.user_infos);\n }\n } catch {\n // Network/timeout/server error → silently keep session\n }\n }, [saasApiUrl, debug]);\n\n useEffect(() => {\n // Cleanup previous timers\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n\n if (!enabled || !saasApiUrl) return;\n\n if (debug) console.log('🔄 [HealthCheck] Activé — premier check dans 2 min');\n\n // First check after 2 minutes\n timerRef.current = setTimeout(() => {\n performCheck();\n\n // Then every 5 minutes\n intervalRef.current = setInterval(performCheck, INTERVAL_DELAY);\n }, FIRST_CHECK_DELAY);\n\n return () => {\n if (timerRef.current) clearTimeout(timerRef.current);\n if (intervalRef.current) clearInterval(intervalRef.current);\n };\n }, [enabled, saasApiUrl, performCheck, debug]);\n}\n\nexport default useTokenHealthCheck;\n","/**\n * Hook d'authentification Native SSO v1.0\n * Architecture Frontend-First avec appels directs à l'IAM\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { setNativeAuthConfig, STORAGE_KEYS, isDebugMode } from '../services/api';\nimport { useTokenHealthCheck } from './useTokenHealthCheck';\nimport type {\n NativeAuthState,\n NativeAuthStatus,\n NativeExchangeResponse,\n AccountType,\n UserInfos,\n} from '../types/native';\n\n/** Helper: persist session to localStorage (unified keys) */\nfunction saveSession(exchangeResult: NativeExchangeResponse, accountType: AccountType | 'user' | 'client') {\n const sanctumToken = exchangeResult.auth_token || exchangeResult.token;\n localStorage.setItem(STORAGE_KEYS.AUTH_TOKEN, sanctumToken);\n localStorage.setItem(STORAGE_KEYS.TOKEN, sanctumToken);\n \n // Build user object from user_infos if available, otherwise from user\n const baseUser = exchangeResult.user_infos \n ? { ...exchangeResult.user, ...exchangeResult.user_infos }\n : exchangeResult.user;\n \n // Enrich user with iam_reference and alias_reference\n const aliasRef = exchangeResult.user?.alias_reference || (exchangeResult as any).alias_reference || '';\n const iamRef = exchangeResult.user?.reference || '';\n \n const userToStore = {\n ...baseUser,\n iam_reference: iamRef,\n alias_reference: aliasRef,\n };\n \n // Store alias_reference separately for quick access\n if (aliasRef) {\n localStorage.setItem(STORAGE_KEYS.ALIAS_REFERENCE, aliasRef);\n }\n \n // account_type is stored SEPARATELY, never inside the user object\n // Use the accountType string directly (already resolved by the caller)\n const acctType = typeof accountType === 'string' ? accountType : 'user';\n localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(userToStore));\n localStorage.setItem(STORAGE_KEYS.ACCOUNT_TYPE, acctType);\n \n return { token: sanctumToken, user: userToStore };\n}\n\n/** Helper: clear session from localStorage */\nfunction clearSession() {\n localStorage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.TOKEN);\n localStorage.removeItem(STORAGE_KEYS.USER);\n localStorage.removeItem(STORAGE_KEYS.ACCOUNT_TYPE);\n localStorage.removeItem(STORAGE_KEYS.ALIAS_REFERENCE);\n}\n\nfunction getErrorMessage(err: unknown, context: string): { message: string; type: string } {\n if (err instanceof Error) {\n if (err.message.includes('fetch') || err.message.includes('network')) {\n return { message: 'Vérifiez votre connexion Internet', type: 'network' };\n }\n if (err.message.includes('timeout')) {\n return { message: 'Le serveur met trop de temps à répondre', type: 'timeout' };\n }\n return { message: err.message, type: 'unknown' };\n }\n return { message: `Erreur lors de ${context}`, type: 'unknown' };\n}\n\nexport interface UseNativeAuthOptions {\n /** URL du Backend SaaS */\n saasApiUrl: string;\n /** URL du Backend IAM */\n iamApiUrl: string;\n /** Charger les credentials automatiquement au montage */\n autoLoadCredentials?: boolean;\n /** Type de compte par défaut à persister (défaut: 'user') */\n defaultAccountType?: 'user' | 'client';\n /** \n * Préfixe de configuration IAM côté backend (défaut: 'iam').\n * Permet le multi-tenant dynamique : 'iam', 'iam_vendor', 'iam_client', etc.\n */\n configPrefix?: string;\n}\n\nexport function useNativeAuth(options: UseNativeAuthOptions) {\n const { saasApiUrl, iamApiUrl, autoLoadCredentials = true, defaultAccountType = 'user', configPrefix = 'iam' } = options;\n \n const configuredRef = useRef(false);\n \n // Debug réactif : mis à jour après loadCredentials\n const [isDebug, setIsDebug] = useState(isDebugMode());\n \n useEffect(() => {\n if (!configuredRef.current) {\n setNativeAuthConfig({ saasApiUrl, iamApiUrl, configPrefix });\n configuredRef.current = true;\n }\n }, [saasApiUrl, iamApiUrl, configPrefix]);\n\n const [state, setState] = useState<NativeAuthState & { otpMethod?: string | null; otpSentTo?: string | null }>({\n credentialsLoaded: false,\n processToken: null,\n status: null,\n user: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n loading: false,\n error: null,\n errorType: null,\n otpMethod: null,\n otpSentTo: null,\n });\n\n const [accountType, setAccountType] = useState<AccountType>('email');\n\n // --- Token Health Check ---\n const handleTokenInvalid = useCallback(() => {\n if (isDebug) console.log('🔐 [HealthCheck] Token invalide — déconnexion locale');\n clearSession();\n setState({\n credentialsLoaded: false,\n processToken: null,\n status: null,\n user: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n loading: false,\n error: null,\n errorType: null,\n otpMethod: null,\n otpSentTo: null,\n });\n }, [isDebug]);\n\n const handleUserUpdated = useCallback((userInfos: UserInfos) => {\n // Merge fresh user_infos into stored user\n const storedRaw = localStorage.getItem(STORAGE_KEYS.USER);\n if (storedRaw) {\n try {\n const stored = JSON.parse(storedRaw);\n const merged = { ...stored, ...userInfos };\n localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(merged));\n setState(prev => ({ ...prev, user: merged }));\n } catch { /* ignore */ }\n }\n }, []);\n\n useTokenHealthCheck({\n enabled: state.status === 'completed' && state.user !== null,\n saasApiUrl,\n onTokenInvalid: handleTokenInvalid,\n onUserUpdated: handleUserUpdated,\n debug: isDebug,\n });\n\n // Check existing session\n useEffect(() => {\n const storedToken = localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN);\n const storedUser = localStorage.getItem(STORAGE_KEYS.USER);\n \n if (storedToken && storedUser) {\n try {\n const user = JSON.parse(storedUser);\n setState(prev => ({ ...prev, user, status: 'completed' }));\n } catch {\n clearSession();\n }\n }\n }, []);\n\n // Auto-load credentials\n useEffect(() => {\n if (autoLoadCredentials && !state.credentialsLoaded && !state.user) {\n loadCredentials();\n }\n }, [autoLoadCredentials, state.credentialsLoaded, state.user]);\n\n // Background auto-refresh of credentials before TTL expiration\n useEffect(() => {\n // Only refresh while user is NOT authenticated and credentials are loaded\n if (state.status === 'completed' || !state.credentialsLoaded) return;\n\n const ttl = nativeAuthService.getCredentialsTtl();\n const refreshInterval = Math.max((ttl - 30) * 1000, 30000); // At least 30s\n\n if (isDebug) {\n console.log(`🔄 [Native] Auto-refresh credentials every ${refreshInterval / 1000}s (TTL: ${ttl}s)`);\n }\n\n const timer = setInterval(async () => {\n try {\n await nativeAuthService.loadCredentials();\n // Re-check debug après refresh (le backend peut changer la valeur)\n setIsDebug(isDebugMode());\n if (isDebugMode()) console.log('✅ [Native] Credentials auto-refreshed');\n } catch (err) {\n if (isDebugMode()) console.warn('⚠️ [Native] Auto-refresh failed:', err);\n }\n }, refreshInterval);\n\n return () => clearInterval(timer);\n }, [state.status, state.credentialsLoaded, isDebug]);\n\n const loadCredentials = useCallback(async () => {\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n await nativeAuthService.loadCredentials();\n // Mettre à jour le debug réactif après chargement des credentials\n setIsDebug(isDebugMode());\n setState(prev => ({ ...prev, credentialsLoaded: true, loading: false }));\n return { success: true };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le chargement');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const loginWithEmail = useCallback(async (\n email: string,\n acctType: 'user' | 'admin' = 'user'\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const response = await nativeAuthService.loginEmail(email, acctType);\n\n // Garde: ancien backend peut retourner needs_access directement depuis init\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token || null,\n status: 'needs_access' as NativeAuthStatus,\n application: response.application || null,\n prompt: response.prompt || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n application: response.application || null,\n prompt: response.prompt || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n if (response.error_type === 'alias_disabled' && response.alternative_method) {\n setState(prev => ({\n ...prev,\n alternativeMethod: {\n type: response.alternative_method!,\n value: response.alternative_method === 'email' \n ? response.alternative_email! \n : response.alternative_phone!,\n },\n loading: false,\n error: 'Cette méthode de connexion est désactivée',\n errorType: 'alias_disabled',\n }));\n return { success: false, error_type: 'alias_disabled' };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur d\\'authentification',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'authentification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const loginWithPhone = useCallback(async (\n ccphone: string,\n phone: string,\n acctType: 'user' | 'admin' = 'user'\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const response = await nativeAuthService.loginPhone(ccphone, phone, acctType);\n\n // Garde: ancien backend peut retourner needs_access directement depuis init\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token || null,\n status: 'needs_access' as NativeAuthStatus,\n application: response.application || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n application: response.application || null,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur d\\'authentification',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'authentification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const loginWithAccessOtp = useCallback(async (otpCode: string) => {\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const response = await nativeAuthService.loginAccessOtp(otpCode);\n\n // v4.5: Handle needs_access (user needs to confirm access)\n if (response.success && response.needs_access && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: 'needs_access' as NativeAuthStatus,\n application: response.application || null,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : null,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n // v4.5: Handle direct callback_token (user already has access)\n if (response.success && response.callback_token) {\n setState(prev => ({ ...prev, loading: false }));\n return { success: true, status: 'completed', callback_token: response.callback_token };\n }\n\n // Legacy: Handle process_token response\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code invalide',\n errorType: response.error_type || 'invalid_otp',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'authentification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, []);\n\n const register = useCallback(async (\n data: {\n name: string;\n email?: string;\n ccphone: string;\n phone: string;\n town?: string;\n country?: string;\n }\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, errorType: null }));\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n const registrationType = accountType === 'phone-only' ? 'phone' : 'email';\n \n const response = await nativeAuthService.register({\n ...data,\n email: registrationType === 'phone' ? '' : data.email,\n registration_type: registrationType,\n });\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: response.status as NativeAuthStatus,\n otpMethod: response.otp_method || null,\n otpSentTo: response.otp_sent_to || null,\n conflict: response.conflict ? {\n type: response.conflict.type,\n maskedIdentifier: response.conflict.masked_identifier,\n options: {\n canLogin: response.conflict.options.can_login,\n canRecoverByEmail: response.conflict.options.can_recover_by_email,\n canRecoverBySms: response.conflict.options.can_recover_by_sms,\n maskedEmail: response.conflict.options.masked_email,\n maskedPhone: response.conflict.options.masked_phone,\n },\n } : null,\n loading: false,\n }));\n return { success: true, status: response.status };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de l\\'inscription',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'inscription');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [accountType]);\n\n const submitPassword = useCallback(async (password: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.validate(state.processToken, { password });\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser, callback_token: response.callback_token };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: exchangeResult.message || 'Erreur lors de l\\'échange',\n errorType: 'exchange_failed',\n }));\n return { success: false, error_type: 'exchange_failed' };\n }\n\n if (response.requires_2fa) {\n setState(prev => ({ ...prev, status: 'pending_2fa', loading: false }));\n return { success: true, requires_2fa: true };\n }\n\n // needs_access after password validation — stocker le nouveau process_token\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n status: 'needs_access' as NativeAuthStatus,\n processToken: response.process_token || prev.processToken,\n application: response.application || prev.application,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : prev.user,\n prompt: response.prompt || prev.prompt,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Mot de passe incorrect',\n errorType: response.error_type || 'invalid_password',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la validation');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const submitOtp = useCallback(async (otpCode: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.validate(state.processToken, { otp_code: otpCode });\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser, callback_token: response.callback_token };\n }\n setState(prev => ({\n ...prev,\n loading: false,\n error: exchangeResult.message || 'Erreur lors de l\\'échange',\n errorType: 'exchange_failed',\n }));\n return { success: false, error_type: 'exchange_failed' };\n }\n\n if (response.success && response.status === 'pending_registration') {\n setState(prev => ({ ...prev, status: 'pending_registration', loading: false }));\n return { success: true, status: 'pending_registration' };\n }\n\n // needs_access after OTP validation — stocker le nouveau process_token\n if (response.success && (response.status === 'needs_access' || response.needs_access)) {\n setState(prev => ({\n ...prev,\n status: 'needs_access' as NativeAuthStatus,\n processToken: response.process_token || prev.processToken,\n application: response.application || prev.application,\n user: response.user ? {\n reference: `USR-${response.user.id}`,\n name: response.user.name,\n email: response.user.email,\n } : prev.user,\n prompt: response.prompt || prev.prompt,\n loading: false,\n }));\n return { success: true, status: 'needs_access' };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code incorrect',\n errorType: response.error_type || 'invalid_otp',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la vérification');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const submitTotp = useCallback(async (totpCode: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.verifyTotp(state.processToken, totpCode);\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser };\n }\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code 2FA incorrect',\n errorType: response.error_type || 'invalid_totp',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'la vérification 2FA');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const grantAccess = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.grantAccess(state.processToken);\n\n if (response.success && response.callback_token) {\n const exchangeResult = await nativeAuthService.exchange(response.callback_token);\n if (exchangeResult.success) {\n const { user: savedUser } = saveSession(exchangeResult, defaultAccountType);\n setState(prev => ({\n ...prev,\n status: 'completed',\n user: savedUser,\n processToken: null,\n loading: false,\n }));\n return { success: true, user: savedUser, callback_token: response.callback_token };\n }\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de l\\'accès',\n errorType: response.error_type || 'unknown',\n }));\n return { success: false };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'l\\'accès');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false, error_type: type };\n }\n }, [state.processToken]);\n\n const resendOtp = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await nativeAuthService.resendOtp(state.processToken);\n setState(prev => ({ ...prev, loading: false }));\n return { \n success: response.success, \n cooldown: response.cooldown_remaining,\n message: response.message,\n otp_code_dev: response.otp_code_dev,\n };\n } catch (err) {\n const { message, type } = getErrorMessage(err, 'le renvoi');\n setState(prev => ({ ...prev, loading: false, error: message, errorType: type }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const setSession = useCallback((data: NativeExchangeResponse) => {\n const { user: savedUser } = saveSession(data, defaultAccountType);\n setState(prev => ({\n ...prev,\n user: savedUser,\n status: 'completed',\n processToken: null,\n }));\n }, [defaultAccountType]);\n\n const logout = useCallback(async () => {\n const token = localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN);\n try {\n if (token) {\n await nativeAuthService.logout(token);\n }\n } catch { /* ignore */ }\n\n clearSession();\n \n setState({\n credentialsLoaded: false,\n processToken: null,\n status: null,\n user: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n loading: false,\n error: null,\n errorType: null,\n otpMethod: null,\n otpSentTo: null,\n });\n }, []);\n\n const reset = useCallback(() => {\n setState(prev => ({\n ...prev,\n processToken: null,\n status: null,\n application: null,\n prompt: null,\n alternativeMethod: null,\n conflict: null,\n error: null,\n errorType: null,\n }));\n }, []);\n\n const clearError = useCallback(() => {\n setState(prev => ({ ...prev, error: null, errorType: null }));\n }, []);\n\n return {\n // State\n credentialsLoaded: state.credentialsLoaded,\n processToken: state.processToken,\n status: state.status,\n user: state.user,\n application: state.application,\n prompt: state.prompt,\n alternativeMethod: state.alternativeMethod,\n conflict: state.conflict,\n loading: state.loading,\n error: state.error,\n errorType: state.errorType,\n isAuthenticated: state.status === 'completed' && state.user !== null,\n \n /** Debug réactif — mis à jour après loadCredentials */\n isDebug,\n \n accountType,\n isPhoneOnly: accountType === 'phone-only',\n otpMethod: state.otpMethod,\n otpSentTo: state.otpSentTo,\n\n // Methods\n loadCredentials,\n loginWithEmail,\n loginWithPhone,\n loginWithAccessOtp,\n submitPassword,\n submitOtp,\n submitTotp,\n grantAccess,\n resendOtp,\n setSession,\n logout,\n reset,\n clearError,\n register,\n setAccountType,\n };\n}\n\nexport default useNativeAuth;\n","/**\n * Login Modal for @ollaid/native-sso\n * Complete login flow aligned with web SSO /sso/auth design\n * \n * @version 1.0.0\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription,\n Button, Input, Label,\n IconShieldCheck, IconMail, IconPhone, IconLock, IconKeyRound,\n IconArrowLeft, IconEye, IconEyeOff, IconCheckCircle2, IconLoader2,\n} from './ui';\nimport OTPInput from './OTPInput';\nimport PasswordRecoveryModal from './PasswordRecoveryModal';\nimport { useNativeAuth } from '../hooks/useNativeAuth';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport type { UserInfos } from '../types/native';\n\ntype LoginStep = 'choice' | 'email-check' | 'email-password' | 'email-otp' | 'email-create-password' | 'phone-input' | 'phone-otp' | 'access-otp';\n\nexport interface LoginModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSwitchToSignup: () => void;\n onLoginSuccess?: (token: string, user: UserInfos) => void;\n saasApiUrl: string;\n iamApiUrl: string;\n loading?: boolean;\n showSwitchToSignup?: boolean;\n /** Type de compte par défaut à persister dans localStorage */\n defaultAccountType?: 'user' | 'client';\n}\n\n// Design tokens\nconst C = {\n primary: '#002147',\n accent: '#e8430a',\n green: '#16a34a',\n greenBg: '#dcfce7',\n amber: '#f59e0b',\n amberBg: '#fef3c7',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n gray900: '#111827',\n red: '#dc2626',\n redBg: '#fef2f2',\n white: '#ffffff',\n} as const;\n\n// Reusable style helpers\nconst iconCircle = (bg: string): React.CSSProperties => ({\n margin: '0 auto', width: '3rem', height: '3rem', backgroundColor: bg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst backBtnStyle: React.CSSProperties = {\n position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nconst linkStyle: React.CSSProperties = {\n color: C.primary, cursor: 'pointer', background: 'none', border: 'none',\n fontWeight: 500, textDecoration: 'underline', fontSize: '0.875rem',\n};\n\nconst errorBoxStyle: React.CSSProperties = {\n padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg,\n color: C.red, fontSize: '0.875rem',\n};\n\nconst methodBtnStyle: React.CSSProperties = {\n width: '100%', height: '3.5rem', justifyContent: 'flex-start', gap: '0.75rem',\n textAlign: 'left' as const, backgroundColor: C.gray100, borderColor: C.gray200,\n};\n\nconst methodIconStyle = (bg: string): React.CSSProperties => ({\n width: '2.5rem', height: '2.5rem', backgroundColor: bg, borderRadius: '0.5rem',\n display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0,\n});\n\nexport function LoginModal({\n open, onOpenChange, onSwitchToSignup, onLoginSuccess, saasApiUrl, iamApiUrl, loading, showSwitchToSignup = true, defaultAccountType,\n}: LoginModalProps) {\n const {\n status, user, application, alternativeMethod, loading: authLoading, error: authError,\n loginWithEmail, loginWithPhone, submitPassword, submitOtp, grantAccess, loginWithAccessOtp,\n resendOtp, setSession, reset: resetAuth, clearError,\n } = useNativeAuth({ saasApiUrl, iamApiUrl, defaultAccountType });\n\n const [step, setStep] = useState<LoginStep>('choice');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [showPassword, setShowPassword] = useState(false);\n const [userName, setUserName] = useState<string | null>(null);\n const [phone, setPhone] = useState('');\n const [phoneOtpCode, setPhoneOtpCode] = useState('');\n const [emailOtpCode, setEmailOtpCode] = useState('');\n const [accessOtpCode, setAccessOtpCode] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [resendCooldown, setResendCooldown] = useState(0);\n const [loginSuccess, setLoginSuccess] = useState(false);\n const [loginData, setLoginData] = useState<{ token: string; user: UserInfos } | null>(null);\n const [showPasswordRecovery, setShowPasswordRecovery] = useState(false);\n\n const CCPHONE = '+221';\n const isSubmitting = authLoading || loading;\n const error = localError || authError;\n\n useEffect(() => {\n if (resendCooldown > 0) {\n const timer = setTimeout(() => setResendCooldown(p => p - 1), 1000);\n return () => clearTimeout(timer);\n }\n }, [resendCooldown]);\n\n useEffect(() => {\n if (status === 'pending_password') setStep('email-password');\n else if (status === 'pending_otp') {\n if (step === 'email-check' || step === 'email-password') setStep('email-otp');\n else if (step === 'phone-input') setStep('phone-otp');\n setResendCooldown(60);\n }\n }, [status, step]);\n\n useEffect(() => {\n if (loginSuccess && loginData) {\n const timer = setTimeout(() => {\n setSession({ success: true, token: loginData.token, expires_at: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), user: loginData.user as any });\n onLoginSuccess?.(loginData.token, loginData.user);\n }, 1000);\n return () => clearTimeout(timer);\n }\n }, [loginSuccess, loginData]);\n\n const resetState = () => {\n setStep('choice'); setEmail(''); setPassword('');\n setShowPassword(false); setUserName(null); setPhone(''); setPhoneOtpCode(''); setEmailOtpCode('');\n setAccessOtpCode(''); setLocalError(null); setLoginSuccess(false); setLoginData(null);\n setResendCooldown(0); resetAuth();\n };\n\n useEffect(() => { if (!open) resetState(); }, [open]);\n\n const exchangeCallbackToken = async (callbackToken: string) => {\n try {\n const response = await nativeAuthService.exchange(callbackToken);\n if (response.success && response.token) {\n setLoginData({ token: response.token, user: response.user as UserInfos });\n setLoginSuccess(true);\n } else {\n setLocalError('Erreur lors de la finalisation de la connexion');\n }\n } catch { setLocalError('Erreur de connexion au serveur'); }\n };\n\n const handleEmailCheck = async () => {\n setLocalError(null); clearError();\n if (!email.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n if (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) { setLocalError('Adresse email invalide'); return; }\n const result = await loginWithEmail(email.trim());\n if (result.success && user?.name) setUserName(user.name);\n };\n\n const handleEmailPasswordSubmit = async (e: React.FormEvent) => {\n e.preventDefault(); setLocalError(null); clearError();\n if (!password) { setLocalError('Le mot de passe est requis'); return; }\n if (password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n const result = await submitPassword(password);\n if (result.success && (result as any).callback_token) await exchangeCallbackToken((result as any).callback_token);\n };\n\n const handleEmailOtpVerify = async () => {\n setLocalError(null); clearError();\n if (emailOtpCode.length !== 6) { setLocalError('Le code doit contenir 6 chiffres'); return; }\n const result = await submitOtp(emailOtpCode);\n if (result.success && (result as any).callback_token) await exchangeCallbackToken((result as any).callback_token);\n };\n\n const handlePhoneInit = async () => {\n setLocalError(null); clearError();\n const cleanPhone = phone.replace(/\\s/g, '');\n if (cleanPhone.length !== 9) { setLocalError('Le numéro doit contenir exactement 9 chiffres'); return; }\n await loginWithPhone(CCPHONE, cleanPhone);\n };\n\n const handlePhoneVerify = async () => {\n setLocalError(null); clearError();\n if (phoneOtpCode.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n const result = await submitOtp(phoneOtpCode);\n if (result.success && (result as any).callback_token) await exchangeCallbackToken((result as any).callback_token);\n };\n\n const handleAccessOtpSubmit = async () => {\n setLocalError(null); clearError();\n if (accessOtpCode.length !== 8) { setLocalError('Veuillez entrer le code à 8 chiffres'); return; }\n const result = await loginWithAccessOtp(accessOtpCode);\n if (result.success) {\n if ((result as any).callback_token) {\n await exchangeCallbackToken((result as any).callback_token);\n }\n // needs_access is handled by status effect\n }\n };\n\n const handleGrantAccess = async () => {\n setLocalError(null); clearError();\n const result = await grantAccess();\n if (result.success && result.callback_token) await exchangeCallbackToken(result.callback_token);\n };\n\n const handleResendOTP = async () => {\n if (resendCooldown > 0) return;\n const result = await resendOtp();\n if (result.success) setResendCooldown(result.cooldown || 60);\n };\n\n const goBack = () => {\n setLocalError(null); clearError();\n switch (step) {\n case 'email-check': case 'phone-input': case 'access-otp': setStep('choice'); resetAuth(); break;\n case 'email-password': case 'email-otp': setStep('email-check'); resetAuth(); break;\n case 'phone-otp': setStep('phone-input'); resetAuth(); break;\n default: setStep('choice'); resetAuth();\n }\n };\n\n // Render helpers\n const renderError = () => error ? <div style={errorBoxStyle}>{error}</div> : null;\n\n const renderBackBtn = () => (\n <button onClick={goBack} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n );\n\n const renderResendLink = () => (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n {resendCooldown > 0 ? (\n <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span>\n ) : (\n <button type=\"button\" style={linkStyle} onClick={handleResendOTP}>\n Code non reçu ? Renvoyer\n </button>\n )}\n </div>\n );\n\n const renderLoaderBtn = (text: string, loadingText: string, onClick: () => void, disabled: boolean, extraStyle?: React.CSSProperties) => (\n <Button onClick={onClick} disabled={isSubmitting || disabled} style={{ width: '100%', ...extraStyle }}>\n {isSubmitting ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n {loadingText}\n </span>\n ) : text}\n </Button>\n );\n\n return (\n <>\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n\n {/* ===================== SUCCESS ===================== */}\n {loginSuccess && loginData ? (\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.greenBg), width: '5rem', height: '5rem' }}>\n <IconCheckCircle2 style={{ width: '3rem', height: '3rem', color: C.green }} />\n </div>\n <DialogTitle>Connexion réussie</DialogTitle>\n <DialogDescription>\n <span style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginTop: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n Redirection en cours...\n </span>\n </DialogDescription>\n </DialogHeader>\n\n /* ===================== NEEDS ACCESS ===================== */\n ) : status === 'needs_access' && user && application ? (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.primary + '1a'), width: '4rem', height: '4rem' }}>\n {(application as any).logo ? (\n <img src={(application as any).logo} alt={(application as any).name} style={{ width: '2.5rem', height: '2.5rem', borderRadius: '0.5rem' }} />\n ) : (\n <IconShieldCheck style={{ width: '2rem', height: '2rem', color: C.primary }} />\n )}\n </div>\n <DialogTitle>Bienvenue sur {(application as any).name} !</DialogTitle>\n <DialogDescription>\n Bonjour <strong style={{ color: C.gray900 }}>{user.name}</strong>, vous n'avez pas encore de compte sur <strong style={{ color: C.primary }}>{(application as any).name}</strong>.\n </DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem' }}>\n <div style={{ padding: '1rem', backgroundColor: C.gray100, borderRadius: '0.5rem', marginBottom: '1rem', fontSize: '0.875rem', color: C.gray500 }}>\n Votre compte <strong style={{ color: C.primary }}>iam.ollaid.com</strong> existe déjà. Cliquez sur Confirmer pour créer votre accès à <strong style={{ color: C.gray900 }}>{(application as any).name}</strong>.\n </div>\n {renderError()}\n <Button onClick={handleGrantAccess} disabled={isSubmitting} style={{ width: '100%', marginTop: '0.75rem' }}>\n {isSubmitting ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n Création en cours...\n </span>\n ) : 'Confirmer la création de mon compte'}\n </Button>\n <Button variant=\"outline\" onClick={() => { resetAuth(); setStep('choice'); }} disabled={isSubmitting} style={{ width: '100%', marginTop: '0.5rem' }}>\n Annuler\n </Button>\n </div>\n </>\n\n /* ===================== ALIAS DISABLED ===================== */\n ) : alternativeMethod ? (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={{ ...iconCircle(C.amberBg), width: '4rem', height: '4rem' }}>\n {alternativeMethod.type === 'email' ? (\n <IconMail style={{ width: '2rem', height: '2rem', color: C.amber }} />\n ) : (\n <IconPhone style={{ width: '2rem', height: '2rem', color: C.amber }} />\n )}\n </div>\n <DialogTitle>Moyen de connexion désactivé</DialogTitle>\n <DialogDescription>\n Vos identifiants sont corrects, mais vous avez désactivé ce moyen de connexion depuis votre compte IAM.\n </DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem' }}>\n {alternativeMethod.value && (\n <div style={{ padding: '1rem', backgroundColor: C.gray100, borderRadius: '0.5rem', marginBottom: '1rem' }}>\n <p style={{ fontSize: '0.875rem', color: C.gray500, marginBottom: '0.75rem' }}>Vous pouvez vous connecter avec :</p>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', fontSize: '0.875rem', fontWeight: 500, color: C.gray900 }}>\n {alternativeMethod.type === 'phone' ? (\n <IconPhone style={{ width: '1rem', height: '1rem', color: C.primary }} />\n ) : (\n <IconMail style={{ width: '1rem', height: '1rem', color: C.primary }} />\n )}\n <span>{alternativeMethod.value}</span>\n </div>\n </div>\n )}\n <Button onClick={() => {\n if (alternativeMethod.type === 'phone') setStep('phone-input');\n else setStep('email-check');\n resetAuth();\n }} style={{ width: '100%' }}>\n {alternativeMethod.type === 'phone' ? 'Se connecter par téléphone' : 'Se connecter par email'}\n </Button>\n <Button variant=\"outline\" onClick={() => window.open('https://iam.ollaid.com', '_blank')} style={{ width: '100%', marginTop: '0.5rem' }}>\n Réactiver depuis iam.ollaid.com\n </Button>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)} style={{ width: '100%', marginTop: '0.5rem' }}>\n Annuler\n </Button>\n </div>\n </>\n\n /* ===================== MAIN STEPS ===================== */\n ) : (\n <>\n {step !== 'choice' && renderBackBtn()}\n\n {/* ===== CHOICE ===== */}\n {step === 'choice' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.gray100)}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Connexion</DialogTitle>\n <DialogDescription>Choisissez votre méthode de connexion</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {renderError()}\n {/* Email */}\n <Button variant=\"outline\" onClick={() => setStep('email-check')} style={methodBtnStyle}>\n <div style={methodIconStyle(C.accent)}>\n <IconMail style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 500, color: C.gray900 }}>Adresse email</div>\n <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Connexion avec email</div>\n </div>\n </Button>\n {/* Phone */}\n <Button variant=\"outline\" onClick={() => setStep('phone-input')} style={methodBtnStyle}>\n <div style={methodIconStyle(C.accent)}>\n <IconPhone style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 500, color: C.gray900 }}>\n Numéro de téléphone <span style={{ color: C.gray500 }}>(Sénégal)</span>\n </div>\n <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Connexion avec code SMS</div>\n </div>\n </Button>\n {/* Access OTP */}\n <Button variant=\"outline\" onClick={() => setStep('access-otp')} style={methodBtnStyle}>\n <div style={methodIconStyle(C.primary)}>\n <IconKeyRound style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 500, color: C.gray900 }}>Accès OTP</div>\n <div style={{ fontSize: '0.75rem', color: C.gray500 }}>Disponible sur le backoffice IAM</div>\n </div>\n </Button>\n\n {/* Forgot password */}\n <div style={{ textAlign: 'center', fontSize: '0.875rem', paddingTop: '0.5rem' }}>\n <span style={{ color: C.gray500 }}>Mot de passe oublié ? </span>\n <button type=\"button\" style={linkStyle} onClick={() => setShowPasswordRecovery(true)}>Récupérer</button>\n </div>\n\n {/* Separator */}\n <div style={{ position: 'relative', padding: '0.5rem 0' }}>\n <div style={{ position: 'absolute', inset: 0, display: 'flex', alignItems: 'center' }}>\n <span style={{ width: '100%', borderTop: `1px solid ${C.gray200}` }} />\n </div>\n </div>\n\n {/* Signup link */}\n {showSwitchToSignup && (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* ===== EMAIL CHECK ===== */}\n {step === 'email-check' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconMail style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Connexion par email</DialogTitle>\n <DialogDescription>Entrez votre adresse email</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label htmlFor=\"email\">Adresse email</Label>\n <Input id=\"email\" type=\"email\" placeholder=\"vous@exemple.com\" value={email}\n onChange={e => setEmail(e.target.value)} disabled={isSubmitting}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); handleEmailCheck(); } }}\n />\n </div>\n <div style={{ textAlign: 'right' }}>\n <button type=\"button\" style={{ ...linkStyle, fontSize: '0.75rem' }} onClick={() => setShowPasswordRecovery(true)}>\n Mot de passe oublié ?\n </button>\n </div>\n {renderLoaderBtn('Continuer', 'Vérification...', handleEmailCheck, !email.trim())}\n {showSwitchToSignup && (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* ===== EMAIL PASSWORD ===== */}\n {step === 'email-password' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconLock style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n {userName && <DialogTitle>Bonjour {userName} 👋</DialogTitle>}\n <DialogDescription>{email}</DialogDescription>\n </DialogHeader>\n <form onSubmit={handleEmailPasswordSubmit} style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n <Label htmlFor=\"password\">Mot de passe</Label>\n <button type=\"button\" style={{ ...linkStyle, fontSize: '0.75rem' }} onClick={() => setShowPasswordRecovery(true)}>\n Mot de passe oublié ?\n </button>\n </div>\n <div style={{ position: 'relative' }}>\n <Input id=\"password\" type={showPassword ? 'text' : 'password'} placeholder=\"••••••••\" value={password}\n onChange={e => setPassword(e.target.value)} disabled={isSubmitting}\n style={{ paddingRight: '2.5rem' }}\n />\n <button type=\"button\" onClick={() => setShowPassword(!showPassword)}\n style={{ position: 'absolute', right: 0, top: 0, height: '100%', padding: '0 0.75rem', background: 'none', border: 'none', cursor: 'pointer' }}>\n {showPassword ? (\n <IconEyeOff style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n ) : (\n <IconEye style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n )}\n </button>\n </div>\n </div>\n <Button type=\"submit\" disabled={isSubmitting || !password} style={{ width: '100%' }}>\n {isSubmitting ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n Connexion...\n </span>\n ) : 'Se connecter'}\n </Button>\n </form>\n </>\n )}\n\n {/* ===== EMAIL OTP ===== */}\n {step === 'email-otp' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Vérification</DialogTitle>\n <DialogDescription>\n Un code de vérification a été envoyé à<br />\n <strong style={{ color: C.gray900 }}>{email}</strong>\n </DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <OTPInput value={emailOtpCode} onChange={setEmailOtpCode} disabled={isSubmitting} />\n {renderResendLink()}\n {renderLoaderBtn('Vérifier', 'Vérification...', handleEmailOtpVerify, emailOtpCode.length !== 6)}\n </div>\n </>\n )}\n\n {/* ===== PHONE INPUT ===== */}\n {step === 'phone-input' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconPhone style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Connexion par téléphone</DialogTitle>\n <DialogDescription>Entrez votre numéro pour recevoir un code SMS</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label>Indicatif</Label>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', padding: '0.75rem', backgroundColor: C.gray100, borderRadius: '0.375rem' }}>\n <span style={{ fontSize: '1.125rem' }}>🇸🇳</span>\n <span style={{ fontWeight: 500, color: C.gray900 }}>Sénégal (+221)</span>\n </div>\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label htmlFor=\"login-phone\">Numéro de téléphone</Label>\n <Input id=\"login-phone\" type=\"tel\" placeholder=\"77 123 45 67\" value={phone}\n onChange={e => { const val = e.target.value.replace(/\\D/g, '').slice(0, 9); setPhone(val); }}\n disabled={isSubmitting} maxLength={9}\n onKeyDown={e => { if (e.key === 'Enter') { e.preventDefault(); handlePhoneInit(); } }}\n />\n <p style={{ fontSize: '0.75rem', color: C.gray500 }}>9 chiffres requis ({phone.replace(/\\D/g, '').length}/9)</p>\n </div>\n {renderLoaderBtn('Recevoir le code SMS', 'Envoi en cours...', handlePhoneInit, phone.replace(/\\D/g, '').length !== 9)}\n {showSwitchToSignup && (\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n <span style={{ color: C.gray500 }}>Pas encore de compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToSignup}>Inscrivez-vous</button>\n </div>\n )}\n </div>\n </>\n )}\n\n {/* ===== PHONE OTP ===== */}\n {step === 'phone-otp' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconPhone style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Vérification</DialogTitle>\n <DialogDescription>\n Un code a été envoyé au{' '}\n <strong style={{ color: C.gray900 }}>+221 {phone.slice(0, 2)}***{phone.slice(-2)}</strong>\n </DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <OTPInput value={phoneOtpCode} onChange={setPhoneOtpCode} disabled={isSubmitting} />\n {renderResendLink()}\n {renderLoaderBtn('Se connecter', 'Vérification...', handlePhoneVerify, phoneOtpCode.length !== 6)}\n </div>\n </>\n )}\n\n {/* ===== ACCESS OTP ===== */}\n {step === 'access-otp' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary)}>\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Code d'accès</DialogTitle>\n <DialogDescription>Entrez le code d'accès à 8 chiffres</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.25rem' }}>\n <Label>Code d'accès (8 chiffres)</Label>\n <Input type=\"text\" inputMode=\"numeric\" placeholder=\"0000-0000\" value={accessOtpCode}\n onChange={e => setAccessOtpCode(e.target.value.replace(/\\D/g, '').slice(0, 8))}\n disabled={isSubmitting}\n style={{ textAlign: 'center', fontSize: '1.5rem', letterSpacing: '0.15em', fontFamily: 'monospace' }}\n maxLength={8}\n />\n </div>\n {renderLoaderBtn('Se connecter', 'Vérification...', handleAccessOtpSubmit, accessOtpCode.length !== 8)}\n </div>\n </>\n )}\n </>\n )}\n </DialogContent>\n </Dialog>\n\n <PasswordRecoveryModal\n open={showPasswordRecovery}\n onOpenChange={setShowPasswordRecovery}\n onSuccess={() => setShowPasswordRecovery(false)}\n saasApiUrl={saasApiUrl}\n iamApiUrl={iamApiUrl}\n \n />\n </>\n );\n}\n\nexport default LoginModal;\n","/**\n * Phone Input component for @ollaid/native-sso\n */\n\nimport React from 'react';\n\ninterface PhoneInputProps {\n value: string;\n onChange: (value: string) => void;\n ccphone?: string;\n onCcphoneChange?: (value: string) => void;\n disabled?: boolean;\n error?: string;\n placeholder?: string;\n lockCcphone?: boolean;\n}\n\nconst SUPPORTED_COUNTRIES = [\n { code: '+221', name: 'Sénégal', flag: '🇸🇳', digits: 9 },\n { code: '+229', name: 'Bénin', flag: '🇧🇯', digits: 8 },\n { code: '+225', name: \"Côte d'Ivoire\", flag: '🇨🇮', digits: 10 },\n { code: '+228', name: 'Togo', flag: '🇹🇬', digits: 8 },\n { code: '+237', name: 'Cameroun', flag: '🇨🇲', digits: 9 },\n { code: '+33', name: 'France', flag: '🇫🇷', digits: 9 },\n];\n\nexport function PhoneInput({\n value, onChange, ccphone = '+221', onCcphoneChange, disabled = false, error, placeholder = '77 123 45 67', lockCcphone = false,\n}: PhoneInputProps) {\n const selectedCountry = SUPPORTED_COUNTRIES.find(c => c.code === ccphone) || SUPPORTED_COUNTRIES[0];\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const cleaned = e.target.value.replace(/\\D/g, '');\n onChange(cleaned.slice(0, selectedCountry.digits));\n };\n\n const formatPhone = (phone: string): string => {\n if (phone.length <= 2) return phone;\n if (phone.length <= 5) return `${phone.slice(0, 2)} ${phone.slice(2)}`;\n if (phone.length <= 7) return `${phone.slice(0, 2)} ${phone.slice(2, 5)} ${phone.slice(5)}`;\n return `${phone.slice(0, 2)} ${phone.slice(2, 5)} ${phone.slice(5, 7)} ${phone.slice(7)}`;\n };\n\n return (\n <div>\n <div style={{\n display: 'flex', alignItems: 'center', border: `2px solid ${error ? '#ef4444' : '#d1d5db'}`,\n borderRadius: '0.5rem', overflow: 'hidden', opacity: disabled ? 0.5 : 1,\n backgroundColor: disabled ? '#f3f4f6' : 'white',\n }}>\n {onCcphoneChange && !lockCcphone ? (\n <select\n value={ccphone}\n onChange={(e) => onCcphoneChange(e.target.value)}\n disabled={disabled}\n style={{ padding: '0.75rem', backgroundColor: '#f9fafb', borderRight: '1px solid #e5e7eb', fontWeight: 500, color: '#374151', outline: 'none', border: 'none' }}\n >\n {SUPPORTED_COUNTRIES.map((c) => (\n <option key={c.code} value={c.code}>{c.flag} {c.code}</option>\n ))}\n </select>\n ) : (\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', padding: '0.75rem', backgroundColor: '#f9fafb', borderRight: '1px solid #e5e7eb' }}>\n <span style={{ fontSize: '1.125rem' }}>{selectedCountry.flag}</span>\n <span style={{ fontWeight: 500, color: '#374151' }}>{selectedCountry.code}</span>\n </div>\n )}\n <input\n type=\"tel\"\n inputMode=\"numeric\"\n value={formatPhone(value)}\n onChange={handleChange}\n disabled={disabled}\n placeholder={placeholder}\n style={{ flex: 1, padding: '0.75rem', fontSize: '1.125rem', border: 'none', outline: 'none', backgroundColor: 'transparent' }}\n />\n </div>\n {error && <p style={{ fontSize: '0.875rem', color: '#ef4444', marginTop: '0.25rem' }}>{error}</p>}\n <p style={{ fontSize: '0.75rem', color: '#6b7280', marginTop: '0.25rem' }}>\n {selectedCountry.digits} chiffres requis ({value.length}/{selectedCountry.digits})\n </p>\n </div>\n );\n}\n\nexport default PhoneInput;\n","/**\n * Apps Logo Slider for @ollaid/native-sso\n */\n\nimport { useEffect, useRef, useState } from 'react';\nimport { getNativeAuthConfig } from '../services/api';\n\ninterface AppsLogoSliderProps {\n speed?: 'slow' | 'normal' | 'fast';\n className?: string;\n iamApiUrl?: string;\n}\n\ninterface AppInfo { id: number; name: string; logo: string | null; }\n\nexport function AppsLogoSlider({ speed = 'normal', className = '', iamApiUrl: iamApiUrlProp }: AppsLogoSliderProps) {\n const scrollRef = useRef<HTMLDivElement>(null);\n const [isPaused, setIsPaused] = useState(false);\n const [applications, setApplications] = useState<AppInfo[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n const speedMap = { slow: 50, normal: 30, fast: 15 };\n\n useEffect(() => {\n const resolvedIamApiUrl = iamApiUrlProp || getNativeAuthConfig().iamApiUrl;\n if (!resolvedIamApiUrl) return; // Not yet initialized, will retry when prop changes\n const fetchApps = async () => {\n try {\n const iamBaseUrl = resolvedIamApiUrl.replace('/api', '');\n const response = await fetch(`${iamBaseUrl}/api/public/applications`, { headers: { 'Accept': 'application/json' } });\n if (response.ok) {\n const data = await response.json();\n if (data.success && Array.isArray(data.data)) setApplications(data.data);\n }\n } catch { /* ignore */ } finally { setIsLoading(false); }\n };\n fetchApps();\n }, [iamApiUrlProp]);\n\n useEffect(() => {\n const container = scrollRef.current;\n if (!container || applications.length === 0) return;\n let pos = 0;\n const id = setInterval(() => {\n if (!isPaused && container) {\n pos += 1;\n if (pos >= container.scrollWidth / 2) pos = 0;\n container.scrollLeft = pos;\n }\n }, speedMap[speed]);\n return () => clearInterval(id);\n }, [isPaused, speed, applications.length]);\n\n const getLogoUrl = (logo: string | null): string | null => {\n if (!logo) return null;\n if (logo.startsWith('http')) return logo;\n const resolvedUrl = iamApiUrlProp || getNativeAuthConfig().iamApiUrl;\n return `${resolvedUrl.replace('/api', '')}/storage/applications/${logo}`;\n };\n\n if (isLoading) {\n return (\n <div className={className} style={{ overflow: 'hidden' }}>\n <div style={{ display: 'flex', gap: '1rem', padding: '0.5rem 0' }}>\n {[1, 2, 3, 4, 5].map((i) => (\n <div key={i} style={{ flexShrink: 0, display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '0.5rem' }}>\n <div style={{ width: '3rem', height: '3rem', borderRadius: '0.75rem', backgroundColor: '#e5e7eb' }} />\n <div style={{ width: '2.5rem', height: '0.75rem', borderRadius: '0.25rem', backgroundColor: '#e5e7eb' }} />\n </div>\n ))}\n </div>\n </div>\n );\n }\n\n if (applications.length === 0) return null;\n\n const displayApps = [...applications, ...applications];\n\n return (\n <div\n className={className}\n style={{ position: 'relative', overflow: 'hidden' }}\n onMouseEnter={() => setIsPaused(true)}\n onMouseLeave={() => setIsPaused(false)}\n >\n <div ref={scrollRef} style={{ display: 'flex', gap: '1rem', overflow: 'hidden', padding: '0.5rem 0' }}>\n {displayApps.map((app, index) => {\n const logoUrl = getLogoUrl(app.logo);\n return (\n <div key={`${app.id}-${index}`} style={{ flexShrink: 0, display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '0.5rem' }}>\n <div style={{ width: '3rem', height: '3rem', borderRadius: '0.75rem', display: 'flex', alignItems: 'center', justifyContent: 'center', boxShadow: '0 1px 3px rgba(0,0,0,0.1)', backgroundColor: 'white', border: '1px solid #f3f4f6' }}>\n {logoUrl ? (\n <img src={logoUrl} alt={app.name} style={{ width: '2.5rem', height: '2.5rem', objectFit: 'contain', borderRadius: '0.5rem' }} />\n ) : (\n <span style={{ fontWeight: 700, fontSize: '1.125rem', color: 'hsl(var(--primary, 222 47% 11%))' }}>\n {app.name.charAt(0).toUpperCase()}\n </span>\n )}\n </div>\n <span style={{ fontSize: '0.75rem', color: '#6b7280', fontWeight: 500 }}>{app.name}</span>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n\nexport default AppsLogoSlider;\n","/**\n * Service d'inscription Mobile SSO v1.0\n * Architecture Frontend-First : Appels directs à l'IAM via nativeAuth\n * \n * @version 1.0.0\n */\n\nimport { nativeAuthService } from './nativeAuth';\nimport { \n ApiError, \n fetchWithTimeout, \n getHeaders,\n getNativeAuthConfig, \n isDebugMode,\n} from './api';\n\nimport type {\n MobileRegistrationFormData,\n MobileVerifyOtpResponse,\n MobileRegistrationCompleteResponse,\n MobileResendOtpResponse,\n} from '../types/mobile';\nimport type { NativeInitResponse } from '../types/native';\n\nexport const mobileRegistrationService = {\n /**\n * Init registration via nativeAuth.register() (Frontend-First)\n */\n async init(\n data: Omit<MobileRegistrationFormData, 'password' | 'password_confirmation'>\n ): Promise<NativeInitResponse> {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n\n return nativeAuthService.register({\n name: data.name,\n email: data.email,\n ccphone: data.ccphone,\n phone: data.phone,\n town: data.town,\n country: data.country,\n registration_type: data.registration_type,\n });\n },\n\n /**\n * Verify OTP via nativeAuth.validate()\n */\n async verifyOtp(\n processToken: string,\n otpCode: string\n ): Promise<MobileVerifyOtpResponse> {\n const config = getNativeAuthConfig();\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate (registration OTP)');\n }\n\n return fetchWithTimeout<MobileVerifyOtpResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n otp_code: otpCode,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Complete registration with password\n */\n async complete(\n processToken: string,\n password: string\n ): Promise<MobileRegistrationCompleteResponse> {\n const config = getNativeAuthConfig();\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate (registration complete)');\n }\n\n return fetchWithTimeout<MobileRegistrationCompleteResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n password,\n password_confirmation: password,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Complete phone-only registration (no password)\n */\n async completePhoneOnly(\n processToken: string\n ): Promise<MobileRegistrationCompleteResponse> {\n const config = getNativeAuthConfig();\n\n if (isDebugMode()) {\n console.log('📤 [IAM] POST /iam/native/validate (phone-only complete)');\n }\n\n return fetchWithTimeout<MobileRegistrationCompleteResponse>(\n `${config.iamApiUrl}/iam/native/validate`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n process_token: processToken,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Resend OTP\n */\n async resendOtp(processToken: string): Promise<MobileResendOtpResponse> {\n return nativeAuthService.resendOtp(processToken) as unknown as MobileResendOtpResponse;\n },\n};\n\nexport default mobileRegistrationService;\n","/**\n * Hook d'inscription Mobile SSO v1.0\n * Gère le flow: init → verify-otp → complete\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useRef } from 'react';\nimport { mobileRegistrationService } from '../services/mobileRegistration';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport { setNativeAuthConfig } from '../services/api';\nimport type { \n MobileRegistrationFormData,\n AccountType,\n} from '../types/mobile';\n\ninterface RegistrationConflict {\n type: 'email' | 'phone';\n masked_identifier: string;\n options: {\n can_login: boolean;\n can_recover_by_email: boolean;\n can_recover_by_sms: boolean;\n masked_email?: string;\n masked_phone?: string;\n };\n}\n\ninterface RegistrationState {\n processToken: string | null;\n status: 'idle' | 'pending_otp' | 'pending_password' | 'pending_registration' | 'completed';\n loading: boolean;\n error: string | null;\n conflict: RegistrationConflict | null;\n}\n\nfunction getErrorMessage(err: unknown, context: string): string {\n if (err instanceof Error) {\n if (err.message.includes('fetch') || err.message.includes('network')) {\n return 'Vérifiez votre connexion Internet';\n }\n if (err.message.includes('timeout')) {\n return 'Le serveur met trop de temps à répondre';\n }\n return err.message;\n }\n return `Erreur lors de ${context}`;\n}\n\nexport interface UseMobileRegistrationOptions {\n saasApiUrl: string;\n iamApiUrl: string;\n \n}\n\nexport function useMobileRegistration(options?: UseMobileRegistrationOptions) {\n const configuredRef = useRef(false);\n\n useEffect(() => {\n if (options && !configuredRef.current) {\n setNativeAuthConfig({ \n saasApiUrl: options.saasApiUrl, \n iamApiUrl: options.iamApiUrl,\n });\n configuredRef.current = true;\n }\n }, [options]);\n\n const [state, setState] = useState<RegistrationState>({\n processToken: null,\n status: 'idle',\n loading: false,\n error: null,\n conflict: null,\n });\n\n const [formData, setFormData] = useState<Partial<MobileRegistrationFormData>>({});\n const [accountType, setAccountType] = useState<AccountType>('email');\n\n const updateFormData = useCallback((data: Partial<MobileRegistrationFormData>) => {\n setFormData(prev => ({ ...prev, ...data }));\n }, []);\n\n const initRegistration = useCallback(async (\n data: Omit<MobileRegistrationFormData, 'password' | 'password_confirmation'>\n ) => {\n setState(prev => ({ ...prev, loading: true, error: null, conflict: null }));\n \n const enrichedData = {\n ...data,\n email: accountType === 'phone-only' ? '' : data.email,\n registration_type: accountType === 'phone-only' ? 'phone' as const : 'email' as const,\n };\n \n setFormData(enrichedData);\n\n try {\n if (!nativeAuthService.hasCredentials()) {\n await nativeAuthService.loadCredentials();\n }\n\n const response = await mobileRegistrationService.init(enrichedData);\n\n if (response.success && response.process_token) {\n setState(prev => ({\n ...prev,\n processToken: response.process_token!,\n status: 'pending_otp',\n loading: false,\n conflict: null,\n }));\n return { \n success: true, \n otp_code_dev: response.otp_code_dev,\n otp_method: response.otp_method,\n otp_sent_to: response.otp_sent_to,\n };\n }\n\n if (response.conflict) {\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Ce compte existe déjà',\n conflict: response.conflict!,\n }));\n return { success: false, error_type: response.error_type };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de l\\'inscription',\n conflict: null,\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'l\\'inscription');\n setState(prev => ({ ...prev, loading: false, error: message, conflict: null }));\n return { success: false };\n }\n }, [accountType]);\n\n const verifyOtp = useCallback(async (otpCode: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.verifyOtp(state.processToken, otpCode);\n\n if (response.success) {\n if (response.status === 'completed' && response.callback_token) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true, completed: true, callback_token: response.callback_token };\n }\n\n setState(prev => ({ ...prev, status: 'pending_password', loading: false }));\n return { success: true, completed: false };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Code incorrect',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'la vérification');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const completeRegistration = useCallback(async (password: string) => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.complete(state.processToken, password);\n\n if (response.success && response.callback_token) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true, callback_token: response.callback_token };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de la finalisation',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'la finalisation');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const completePhoneOnlyRegistration = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.completePhoneOnly(state.processToken);\n\n if (response.success && response.callback_token) {\n setState(prev => ({ ...prev, status: 'completed', loading: false }));\n return { success: true, callback_token: response.callback_token };\n }\n\n setState(prev => ({\n ...prev,\n loading: false,\n error: response.message || 'Erreur lors de la finalisation',\n }));\n return { success: false, error_type: response.error_type };\n } catch (err) {\n const message = getErrorMessage(err, 'la finalisation');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const resendOtp = useCallback(async () => {\n if (!state.processToken) {\n return { success: false, error: 'Session invalide' };\n }\n setState(prev => ({ ...prev, loading: true, error: null }));\n try {\n const response = await mobileRegistrationService.resendOtp(state.processToken);\n setState(prev => ({ ...prev, loading: false }));\n return { \n success: response.success, \n cooldown: response.cooldown_remaining,\n otp_code_dev: response.otp_code_dev,\n };\n } catch (err) {\n const message = getErrorMessage(err, 'le renvoi');\n setState(prev => ({ ...prev, loading: false, error: message }));\n return { success: false };\n }\n }, [state.processToken]);\n\n const reset = useCallback(() => {\n setState({\n processToken: null,\n status: 'idle',\n loading: false,\n error: null,\n conflict: null,\n });\n setFormData({});\n setAccountType('email');\n }, []);\n\n const clearError = useCallback(() => {\n setState(prev => ({ ...prev, error: null, conflict: null }));\n }, []);\n\n return {\n processToken: state.processToken,\n status: state.status,\n formData,\n loading: state.loading,\n error: state.error,\n conflict: state.conflict,\n isCompleted: state.status === 'completed',\n hasConflict: state.conflict !== null,\n \n accountType,\n setAccountType,\n isPhoneOnly: accountType === 'phone-only',\n\n updateFormData,\n initRegistration,\n verifyOtp,\n completeRegistration,\n completePhoneOnlyRegistration,\n resendOtp,\n reset,\n clearError,\n };\n}\n\nexport default useMobileRegistration;\n","/**\n * Signup Modal for @ollaid/native-sso — Design aligned with web SSO\n * Full signup flow: intro → account-type → info → OTP → password → confirm → success\n * \n * @version 1.0.0\n */\n\nimport { useState, useEffect } from 'react';\nimport {\n Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription,\n Button, Input, Label,\n IconShieldCheck, IconCheckCircle2, IconMail, IconSmartphone, IconArrowLeft,\n IconKeyRound, IconLock, IconLoader2,\n IconHome, IconCalendar, IconBell, IconMessageCircle, IconUsers, IconSettings,\n} from './ui';\nimport PhoneInput from './PhoneInput';\nimport OTPInput from './OTPInput';\nimport AppsLogoSlider from './AppsLogoSlider';\nimport { useMobileRegistration } from '../hooks/useMobileRegistration';\nimport { nativeAuthService } from '../services/nativeAuth';\nimport type { UserInfos } from '../types/native';\n\ntype SignupStep = 'intro' | 'account-type' | 'info' | 'otp' | 'password' | 'confirm';\n\nexport interface SignupModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSwitchToLogin: () => void;\n onSignupSuccess: (token: string, user: UserInfos) => void;\n saasApiUrl: string;\n iamApiUrl: string;\n /** Type de compte par défaut à persister dans localStorage */\n defaultAccountType?: 'user' | 'client';\n}\n\nconst C = {\n primary: '#002147',\n accent: '#e8430a',\n green: '#16a34a',\n greenBg: '#dcfce7',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n gray900: '#111827',\n red: '#dc2626',\n redBg: '#fef2f2',\n amber: '#f59e0b',\n amberBg: '#fef3c7',\n white: '#ffffff',\n} as const;\n\nconst iconCircle = (bg: string, size = '3rem'): React.CSSProperties => ({\n margin: '0 auto', width: size, height: size, backgroundColor: bg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n});\n\nconst backBtnStyle: React.CSSProperties = {\n position: 'absolute', left: '1rem', top: '1rem', background: 'none', border: 'none',\n cursor: 'pointer', padding: '0.5rem', borderRadius: '0.375rem', color: C.gray700, zIndex: 10,\n};\n\nconst linkStyle: React.CSSProperties = {\n color: C.primary, cursor: 'pointer', background: 'none', border: 'none',\n fontWeight: 500, textDecoration: 'underline', fontSize: '0.875rem',\n};\n\nconst TOTAL_STEPS = 6;\n\nfunction StepIndicator({ current }: { current: number }) {\n return (\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginTop: '0.75rem' }}>\n {Array.from({ length: TOTAL_STEPS }, (_, i) => (\n <div key={i} style={{\n width: i + 1 === current ? '1.5rem' : '0.5rem',\n height: '0.5rem',\n borderRadius: '9999px',\n backgroundColor: i + 1 <= current ? C.accent : C.gray200,\n transition: 'all 0.2s',\n }} />\n ))}\n <span style={{ fontSize: '0.75rem', color: C.gray500, marginLeft: '0.5rem' }}>Étape {current}/{TOTAL_STEPS}</span>\n </div>\n );\n}\n\n// Orbit success animation\nfunction SuccessOrbit() {\n const orbitIcons = [IconHome, IconCalendar, IconBell, IconMessageCircle, IconUsers, IconSettings];\n return (\n <div style={{ position: 'relative', width: '10rem', height: '10rem', margin: '0 auto' }}>\n {/* Center shield */}\n <div style={{\n position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)',\n width: '4rem', height: '4rem', backgroundColor: C.greenBg, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center', zIndex: 2,\n }}>\n <IconShieldCheck style={{ width: '2rem', height: '2rem', color: C.green }} />\n </div>\n {/* Orbiting icons */}\n {orbitIcons.map((Icon, i) => {\n const angle = (i * 360) / orbitIcons.length;\n return (\n <div key={i} style={{\n position: 'absolute', top: '50%', left: '50%', width: '2rem', height: '2rem',\n transform: `rotate(${angle}deg) translate(4rem) rotate(-${angle}deg)`,\n transformOrigin: '0 0',\n animation: `spin ${8 + i}s linear infinite`,\n }}>\n <div style={{\n width: '2rem', height: '2rem', backgroundColor: C.gray100, borderRadius: '50%',\n display: 'flex', alignItems: 'center', justifyContent: 'center',\n }}>\n <Icon style={{ width: '1rem', height: '1rem', color: C.gray500 }} />\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n\nexport function SignupModal({ open, onOpenChange, onSwitchToLogin, onSignupSuccess, saasApiUrl, iamApiUrl, defaultAccountType }: SignupModalProps) {\n const {\n status, formData, loading: regLoading, error: regError, accountType, setAccountType, isPhoneOnly,\n updateFormData, initRegistration, verifyOtp, completeRegistration, resendOtp, reset: resetReg, clearError,\n } = useMobileRegistration({ saasApiUrl, iamApiUrl });\n\n const [step, setStep] = useState<SignupStep>('intro');\n const [otpCode, setOtpCode] = useState('');\n const [password, setPassword] = useState('');\n const [passwordConfirm, setPasswordConfirm] = useState('');\n const [localError, setLocalError] = useState<string | null>(null);\n const [resendCooldown, setResendCooldown] = useState(0);\n const [signupSuccess, setSignupSuccess] = useState(false);\n const [signupData, setSignupData] = useState<{ token: string; user: UserInfos } | null>(null);\n\n const error = localError || regError;\n\n useEffect(() => { if (!open) { setStep('intro'); setOtpCode(''); setPassword(''); setPasswordConfirm(''); setLocalError(null); setSignupSuccess(false); setSignupData(null); setResendCooldown(0); resetReg(); } }, [open]);\n useEffect(() => { if (status === 'pending_otp') { setStep('otp'); setResendCooldown(60); } else if (status === 'pending_password') setStep('password'); }, [status]);\n useEffect(() => { if (resendCooldown > 0) { const t = setTimeout(() => setResendCooldown(r => r - 1), 1000); return () => clearTimeout(t); } }, [resendCooldown]);\n useEffect(() => { if (signupSuccess && signupData) { const t = setTimeout(() => onSignupSuccess(signupData.token, signupData.user), 2000); return () => clearTimeout(t); } }, [signupSuccess, signupData]);\n\n const exchangeCallbackToken = async (callbackToken: string) => {\n try {\n const response = await nativeAuthService.exchange(callbackToken);\n if (response.success && response.token) {\n setSignupData({ token: response.token, user: response.user as UserInfos });\n setSignupSuccess(true);\n } else setLocalError(\"Erreur lors de la finalisation de l'inscription\");\n } catch { setLocalError('Erreur de connexion au serveur'); }\n };\n\n const handleInfoSubmit = async (e: React.FormEvent) => {\n e.preventDefault(); setLocalError(null); clearError();\n if (!formData.name?.trim()) { setLocalError('Le nom est requis'); return; }\n if (!isPhoneOnly && !formData.email?.trim()) { setLocalError(\"L'adresse email est requise\"); return; }\n if (!formData.phone?.trim() || (formData.phone?.length || 0) < 6) { setLocalError('Numéro de téléphone invalide'); return; }\n if (isPhoneOnly && formData.ccphone !== '+221') { setLocalError(\"L'inscription par téléphone est réservée aux numéros sénégalais (+221)\"); return; }\n if (!formData.town?.trim()) { setLocalError('La ville est requise'); return; }\n if (!formData.country?.trim()) { setLocalError('Le pays est requis'); return; }\n await initRegistration({ name: formData.name || '', email: formData.email || '', ccphone: formData.ccphone || '+221', phone: formData.phone || '', town: formData.town, country: formData.country } as any);\n };\n\n const handleOTPSubmit = async () => {\n if (otpCode.length !== 6) { setLocalError('Veuillez entrer le code à 6 chiffres'); return; }\n setLocalError(null); clearError();\n const result = await verifyOtp(otpCode);\n if (result.success && result.completed && result.callback_token) await exchangeCallbackToken(result.callback_token);\n };\n\n const handlePasswordSubmit = (e: React.FormEvent) => {\n e.preventDefault(); setLocalError(null);\n if (!password || password.length < 8) { setLocalError('Le mot de passe doit contenir au moins 8 caractères'); return; }\n if (password !== passwordConfirm) { setLocalError('Les mots de passe ne correspondent pas'); return; }\n setStep('confirm');\n };\n\n const handleConfirm = async () => {\n setLocalError(null); clearError();\n const result = await completeRegistration(password);\n if (result.success && result.callback_token) await exchangeCallbackToken(result.callback_token);\n };\n\n const handleResendOTP = async () => { if (resendCooldown > 0) return; const r = await resendOtp(); if (r.success) setResendCooldown(r.cooldown || 60); };\n\n const goToStep = (s: SignupStep) => { setLocalError(null); clearError(); setStep(s); };\n\n const handleAccountTypeSelect = (type: 'email' | 'phone-only') => {\n setAccountType(type);\n if (type === 'phone-only') updateFormData({ ccphone: '+221', country: 'Sénégal', email: '' });\n goToStep('info');\n };\n\n const stepNumber = { intro: 1, 'account-type': 2, info: 3, otp: 4, password: 5, confirm: 6 }[step];\n\n const renderError = () => error ? <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.redBg, color: C.red, fontSize: '0.875rem' }}>{error}</div> : null;\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n\n {/* ===================== SUCCESS ===================== */}\n {signupSuccess && signupData ? (\n <DialogHeader style={{ textAlign: 'center' }}>\n <SuccessOrbit />\n <DialogTitle>Félicitations !</DialogTitle>\n <DialogDescription>\n Votre compte a été créé avec succès. Bienvenue {formData.name} !\n </DialogDescription>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', fontSize: '0.875rem', color: C.gray500, marginTop: '1rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} />\n Connexion automatique en cours...\n </div>\n </DialogHeader>\n ) : (\n <>\n {/* ===== INTRO ===== */}\n {step === 'intro' && (\n <>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent + '1a', '4rem')}>\n <IconShieldCheck style={{ width: '2rem', height: '2rem', color: C.accent }} />\n </div>\n <DialogTitle>Ouvrez un compte Ollaid</DialogTitle>\n <DialogDescription>Un compte unique qui vous donne accès à toutes les applications</DialogDescription>\n </DialogHeader>\n <AppsLogoSlider iamApiUrl={iamApiUrl} />\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', fontSize: '0.875rem', color: C.gray500, margin: '1rem 0' }}>\n {['Un seul compte pour toutes les applications', 'Plus besoin de multiples mots de passe', 'Connexion simplifiée et sécurisée'].map(text => (\n <div key={text} style={{ display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <IconCheckCircle2 style={{ width: '1.25rem', height: '1.25rem', color: C.green, flexShrink: 0 }} />\n {text}\n </div>\n ))}\n </div>\n <StepIndicator current={1} />\n <Button onClick={() => goToStep('account-type')} style={{ width: '100%', marginTop: '1rem' }}>Suivant →</Button>\n <div style={{ textAlign: 'center', fontSize: '0.875rem', marginTop: '1rem' }}>\n <span style={{ color: C.gray500 }}>Déjà un compte ? </span>\n <button type=\"button\" style={linkStyle} onClick={onSwitchToLogin}>Connectez-vous</button>\n </div>\n </>\n )}\n\n {/* ===== ACCOUNT TYPE ===== */}\n {step === 'account-type' && (\n <>\n <button onClick={() => goToStep('intro')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.gray100)}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Choisissez votre type de compte</DialogTitle>\n </DialogHeader>\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', marginTop: '1rem' }}>\n <button type=\"button\" onClick={() => handleAccountTypeSelect('email')}\n style={{ width: '100%', padding: '1rem', border: `2px solid ${C.gray200}`, borderRadius: '0.5rem', textAlign: 'left', cursor: 'pointer', background: C.white, display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <div style={{ width: '2.5rem', height: '2.5rem', backgroundColor: C.accent, borderRadius: '0.5rem', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\n <IconMail style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 600, color: C.gray900 }}>Email + Téléphone</div>\n <div style={{ fontSize: '0.875rem', color: C.gray500 }}>Compte complet</div>\n </div>\n </button>\n <button type=\"button\" onClick={() => handleAccountTypeSelect('phone-only')}\n style={{ width: '100%', padding: '1rem', border: `2px solid ${C.gray200}`, borderRadius: '0.5rem', textAlign: 'left', cursor: 'pointer', background: C.white, display: 'flex', alignItems: 'center', gap: '0.75rem' }}>\n <div style={{ width: '2.5rem', height: '2.5rem', backgroundColor: C.accent, borderRadius: '0.5rem', display: 'flex', alignItems: 'center', justifyContent: 'center', flexShrink: 0 }}>\n <IconSmartphone style={{ width: '1.25rem', height: '1.25rem', color: C.white }} />\n </div>\n <div>\n <div style={{ fontWeight: 600, color: C.gray900 }}>Téléphone uniquement</div>\n <div style={{ fontSize: '0.875rem', color: C.gray500 }}>🇸🇳 Sénégal uniquement</div>\n </div>\n </button>\n </div>\n <StepIndicator current={2} />\n </>\n )}\n\n {/* ===== INFO ===== */}\n {step === 'info' && (\n <>\n <button onClick={() => goToStep('account-type')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary + '1a')}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Créer votre compte</DialogTitle>\n </DialogHeader>\n {isPhoneOnly && (\n <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.accent + '1a', color: C.accent, fontSize: '0.8125rem', marginTop: '0.5rem', textAlign: 'center' }}>\n 📱 Inscription par téléphone — 🇸🇳 Sénégal uniquement\n </div>\n )}\n {!isPhoneOnly && (\n <div style={{ padding: '0.75rem', borderRadius: '0.375rem', backgroundColor: C.amberBg, color: '#92400e', fontSize: '0.8125rem', marginTop: '0.5rem', textAlign: 'center' }}>\n ⚠️ Un code OTP sera envoyé par email pour vérification\n </div>\n )}\n <form onSubmit={handleInfoSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', marginTop: '0.75rem' }}>\n {renderError()}\n <div><Label>Nom complet</Label><Input placeholder=\"Jean Dupont\" value={formData.name || ''} onChange={e => updateFormData({ name: e.target.value })} disabled={regLoading} /></div>\n {!isPhoneOnly && <div><Label>Adresse email</Label><Input type=\"email\" placeholder=\"vous@exemple.com\" value={formData.email || ''} onChange={e => updateFormData({ email: e.target.value })} disabled={regLoading} /></div>}\n <div><Label>Numéro de téléphone</Label><PhoneInput value={formData.phone || ''} onChange={p => updateFormData({ phone: p })} ccphone={formData.ccphone || '+221'} onCcphoneChange={c => updateFormData({ ccphone: c })} disabled={regLoading} lockCcphone={isPhoneOnly} /></div>\n <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '0.75rem' }}>\n <div><Label>Ville</Label><Input placeholder=\"Dakar\" value={formData.town || ''} onChange={e => updateFormData({ town: e.target.value })} disabled={regLoading} /></div>\n <div><Label>Pays</Label><Input placeholder=\"Sénégal\" value={formData.country || ''} onChange={e => updateFormData({ country: e.target.value })} disabled={regLoading || isPhoneOnly} /></div>\n </div>\n <StepIndicator current={3} />\n <Button type=\"submit\" disabled={regLoading} style={{ width: '100%' }}>\n {regLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n </span>\n ) : 'Continuer'}\n </Button>\n </form>\n </>\n )}\n\n {/* ===== OTP ===== */}\n {step === 'otp' && (\n <>\n <button onClick={() => goToStep('info')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconKeyRound style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Vérification</DialogTitle>\n <DialogDescription>Entrez le code envoyé {isPhoneOnly ? `au ${formData.ccphone} ${formData.phone}` : `à ${formData.email}`}</DialogDescription>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '1rem' }}>\n {renderError()}\n <OTPInput value={otpCode} onChange={setOtpCode} disabled={regLoading} />\n <div style={{ textAlign: 'center', fontSize: '0.875rem' }}>\n {resendCooldown > 0 ? <span style={{ color: C.gray500 }}>Renvoyer dans {resendCooldown}s</span> : <button type=\"button\" onClick={handleResendOTP} style={linkStyle}>Code non reçu ? Renvoyer</button>}\n </div>\n <StepIndicator current={4} />\n <Button onClick={handleOTPSubmit} disabled={regLoading || otpCode.length !== 6} style={{ width: '100%' }}>\n {regLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Vérification...\n </span>\n ) : 'Vérifier'}\n </Button>\n </div>\n </>\n )}\n\n {/* ===== PASSWORD ===== */}\n {step === 'password' && (\n <>\n <button onClick={() => goToStep('otp')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.accent)}>\n <IconLock style={{ width: '1.5rem', height: '1.5rem', color: C.white }} />\n </div>\n <DialogTitle>Créer un mot de passe</DialogTitle>\n </DialogHeader>\n <form onSubmit={handlePasswordSubmit} style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem', marginTop: '0.75rem' }}>\n {renderError()}\n <div><Label>Mot de passe</Label><Input type=\"password\" placeholder=\"Minimum 8 caractères\" value={password} onChange={e => setPassword(e.target.value)} disabled={regLoading} /></div>\n <div><Label>Confirmer le mot de passe</Label><Input type=\"password\" placeholder=\"••••••••\" value={passwordConfirm} onChange={e => setPasswordConfirm(e.target.value)} disabled={regLoading} /></div>\n <StepIndicator current={5} />\n <Button type=\"submit\" disabled={regLoading} style={{ width: '100%' }}>Continuer</Button>\n </form>\n </>\n )}\n\n {/* ===== CONFIRM ===== */}\n {step === 'confirm' && (\n <>\n <button onClick={() => goToStep('password')} style={backBtnStyle} type=\"button\">\n <IconArrowLeft style={{ width: '1rem', height: '1rem' }} />\n </button>\n <DialogHeader style={{ textAlign: 'center' }}>\n <div style={iconCircle(C.primary + '1a')}>\n <IconShieldCheck style={{ width: '1.5rem', height: '1.5rem', color: C.primary }} />\n </div>\n <DialogTitle>Confirmer votre inscription</DialogTitle>\n </DialogHeader>\n <div style={{ marginTop: '1rem', display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n {renderError()}\n <div style={{ backgroundColor: C.gray100, borderRadius: '0.5rem', padding: '1rem' }}>\n {[['Nom', formData.name], ...(!isPhoneOnly ? [['Email', formData.email]] : []), ['Téléphone', `${formData.ccphone} ${formData.phone}`], ['Ville', formData.town], ['Pays', formData.country]].map(([label, value]) => (\n <div key={label as string} style={{ display: 'flex', justifyContent: 'space-between', padding: '0.375rem 0' }}>\n <span style={{ fontSize: '0.875rem', color: C.gray500 }}>{label}</span>\n <span style={{ fontSize: '0.875rem', fontWeight: 500 }}>{value as string}</span>\n </div>\n ))}\n </div>\n <StepIndicator current={6} />\n <Button onClick={handleConfirm} disabled={regLoading} style={{ width: '100%' }}>\n {regLoading ? (\n <span style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>\n <IconLoader2 style={{ width: '1rem', height: '1rem' }} /> Création du compte...\n </span>\n ) : 'Créer mon compte'}\n </Button>\n </div>\n </>\n )}\n </>\n )}\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default SignupModal;\n","/**\n * OnboardingModal — Post-login modal for missing profile info\n * Asks for photo + phone if not present in user_infos\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback } from 'react';\nimport { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, Button, Label } from './ui';\nimport { PhoneInput } from './PhoneInput';\nimport type { NativeUser } from '../types/native';\n\n// Design tokens matching package modals\nconst C = {\n primary: '#002147',\n accent: '#e8430a',\n gray100: '#f3f4f6',\n gray200: '#e5e7eb',\n gray500: '#6b7280',\n gray700: '#374151',\n white: '#ffffff',\n} as const;\n\nexport interface OnboardingModalProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n user: NativeUser;\n /** Called with updated data when user submits */\n onComplete: (data: { image_url?: string; ccphone?: string; phone?: string; email?: string }) => void;\n /** Called when user skips onboarding */\n onSkip: () => void;\n}\n\nexport function OnboardingModal({ open, onOpenChange, user, onComplete, onSkip }: OnboardingModalProps) {\n const needsPhoto = !user.image_url;\n const needsPhone = !user.phone;\n const needsEmail = !user.email;\n\n const [photoPreview, setPhotoPreview] = useState<string>('');\n const [photoFile, setPhotoFile] = useState<File | null>(null);\n const [ccphone, setCcphone] = useState(user.ccphone || '+221');\n const [phone, setPhone] = useState(user.phone || '');\n const [email, setEmail] = useState('');\n const [confirmed, setConfirmed] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n\n const [fileError, setFileError] = useState('');\n\n const handleFileChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n\n // Validation taille max 2 Mo\n if (file.size > 2 * 1024 * 1024) {\n setFileError('Le fichier dépasse 2 Mo. Veuillez choisir une image plus légère.');\n e.target.value = '';\n return;\n }\n setFileError('');\n setPhotoFile(file);\n const reader = new FileReader();\n reader.onload = () => setPhotoPreview(reader.result as string);\n reader.readAsDataURL(file);\n }, []);\n\n const canSubmit = confirmed && (\n (needsPhoto ? !!photoPreview : true) &&\n (needsPhone ? phone.length >= 7 : true)\n );\n\n const handleSubmit = useCallback(() => {\n if (!canSubmit) return;\n setSubmitting(true);\n \n const data: { image_url?: string; ccphone?: string; phone?: string; email?: string } = {};\n if (needsPhoto && photoPreview) {\n data.image_url = photoPreview;\n }\n if (needsPhone && phone) {\n data.ccphone = ccphone;\n data.phone = phone;\n }\n if (needsEmail && email.trim()) {\n data.email = email.trim();\n }\n \n onComplete(data);\n }, [canSubmit, needsPhoto, needsPhone, needsEmail, photoPreview, ccphone, phone, email, onComplete]);\n\n // Shield check icon inline\n const ShieldIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={C.accent} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent>\n <DialogHeader>\n <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem', marginBottom: '0.25rem' }}>\n <ShieldIcon />\n <DialogTitle>Complétez votre profil</DialogTitle>\n </div>\n <DialogDescription>\n Ajoutez les informations manquantes pour finaliser votre compte.\n </DialogDescription>\n </DialogHeader>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: '1.25rem', marginTop: '1rem' }}>\n {/* Photo upload */}\n {needsPhoto && (\n <div>\n <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n Photo de profil\n </Label>\n <div style={{ display: 'flex', alignItems: 'center', gap: '1rem' }}>\n {/* Preview circle */}\n <div style={{\n width: '4rem',\n height: '4rem',\n borderRadius: '50%',\n backgroundColor: C.gray100,\n border: `2px dashed ${C.gray200}`,\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}>\n {photoPreview ? (\n <img src={photoPreview} alt=\"Preview\" style={{ width: '100%', height: '100%', objectFit: 'cover' }} />\n ) : (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={C.gray500} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"12\" cy=\"8\" r=\"4\" />\n <path d=\"M5.5 21a8.38 8.38 0 0 1 13 0\" />\n </svg>\n )}\n </div>\n {/* File input */}\n <div style={{ flex: 1 }}>\n <label style={{\n display: 'inline-block',\n padding: '0.5rem 1rem',\n backgroundColor: C.gray100,\n border: `1px solid ${C.gray200}`,\n borderRadius: '0.375rem',\n cursor: 'pointer',\n fontSize: '0.875rem',\n color: C.gray700,\n fontWeight: 500,\n }}>\n Choisir une photo\n <input\n type=\"file\"\n accept=\"image/*\"\n onChange={handleFileChange}\n style={{ display: 'none' }}\n />\n </label>\n <p style={{ fontSize: '0.75rem', color: fileError ? '#dc2626' : C.gray500, marginTop: '0.25rem' }}>\n {fileError || 'JPG, PNG. Max 2 Mo.'}\n </p>\n </div>\n </div>\n </div>\n )}\n\n {/* Phone input */}\n {needsPhone && (\n <div>\n <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n Numéro de téléphone\n </Label>\n <PhoneInput\n value={phone}\n onChange={setPhone}\n ccphone={ccphone}\n onCcphoneChange={setCcphone}\n />\n </div>\n )}\n\n {/* Email input — optional, not blocking */}\n {needsEmail && (\n <div>\n <Label style={{ display: 'block', marginBottom: '0.5rem', color: C.gray700, fontWeight: 500 }}>\n Adresse email <span style={{ color: C.gray500, fontWeight: 400 }}>(optionnel)</span>\n </Label>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"email@exemple.com\"\n style={{\n width: '100%',\n height: '2.5rem',\n padding: '0 0.75rem',\n border: `1px solid ${C.gray200}`,\n borderRadius: '0.375rem',\n fontSize: '0.875rem',\n color: C.gray700,\n backgroundColor: C.white,\n outline: 'none',\n }}\n />\n </div>\n )}\n\n {/* Confirmation checkbox */}\n <label style={{\n display: 'flex',\n alignItems: 'flex-start',\n gap: '0.5rem',\n cursor: 'pointer',\n fontSize: '0.875rem',\n color: C.gray700,\n }}>\n <input\n type=\"checkbox\"\n checked={confirmed}\n onChange={(e) => setConfirmed(e.target.checked)}\n style={{\n width: '1rem',\n height: '1rem',\n marginTop: '0.125rem',\n accentColor: C.primary,\n cursor: 'pointer',\n }}\n />\n <span>Je confirme que ces informations sont exactes</span>\n </label>\n\n {/* Actions */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>\n <Button\n onClick={handleSubmit}\n disabled={!canSubmit || submitting}\n style={{ width: '100%', height: '2.75rem', opacity: canSubmit && !submitting ? 1 : 0.5 }}\n >\n {submitting ? 'Enregistrement...' : 'Valider'}\n </Button>\n <Button\n variant=\"outline\"\n onClick={onSkip}\n disabled={submitting}\n style={{ width: '100%', height: '2.75rem' }}\n >\n Passer pour l'instant\n </Button>\n </div>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport default OnboardingModal;\n","/**\n * DebugPanel — Panneau de debug flottant pour @ollaid/native-sso\n * Affiche l'historique des appels API en temps réel (style terminal)\n * N'apparaît que quand debug=true\n * @version 1.0.0\n */\n\nimport { useState, useEffect, useCallback } from 'react';\nimport { subscribeToLogs, clearApiLogs, exportLogsAsText, type ApiCallLog } from '../services/debugLogger';\n\ninterface DebugPanelProps {\n saasApiUrl: string;\n iamApiUrl: string;\n}\n\nexport function DebugPanel({ saasApiUrl, iamApiUrl }: DebugPanelProps) {\n const [logs, setLogs] = useState<ApiCallLog[]>([]);\n const [expanded, setExpanded] = useState(true);\n const [selectedLog, setSelectedLog] = useState<string | null>(null);\n\n useEffect(() => {\n return subscribeToLogs(setLogs);\n }, []);\n\n const handleCopy = useCallback(() => {\n const text = exportLogsAsText();\n navigator.clipboard?.writeText(text).catch(() => {});\n }, []);\n\n const handleClear = useCallback(() => {\n clearApiLogs();\n setSelectedLog(null);\n }, []);\n\n const statusColor = (status: number | null) => {\n if (status === null) return '#f59e0b';\n if (status >= 200 && status < 300) return '#22c55e';\n return '#ef4444';\n };\n\n const statusEmoji = (status: number | null) => {\n if (status === null) return '⏳';\n if (status >= 200 && status < 300) return '✅';\n return '❌';\n };\n\n const selected = selectedLog ? logs.find(l => l.id === selectedLog) : null;\n\n return (\n <div style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n zIndex: 99999,\n fontFamily: 'monospace',\n fontSize: '12px',\n }}>\n {/* Header bar */}\n <div\n onClick={() => setExpanded(!expanded)}\n style={{\n background: '#1a1a2e',\n color: '#e2e8f0',\n padding: '6px 12px',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n cursor: 'pointer',\n borderTop: '2px solid #6366f1',\n }}\n >\n <span>🔐 Debug SSO — {logs.length} appel{logs.length > 1 ? 's' : ''}</span>\n <div style={{ display: 'flex', gap: '8px', alignItems: 'center' }}>\n {expanded && (\n <>\n <button onClick={(e) => { e.stopPropagation(); handleCopy(); }}\n style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: 'pointer', fontSize: '11px' }}>\n 📋 Copier\n </button>\n <button onClick={(e) => { e.stopPropagation(); handleClear(); }}\n style={{ background: '#334155', color: '#e2e8f0', border: 'none', borderRadius: '4px', padding: '2px 8px', cursor: 'pointer', fontSize: '11px' }}>\n 🗑️ Effacer\n </button>\n </>\n )}\n <span>{expanded ? '▼' : '▲'}</span>\n </div>\n </div>\n\n {/* Body */}\n {expanded && (\n <div style={{\n background: '#0f0f23',\n color: '#e2e8f0',\n maxHeight: '300px',\n overflowY: 'auto',\n }}>\n {/* Config bar */}\n <div style={{ padding: '4px 12px', background: '#1e1e3f', fontSize: '10px', color: '#94a3b8', display: 'flex', gap: '16px' }}>\n <span>SaaS: <span style={{ color: '#6366f1' }}>{saasApiUrl}</span></span>\n <span>IAM: <span style={{ color: '#6366f1' }}>{iamApiUrl}</span></span>\n </div>\n\n {logs.length === 0 ? (\n <div style={{ padding: '20px', textAlign: 'center', color: '#64748b' }}>\n Aucun appel API. Tentez une connexion pour voir les logs.\n </div>\n ) : (\n <div>\n {logs.map(log => (\n <div key={log.id}>\n <div\n onClick={() => setSelectedLog(selectedLog === log.id ? null : log.id)}\n style={{\n padding: '4px 12px',\n borderBottom: '1px solid #1e293b',\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n background: selectedLog === log.id ? '#1e293b' : 'transparent',\n }}\n >\n <span>{statusEmoji(log.responseStatus)}</span>\n <span style={{\n background: log.method === 'GET' ? '#22c55e' : '#3b82f6',\n color: '#fff',\n padding: '0 4px',\n borderRadius: '2px',\n fontSize: '10px',\n fontWeight: 'bold',\n }}>{log.method}</span>\n <span style={{ flex: 1, overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {log.endpoint}\n </span>\n <span style={{ color: statusColor(log.responseStatus), minWidth: '30px' }}>\n {log.responseStatus ?? '...'}\n </span>\n <span style={{ color: '#64748b', minWidth: '50px', textAlign: 'right' }}>\n {log.duration ? `${log.duration}ms` : '...'}\n </span>\n </div>\n\n {/* Detail view */}\n {selectedLog === log.id && selected && (\n <div style={{ padding: '8px 12px 8px 32px', background: '#111827', borderBottom: '1px solid #1e293b' }}>\n <div style={{ color: '#94a3b8', marginBottom: '4px' }}>\n ⏰ {new Date(log.timestamp).toLocaleTimeString()}\n </div>\n {log.requestBody ? (\n <div style={{ marginBottom: '4px' }}>\n <div style={{ color: '#6366f1', fontSize: '10px' }}>REQUEST:</div>\n <pre style={{ color: '#cbd5e1', whiteSpace: 'pre-wrap', wordBreak: 'break-all', margin: 0, maxHeight: '80px', overflow: 'auto' }}>\n {JSON.stringify(log.requestBody, null, 2)}\n </pre>\n </div>\n ) : null}\n {log.responseBody ? (\n <div>\n <div style={{ color: '#6366f1', fontSize: '10px' }}>RESPONSE:</div>\n <pre style={{ color: '#cbd5e1', whiteSpace: 'pre-wrap', wordBreak: 'break-all', margin: 0, maxHeight: '120px', overflow: 'auto' }}>\n {JSON.stringify(log.responseBody, null, 2)}\n </pre>\n </div>\n ) : null}\n {log.error && (\n <div style={{ color: '#ef4444', marginTop: '4px' }}>⚠️ {log.error}</div>\n )}\n </div>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default DebugPanel;\n","/**\n * NativeSSOPage — Page autonome complète pour @ollaid/native-sso\n * Design aligné sur /sso/auth (fond primary, card blanche, ShieldCheck branding)\n * \n * @version 1.0.0\n */\n\nimport { useState, useCallback, useEffect, useMemo } from 'react';\nimport { LoginModal } from './LoginModal';\nimport { SignupModal } from './SignupModal';\nimport { OnboardingModal } from './OnboardingModal';\nimport AppsLogoSlider from './AppsLogoSlider';\nimport { DebugPanel } from './DebugPanel';\nimport { Button } from './ui';\nimport { STORAGE_KEYS } from '../services/api';\nimport { useNativeAuth } from '../hooks/useNativeAuth';\nimport type { UserInfos, NativeUser } from '../types/native';\n\nexport interface NativeSSOPageProps {\n /** URL du Backend SaaS */\n saasApiUrl: string;\n /** URL du Backend IAM */\n iamApiUrl: string;\n /** Callback après login/signup réussi — reçoit le token et l'utilisateur */\n onLoginSuccess?: (token: string, user: UserInfos) => void;\n /** Callback après logout */\n onLogout?: () => void;\n /** Callback quand l'utilisateur complète l'onboarding (photo/phone) */\n onOnboardingComplete?: (data: { image_url?: string; ccphone?: string; phone?: string }) => void;\n /** Type de compte à persister dans localStorage (défaut: 'user') */\n accountType?: 'user' | 'client';\n /**\n * Préfixe de configuration IAM côté backend (défaut: 'iam').\n * Permet le multi-tenant : 'iam', 'iam_vendor', 'iam_client', 'iam_admin', etc.\n */\n configPrefix?: string;\n /** Titre personnalisé */\n title?: string;\n /** Description personnalisée */\n description?: string;\n /** Logo URL personnalisé */\n logoUrl?: string;\n /** Masquer le footer \"Propulsé par\" */\n hideFooter?: boolean;\n /** Route vers laquelle rediriger après un login réussi (via window.location.href) */\n redirectAfterLogin?: string;\n /** Route vers laquelle rediriger après un logout (via window.location.href) */\n redirectAfterLogout?: string;\n}\n\ntype ModalState = 'none' | 'login' | 'signup';\n\n// Design tokens matching /sso/auth\nconst COLORS = {\n primary: '#002147',\n primaryForeground: '#ffffff',\n accent: '#e8430a',\n card: '#ffffff',\n cardForeground: '#1a2332',\n muted: '#6b7280',\n border: '#e5e7eb',\n shadow: '0 10px 25px -5px rgba(0,0,0,0.2)',\n} as const;\n\n// Light mode CSS variables to force on mount\nconst LIGHT_VARS: Record<string, string> = {\n \"--background\": \"40 20% 96%\",\n \"--foreground\": \"220 15% 15%\",\n \"--card\": \"0 0% 100%\",\n \"--card-foreground\": \"220 15% 15%\",\n \"--popover\": \"0 0% 100%\",\n \"--popover-foreground\": \"220 15% 15%\",\n \"--primary\": \"209 100% 13%\",\n \"--primary-foreground\": \"0 0% 100%\",\n \"--secondary\": \"40 15% 92%\",\n \"--secondary-foreground\": \"220 15% 25%\",\n \"--muted\": \"40 10% 90%\",\n \"--muted-foreground\": \"220 10% 50%\",\n \"--accent\": \"16 99% 52%\",\n \"--accent-foreground\": \"0 0% 100%\",\n \"--destructive\": \"0 84.2% 60.2%\",\n \"--destructive-foreground\": \"210 40% 98%\",\n \"--border\": \"40 15% 88%\",\n \"--input\": \"40 15% 88%\",\n \"--ring\": \"209 100% 13%\",\n};\n\n// Shield check SVG inline (no lucide dependency needed)\nconst ShieldCheckIcon = () => (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={COLORS.accent} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n);\n\n/** Check if user needs onboarding (missing photo or phone) */\nfunction needsOnboarding(user: NativeUser | UserInfos): boolean {\n return !user.image_url || !user.phone;\n}\n\nexport function NativeSSOPage({\n saasApiUrl,\n iamApiUrl,\n onLoginSuccess,\n onLogout,\n onOnboardingComplete,\n accountType = 'user',\n configPrefix = 'iam',\n title = 'Un compte, plusieurs accès',\n description = 'Connectez-vous avec votre compte Ollaid pour accéder à toutes les applications partenaires.',\n logoUrl,\n hideFooter = false,\n redirectAfterLogin,\n redirectAfterLogout,\n}: NativeSSOPageProps) {\n const [modal, setModal] = useState<ModalState>('none');\n const [showOnboarding, setShowOnboarding] = useState(false);\n const [pendingSession, setPendingSession] = useState<{ token: string; user: NativeUser } | null>(null);\n const [session, setSession] = useState<{ token: string; user: NativeUser } | null>(() => {\n try {\n const token = localStorage.getItem(STORAGE_KEYS.AUTH_TOKEN) || localStorage.getItem(STORAGE_KEYS.TOKEN);\n const userStr = localStorage.getItem(STORAGE_KEYS.USER);\n if (token && userStr) return { token, user: JSON.parse(userStr) };\n } catch {}\n return null;\n });\n\n // Utiliser le hook pour obtenir isDebug réactif (se met à jour après loadCredentials)\n const { isDebug: resolvedDebug } = useNativeAuth({ saasApiUrl, iamApiUrl, configPrefix, autoLoadCredentials: true });\n\n // Force light mode CSS variables (same pattern as /sso/auth)\n useEffect(() => {\n const root = document.documentElement;\n const originalValues: Record<string, string> = {};\n \n Object.keys(LIGHT_VARS).forEach((key) => {\n originalValues[key] = root.style.getPropertyValue(key);\n });\n Object.entries(LIGHT_VARS).forEach(([key, value]) => {\n root.style.setProperty(key, value);\n });\n root.classList.add('light');\n root.classList.remove('dark');\n root.style.colorScheme = 'light';\n\n // Empêcher le navigateur d'appliquer son dark mode natif (scrollbars, formulaires, etc.)\n const meta = document.createElement('meta');\n meta.name = 'color-scheme';\n meta.content = 'light';\n document.head.appendChild(meta);\n\n return () => {\n Object.entries(originalValues).forEach(([key, value]) => {\n if (value) root.style.setProperty(key, value);\n else root.style.removeProperty(key);\n });\n root.classList.remove('light');\n root.style.colorScheme = '';\n meta.remove();\n };\n }, []);\n\n const openLogin = useCallback(() => setModal('login'), []);\n const openSignup = useCallback(() => setModal('signup'), []);\n const closeModal = useCallback(() => setModal('none'), []);\n\n const switchToSignup = useCallback(() => {\n setModal('none');\n setTimeout(() => setModal('signup'), 150);\n }, []);\n\n const switchToLogin = useCallback(() => {\n setModal('none');\n setTimeout(() => setModal('login'), 150);\n }, []);\n\n const handleLoginSuccess = useCallback((token: string, user: UserInfos) => {\n // Build NativeUser-compatible object from UserInfos\n const userObj: NativeUser = {\n reference: '',\n name: user.name,\n email: user.email || undefined,\n phone: user.phone,\n ccphone: user.ccphone,\n image_url: user.image_url,\n account_type: (user as any).account_type || 'user',\n };\n \n setModal('none');\n \n // Check if onboarding needed\n if (needsOnboarding(userObj)) {\n setPendingSession({ token, user: userObj });\n setShowOnboarding(true);\n } else {\n setSession({ token, user: userObj });\n onLoginSuccess?.(token, user);\n if (redirectAfterLogin) window.location.href = redirectAfterLogin;\n }\n }, [onLoginSuccess, redirectAfterLogin]);\n\n const handleOnboardingComplete = useCallback((data: { image_url?: string; ccphone?: string; phone?: string }) => {\n if (!pendingSession) return;\n \n // Merge onboarding data into user\n const updatedUser = { ...pendingSession.user, ...data };\n \n // Update localStorage\n localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(updatedUser));\n \n setShowOnboarding(false);\n setSession({ token: pendingSession.token, user: updatedUser });\n setPendingSession(null);\n \n onOnboardingComplete?.(data);\n onLoginSuccess?.(pendingSession.token, updatedUser as unknown as UserInfos);\n if (redirectAfterLogin) window.location.href = redirectAfterLogin;\n }, [pendingSession, onLoginSuccess, onOnboardingComplete, redirectAfterLogin]);\n\n const handleOnboardingSkip = useCallback(() => {\n if (!pendingSession) return;\n \n setShowOnboarding(false);\n setSession(pendingSession);\n setPendingSession(null);\n \n onLoginSuccess?.(pendingSession.token, pendingSession.user as unknown as UserInfos);\n if (redirectAfterLogin) window.location.href = redirectAfterLogin;\n }, [pendingSession, onLoginSuccess, redirectAfterLogin]);\n\n const handleLogout = useCallback(() => {\n localStorage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.TOKEN);\n localStorage.removeItem(STORAGE_KEYS.USER);\n localStorage.removeItem(STORAGE_KEYS.ACCOUNT_TYPE);\n localStorage.removeItem(STORAGE_KEYS.ALIAS_REFERENCE);\n setSession(null);\n onLogout?.();\n if (redirectAfterLogout) window.location.href = redirectAfterLogout;\n }, [onLogout, redirectAfterLogout]);\n\n // Shared styles\n const containerStyle: React.CSSProperties = {\n minHeight: '100vh',\n backgroundColor: COLORS.primary,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n padding: '1rem',\n };\n\n const cardStyle: React.CSSProperties = {\n width: '100%',\n maxWidth: '28rem',\n backgroundColor: COLORS.card,\n border: `1px solid ${COLORS.border}`,\n borderRadius: '0.75rem',\n boxShadow: COLORS.shadow,\n overflow: 'hidden',\n };\n\n const footerStyle: React.CSSProperties = {\n marginTop: '1.5rem',\n fontSize: '0.75rem',\n color: 'rgba(255,255,255,0.6)',\n textAlign: 'center' as const,\n };\n\n // Branding header (ShieldCheck + iam.ollaid.com) — inside card\n const BrandingHeader = () => (\n <div style={{ textAlign: 'center', marginBottom: '1.5rem' }}>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '0.5rem', marginBottom: '0.5rem' }}>\n <ShieldCheckIcon />\n <span style={{ fontSize: '1.125rem', fontWeight: 700, color: COLORS.primary }}>\n iam.<span style={{ color: COLORS.accent }}>ollaid</span>.com\n </span>\n </div>\n </div>\n );\n\n // Authenticated view\n if (session) {\n return (\n <div style={containerStyle}>\n {/* Apps slider */}\n <div style={{ width: '100%', maxWidth: '28rem', marginBottom: '1.5rem' }}>\n <AppsLogoSlider iamApiUrl={iamApiUrl} />\n </div>\n\n <div style={cardStyle}>\n <div style={{ padding: '2rem 1.5rem 1.5rem' }}>\n <BrandingHeader />\n <h2 style={{ fontSize: '1.25rem', fontWeight: 600, textAlign: 'center', color: COLORS.cardForeground }}>\n Bienvenue, {session.user.name}\n </h2>\n <p style={{ fontSize: '0.875rem', color: COLORS.muted, textAlign: 'center', marginTop: '0.25rem' }}>\n Vous êtes connecté à votre compte Ollaid SSO\n </p>\n <div style={{ marginTop: '1.5rem' }}>\n <Button variant=\"outline\" onClick={handleLogout} style={{ width: '100%' }}>\n Déconnexion\n </Button>\n </div>\n </div>\n </div>\n\n {!hideFooter && (\n <p style={footerStyle}>\n Géré par{' '}\n <a href=\"https://iam.ollaid.com\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: COLORS.accent, textDecoration: 'none' }}>\n iam.ollaid.com\n </a>\n {' '}— Identity Access Manager\n </p>\n )}\n </div>\n );\n }\n\n // Unauthenticated view\n return (\n <div style={containerStyle}>\n {/* Apps slider BEFORE card */}\n <div style={{ width: '100%', maxWidth: '28rem', marginBottom: '1.5rem' }}>\n {logoUrl ? (\n <img src={logoUrl} alt=\"Logo\" style={{ height: '3rem', margin: '0 auto' }} />\n ) : (\n <AppsLogoSlider iamApiUrl={iamApiUrl} />\n )}\n </div>\n\n {/* Main card */}\n <div style={cardStyle}>\n <div style={{ padding: '2rem 1.5rem 1.5rem' }}>\n <BrandingHeader />\n\n <h2 style={{ fontSize: '1.25rem', fontWeight: 600, textAlign: 'center', color: COLORS.cardForeground, marginBottom: '0.5rem' }}>\n {title}\n </h2>\n <p style={{ fontSize: '0.875rem', color: COLORS.muted, textAlign: 'center', marginBottom: '1.5rem' }}>\n {description}\n </p>\n\n {/* Action buttons */}\n <div style={{ display: 'flex', flexDirection: 'column', gap: '0.75rem' }}>\n <Button onClick={openLogin} style={{ width: '100%', height: '2.75rem' }}>\n Connexion\n </Button>\n <Button\n variant=\"outline\"\n onClick={openSignup}\n style={{\n width: '100%',\n height: '2.75rem',\n borderColor: COLORS.cardForeground,\n color: COLORS.cardForeground,\n }}\n >\n Inscription\n </Button>\n </div>\n </div>\n </div>\n\n {/* Footer */}\n {!hideFooter && (\n <p style={footerStyle}>\n Géré par{' '}\n <a href=\"https://iam.ollaid.com\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: COLORS.accent, textDecoration: 'none' }}>\n iam.ollaid.com\n </a>\n {' '}— Identity Access Manager\n </p>\n )}\n\n <LoginModal\n open={modal === 'login'}\n onOpenChange={open => { if (!open) closeModal(); }}\n onSwitchToSignup={switchToSignup}\n onLoginSuccess={handleLoginSuccess}\n saasApiUrl={saasApiUrl}\n iamApiUrl={iamApiUrl}\n defaultAccountType={accountType}\n />\n\n <SignupModal\n open={modal === 'signup'}\n onOpenChange={open => { if (!open) closeModal(); }}\n onSwitchToLogin={switchToLogin}\n onSignupSuccess={handleLoginSuccess}\n saasApiUrl={saasApiUrl}\n iamApiUrl={iamApiUrl}\n defaultAccountType={accountType}\n />\n\n {/* Onboarding modal for missing profile info */}\n {pendingSession && (\n <OnboardingModal\n open={showOnboarding}\n onOpenChange={(open) => { if (!open) handleOnboardingSkip(); }}\n user={pendingSession.user}\n onComplete={handleOnboardingComplete}\n onSkip={handleOnboardingSkip}\n />\n )}\n\n {resolvedDebug && <DebugPanel saasApiUrl={saasApiUrl} iamApiUrl={iamApiUrl} />}\n </div>\n );\n}\n\nexport default NativeSSOPage;\n","/**\n * NativeSSOProvider — React Context pour @ollaid/native-sso\n * Centralise la configuration pour les hooks et composants individuels\n * \n * @version 1.0.0\n */\n\nimport { createContext, useContext, useEffect, useRef, type ReactNode } from 'react';\nimport { setNativeAuthConfig, type NativeAuthConfig } from './services/api';\n\nexport interface NativeSSOConfig {\n /** URL du Backend SaaS (ex: https://mon-saas.com/api) */\n saasApiUrl: string;\n /** URL du Backend IAM (ex: https://identityam.ollaid.com/api) */\n iamApiUrl: string;\n /** Timeout en ms (défaut: 30000) */\n timeout?: number;\n /** Mode debug (logs console) */\n debug?: boolean;\n}\n\nconst NativeSSOContext = createContext<NativeSSOConfig | null>(null);\n\nexport interface NativeSSOProviderProps {\n config: NativeSSOConfig;\n children: ReactNode;\n}\n\n/**\n * Provider React pour centraliser la config SSO.\n * \n * Usage :\n * ```tsx\n * <NativeSSOProvider config={{ saasApiUrl: '...', iamApiUrl: '...' }}>\n * <App />\n * </NativeSSOProvider>\n * ```\n */\nexport function NativeSSOProvider({ config, children }: NativeSSOProviderProps) {\n const configuredRef = useRef(false);\n\n useEffect(() => {\n if (!configuredRef.current) {\n setNativeAuthConfig(config);\n configuredRef.current = true;\n }\n }, [config]);\n\n return (\n <NativeSSOContext.Provider value={config}>\n {children}\n </NativeSSOContext.Provider>\n );\n}\n\n/**\n * Hook pour accéder à la config SSO depuis le Provider.\n * Optionnel : les hooks acceptent aussi la config en paramètre.\n */\nexport function useNativeSSOConfig(): NativeSSOConfig {\n const ctx = useContext(NativeSSOContext);\n if (!ctx) {\n throw new Error('useNativeSSOConfig doit être utilisé dans un <NativeSSOProvider>');\n }\n return ctx;\n}\n\nexport default NativeSSOProvider;\n","/**\n * Service IAM Account — APIs server-to-server\n * link-phone, link-email, refresh-user-info, update-avatar, reset-avatar\n * \n * ⚠️ ATTENTION — SERVER-TO-SERVER UNIQUEMENT\n * Ces APIs utilisent la `secret_key` de votre application IAM.\n * Elles doivent être appelées EXCLUSIVEMENT depuis un backend (Node.js, PHP, etc.).\n * Ne JAMAIS appeler ces méthodes depuis du code frontend/navigateur car la\n * secret_key serait exposée dans les DevTools réseau.\n * \n * @version 1.0.0\n */\n\nimport { fetchWithTimeout, getHeaders, getNativeAuthConfig } from './api';\nimport { nativeAuthService } from './nativeAuth';\n\nimport type {\n LinkPhoneRequest,\n LinkPhoneResponse,\n LinkEmailRequest,\n LinkEmailResponse,\n RefreshUserInfoSingleRequest,\n RefreshUserInfoSingleResponse,\n RefreshUserInfoBulkRequest,\n RefreshUserInfoBulkResponse,\n UpdateAvatarRequest,\n UpdateAvatarResponse,\n ResetAvatarRequest,\n ResetAvatarResponse,\n} from '../types/native';\n\n// ============================================\n// Helper — auto-fill credentials if available\n// ============================================\n\nfunction getCredentialsOrThrow(params: { app_key?: string; secret_key?: string }) {\n const app_key = params.app_key;\n const secret_key = params.secret_key;\n\n if (!app_key || !secret_key) {\n throw new Error('app_key et secret_key sont requis en paramètre. Ces APIs sont server-to-server et ne peuvent pas utiliser les encrypted_credentials.');\n }\n\n return { app_key, secret_key };\n}\n\n// ============================================\n// Service\n// ============================================\n\nexport const iamAccountService = {\n\n /**\n * Lier un numéro de téléphone à un compte utilisateur existant\n * POST {iamApiUrl}/iam/link-phone\n */\n async linkPhone(params: Partial<Pick<LinkPhoneRequest, 'app_key' | 'secret_key'>> & Omit<LinkPhoneRequest, 'app_key' | 'secret_key'>): Promise<LinkPhoneResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<LinkPhoneResponse>(\n `${config.iamApiUrl}/iam/link-phone`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n iam_reference: params.iam_reference,\n ccphone: params.ccphone,\n phone: params.phone,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Lier une adresse email à un compte utilisateur existant\n * POST {iamApiUrl}/iam/link-email\n */\n async linkEmail(params: Partial<Pick<LinkEmailRequest, 'app_key' | 'secret_key'>> & Omit<LinkEmailRequest, 'app_key' | 'secret_key'>): Promise<LinkEmailResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<LinkEmailResponse>(\n `${config.iamApiUrl}/iam/link-email`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n iam_reference: params.iam_reference,\n email: params.email,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Récupérer les user_infos d'un utilisateur (mode single)\n * POST {iamApiUrl}/iam/refresh-user-info\n */\n async refreshUserInfo(params: Partial<Pick<RefreshUserInfoSingleRequest, 'secret_key'>> & Omit<RefreshUserInfoSingleRequest, 'secret_key'>): Promise<RefreshUserInfoSingleResponse> {\n const config = getNativeAuthConfig();\n \n const secret_key = params.secret_key;\n\n if (!secret_key) {\n throw new Error('secret_key est requis. Chargez les credentials ou passez-la en paramètre.');\n }\n\n return fetchWithTimeout<RefreshUserInfoSingleResponse>(\n `${config.iamApiUrl}/iam/refresh-user-info`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n secret_key,\n alias_reference: params.alias_reference,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Récupérer les user_infos en bulk (max 100 alias_references)\n * POST {iamApiUrl}/iam/refresh-user-info\n */\n async refreshUserInfoBulk(params: Partial<Pick<RefreshUserInfoBulkRequest, 'secret_key'>> & Omit<RefreshUserInfoBulkRequest, 'secret_key'>): Promise<RefreshUserInfoBulkResponse> {\n const config = getNativeAuthConfig();\n \n const secret_key = params.secret_key;\n\n if (!secret_key) {\n throw new Error('secret_key est requis. Chargez les credentials ou passez-la en paramètre.');\n }\n\n if (params.alias_references.length > 100) {\n throw new Error('Maximum 100 alias_references par requête bulk.');\n }\n\n return fetchWithTimeout<RefreshUserInfoBulkResponse>(\n `${config.iamApiUrl}/iam/refresh-user-info`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n secret_key,\n alias_references: params.alias_references,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Mettre à jour l'avatar d'un utilisateur pour une application spécifique\n * POST {iamApiUrl}/iam/update-avatar\n */\n async updateAvatar(params: Partial<Pick<UpdateAvatarRequest, 'app_key' | 'secret_key'>> & Omit<UpdateAvatarRequest, 'app_key' | 'secret_key'>): Promise<UpdateAvatarResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<UpdateAvatarResponse>(\n `${config.iamApiUrl}/iam/update-avatar`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n alias_reference: params.alias_reference,\n avatar_url: params.avatar_url,\n }),\n },\n config.timeout || 30000\n );\n },\n\n /**\n * Réinitialiser l'avatar d'un utilisateur (remettre à null pour utiliser l'image globale)\n * POST {iamApiUrl}/iam/reset-avatar\n */\n async resetAvatar(params: Partial<Pick<ResetAvatarRequest, 'app_key' | 'secret_key'>> & Omit<ResetAvatarRequest, 'app_key' | 'secret_key'>): Promise<ResetAvatarResponse> {\n const config = getNativeAuthConfig();\n const { app_key, secret_key } = getCredentialsOrThrow(params);\n\n return fetchWithTimeout<ResetAvatarResponse>(\n `${config.iamApiUrl}/iam/reset-avatar`,\n {\n method: 'POST',\n headers: getHeaders(),\n body: JSON.stringify({\n app_key,\n secret_key,\n alias_reference: params.alias_reference,\n }),\n },\n config.timeout || 30000\n );\n },\n};\n"],"names":["jsxs","jsx","createContext","useEffect","useContext","forwardRef","useRef","useState","config","getErrorMessage","useCallback","C","iconCircle","backBtnStyle","Fragment","STORAGE_KEYS","linkStyle"],"mappings":";;;;;;;AAcA,MAAM,YAAY,EAAE,OAAO,QAAQ,QAAQ,QAAQ,SAAS,aAAa,MAAM,QAAQ,QAAQ,gBAAgB,aAAa,GAAG,eAAe,SAAkB,gBAAgB,QAAA;AAEzK,SAAS,gBAAgB,OAAsC;AACpE,SACEA,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,GAAE,qKAAA,CAAqK;AAAA,IAC7KA,2BAAAA,IAAC,QAAA,EAAK,GAAE,gBAAA,CAAgB;AAAA,EAAA,GAC1B;AAEJ;AAEO,SAAS,SAAS,OAAsC;AAC7D,SACED,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,OAAM,MAAK,QAAO,MAAK,GAAE,KAAI,GAAE,KAAI,IAAG,IAAA,CAAI;AAAA,IAChDA,2BAAAA,IAAC,QAAA,EAAK,GAAE,4CAAA,CAA4C;AAAA,EAAA,GACtD;AAEJ;AAEO,SAAS,UAAU,OAAsC;AAC9D,SACEA,2BAAAA,IAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAAA,2BAAAA,IAAC,QAAA,EAAK,GAAE,gSAAA,CAAgS,EAAA,CAC1S;AAEJ;AAEO,SAAS,SAAS,OAAsC;AAC7D,SACED,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,OAAM,MAAK,QAAO,MAAK,GAAE,KAAI,GAAE,MAAK,IAAG,KAAI,IAAG,KAAI;AAAA,IACxDA,2BAAAA,IAAC,QAAA,EAAK,GAAE,2BAAA,CAA2B;AAAA,EAAA,GACrC;AAEJ;AAEO,SAAS,aAAa,OAAsC;AACjE,SACED,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,GAAE,6KAAA,CAA6K;AAAA,IACrLA,2BAAAA,IAAC,YAAO,IAAG,QAAO,IAAG,OAAM,GAAE,MAAK,MAAK,eAAA,CAAe;AAAA,EAAA,GACxD;AAEJ;AAEO,SAAS,cAAc,OAAsC;AAClE,SACED,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,GAAE,iBAAA,CAAiB;AAAA,IACzBA,2BAAAA,IAAC,QAAA,EAAK,GAAE,WAAA,CAAW;AAAA,EAAA,GACrB;AAEJ;AAEO,SAAS,QAAQ,OAAsC;AAC5D,SACED,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,GAAE,wGAAA,CAAwG;AAAA,mCAC/G,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,IAAA,CAAI;AAAA,EAAA,GAChC;AAEJ;AAEO,SAAS,WAAW,OAAsC;AAC/D,SACED,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,GAAE,iGAAA,CAAiG;AAAA,IACzGA,2BAAAA,IAAC,QAAA,EAAK,GAAE,uCAAA,CAAuC;AAAA,IAC/CA,2BAAAA,IAAC,QAAA,EAAK,GAAE,+FAAA,CAA+F;AAAA,IACvGA,2BAAAA,IAAC,QAAA,EAAK,GAAE,aAAA,CAAa;AAAA,EAAA,GACvB;AAEJ;AAEO,SAAS,iBAAiB,OAAsC;AACrE,SACED,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,+BAAC,YAAO,IAAG,MAAK,IAAG,MAAK,GAAE,MAAK;AAAA,IAC/BA,2BAAAA,IAAC,QAAA,EAAK,GAAE,gBAAA,CAAgB;AAAA,EAAA,GAC1B;AAEJ;AAEO,SAAS,YAAY,OAAsC;AAChE,SACEA,2BAAAA,IAAC,SAAK,GAAG,WAAY,GAAG,OAAO,OAAO,EAAE,WAAW,2BAA2B,GAAI,MAAM,SAAS,CAAA,KAC/F,yCAAC,QAAA,EAAK,GAAE,+BAA8B,GACxC;AAEJ;AAYO,SAAS,eAAe,OAAsC;AACnE,SACED,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,OAAM,MAAK,QAAO,MAAK,GAAE,KAAI,GAAE,KAAI,IAAG,KAAI,IAAG,KAAI;AAAA,IACvDA,2BAAAA,IAAC,QAAA,EAAK,GAAE,aAAA,CAAa;AAAA,EAAA,GACvB;AAEJ;AAEO,SAAS,SAAS,OAAsC;AAC7D,SACED,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,GAAE,6CAAA,CAA6C;AAAA,IACrDA,2BAAAA,IAAC,QAAA,EAAK,GAAE,gHAAA,CAAgH;AAAA,EAAA,GAC1H;AAEJ;AAEO,SAAS,aAAa,OAAsC;AACjE,SACED,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,GAAE,SAAA,CAAS;AAAA,IAAEA,2BAAAA,IAAC,QAAA,EAAK,GAAE,UAAA,CAAU;AAAA,IACrCA,2BAAAA,IAAC,QAAA,EAAK,OAAM,MAAK,QAAO,MAAK,GAAE,KAAI,GAAE,KAAI,IAAG,IAAA,CAAI;AAAA,IAChDA,2BAAAA,IAAC,QAAA,EAAK,GAAE,WAAA,CAAW;AAAA,EAAA,GACrB;AAEJ;AAEO,SAAS,SAAS,OAAsC;AAC7D,SACED,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,GAAE,4CAAA,CAA4C;AAAA,IACpDA,2BAAAA,IAAC,QAAA,EAAK,GAAE,iCAAA,CAAiC;AAAA,EAAA,GAC3C;AAEJ;AAEO,SAAS,kBAAkB,OAAsC;AACtE,SACEA,2BAAAA,IAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAAA,2BAAAA,IAAC,QAAA,EAAK,GAAE,iCAAA,CAAiC,EAAA,CAC3C;AAEJ;AAEO,SAAS,UAAU,OAAsC;AAC9D,SACED,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,GAAE,4CAAA,CAA4C;AAAA,mCACnD,UAAA,EAAO,IAAG,KAAI,IAAG,KAAI,GAAE,KAAI;AAAA,IAC5BA,2BAAAA,IAAC,QAAA,EAAK,GAAE,6BAAA,CAA6B;AAAA,IACrCA,2BAAAA,IAAC,QAAA,EAAK,GAAE,4BAAA,CAA4B;AAAA,EAAA,GACtC;AAEJ;AAEO,SAAS,aAAa,OAAsC;AACjE,SACED,2BAAAA,KAAC,OAAA,EAAK,GAAG,WAAY,GAAG,OACtB,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,GAAE,wjBAAA,CAAwjB;AAAA,mCAC/jB,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,IAAA,CAAI;AAAA,EAAA,GAChC;AAEJ;AAqBA,MAAM,gBAAgBC,MAAAA,cAAkC,EAAE,MAAM,OAAO,cAAc,MAAM;AAAC,GAAG;AAExF,SAAS,OAAO,EAAE,MAAM,cAAc,YAAiG;AAC5IC,QAAAA,UAAU,MAAM;AACd,QAAI,MAAM;AACR,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC,OAAO;AACL,eAAS,KAAK,MAAM,WAAW;AAAA,IACjC;AACA,WAAO,MAAM;AAAE,eAAS,KAAK,MAAM,WAAW;AAAA,IAAI;AAAA,EACpD,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,CAAC,KAAM,QAAO;AAElB,SACEF,2BAAAA,IAAC,cAAc,UAAd,EAAuB,OAAO,EAAE,MAAM,gBACpC,UACH;AAEJ;AAEO,SAAS,cAAc,EAAE,UAAU,YAAY,MAAyD;AAC7G,QAAM,EAAE,aAAA,IAAiBG,MAAAA,WAAW,aAAa;AAEjD,yCACG,OAAA,EAAI,OAAO,EAAE,UAAU,SAAS,OAAO,GAAG,QAAQ,IAAI,SAAS,QAAQ,YAAY,UAAU,gBAAgB,YAC5G,UAAA;AAAA,IAAAH,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO,EAAE,UAAU,SAAS,OAAO,GAAG,iBAAiB,kBAAA;AAAA,QACvD,SAAS,MAAM,aAAa,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,IAEnCD,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA,OAAO;AAAA,UACL,UAAU;AAAA,UAAY,QAAQ;AAAA,UAAI,OAAO;AAAA,UAAQ,UAAU;AAAA,UAC3D,QAAQ;AAAA,UAAQ,SAAS;AAAA,UAAU,cAAc;AAAA,UACjD,iBAAiB;AAAA,UAAS,WAAW;AAAA,UACrC,WAAW;AAAA,UAAQ,WAAW;AAAA,QAAA;AAAA,QAGhC,UAAA;AAAA,UAAAC,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,MAAM,aAAa,KAAK;AAAA,cACjC,OAAO,EAAE,UAAU,YAAY,OAAO,QAAQ,KAAK,QAAQ,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,WAAW,UAAU,WAAW,OAAO,WAAW,YAAY,EAAA;AAAA,cACrK,cAAW;AAAA,cACZ,UAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAGA;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACH,GACF;AAEJ;AAEO,SAAS,aAAa,EAAE,UAAU,YAAY,IAAI,SAAyF;AAChJ,SAAOA,+BAAC,OAAA,EAAI,WAAsB,OAAO,EAAE,cAAc,UAAU,GAAG,MAAA,GAAU,SAAA,CAAS;AAC3F;AAEO,SAAS,YAAY,EAAE,UAAU,YAAY,MAAyD;AAC3G,SAAOA,2BAAAA,IAAC,MAAA,EAAG,WAAsB,OAAO,EAAE,UAAU,WAAW,YAAY,KAAK,OAAO,UAAA,GAAc,SAAA,CAAS;AAChH;AAEO,SAAS,kBAAkB,EAAE,UAAU,YAAY,MAAyD;AACjH,SAAOA,2BAAAA,IAAC,KAAA,EAAE,WAAsB,OAAO,EAAE,UAAU,YAAY,OAAO,WAAW,WAAW,UAAA,GAAc,SAAA,CAAS;AACrH;AAWO,MAAM,SAASI,MAAAA,WAA2C,CAAC;AAAA,EAChE,UAAU;AAAA,EAAW,OAAO;AAAA,EAAW,YAAY;AAAA,EAAI;AAAA,EAAO;AAAA,EAAU;AAAA,EAAU,GAAG;AACvF,GAAG,QAAQ;AACT,QAAM,YAAiC;AAAA,IACrC,SAAS;AAAA,IAAe,YAAY;AAAA,IAAU,gBAAgB;AAAA,IAC9D,cAAc;AAAA,IAAU,YAAY;AAAA,IAAK,QAAQ,WAAW,gBAAgB;AAAA,IAC5E,YAAY;AAAA,IAAa,QAAQ;AAAA,IAAQ,SAAS,WAAW,MAAM;AAAA,IACnE,UAAU,SAAS,OAAO,aAAa;AAAA,IACvC,SAAS,SAAS,OAAO,qBAAqB,SAAS,OAAO,mBAAmB;AAAA,IACjF,QAAQ,SAAS,OAAO,SAAS,SAAS,OAAO,SAAS;AAAA,IAC1D,GAAI,YAAY,YAAY,EAAE,iBAAiB,WAAW,OAAO,QAAA,IAAY,CAAA;AAAA,IAC7E,GAAI,YAAY,YAAY,EAAE,iBAAiB,eAAe,QAAQ,qBAAqB,OAAO,UAAA,IAAc,CAAA;AAAA,IAChH,GAAI,YAAY,UAAU,EAAE,iBAAiB,eAAe,OAAO,UAAA,IAAc,CAAA;AAAA,IACjF,GAAG;AAAA,EAAA;AAGL,SACEJ,+BAAC,YAAO,KAAU,WAAsB,OAAO,WAAW,UAAqB,GAAG,OAC/E,SAAA,CACH;AAEJ,CAAC;AACD,OAAO,cAAc;AAMd,MAAM,QAAQI,MAAAA;AAAAA,EACnB,CAAC,EAAE,YAAY,IAAI,OAAO,GAAG,MAAA,GAAS,QAAQ;AAC5C,WACEJ,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,OAAO;AAAA,UACL,OAAO;AAAA,UAAQ,SAAS;AAAA,UAAkB,cAAc;AAAA,UACxD,QAAQ;AAAA,UAAqB,UAAU;AAAA,UAAa,SAAS;AAAA,UAC7D,YAAY;AAAA,UAAsB,iBAAiB;AAAA,UAAW,OAAO;AAAA,UACrE,GAAG;AAAA,QAAA;AAAA,QAEJ,GAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AACA,MAAM,cAAc;AAMb,MAAM,QAAQI,MAAAA;AAAAA,EACnB,CAAC,EAAE,YAAY,IAAI,OAAO,GAAG,MAAA,GAAS,QAAQ;AAC5C,WACEJ,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,OAAO,EAAE,UAAU,YAAY,YAAY,KAAK,OAAO,WAAW,GAAG,MAAA;AAAA,QACpE,GAAG;AAAA,MAAA;AAAA,IAAA;AAAA,EAGV;AACF;AACA,MAAM,cAAc;AAapB,MAAM,oBAAoBC,MAAAA,cAAqE,EAAE,OAAO,IAAI,eAAe,MAAM;AAAC,GAAG;AAE9H,SAAS,WAAW,EAAE,OAAO,eAAe,UAAU,YAAY,MAAuB;AAC9F,SACED,2BAAAA,IAAC,kBAAkB,UAAlB,EAA2B,OAAO,EAAE,OAAO,cAAA,GAC1C,UAAAA,2BAAAA,IAAC,OAAA,EAAI,WAAuB,UAAS,GACvC;AAEJ;AAEO,SAAS,eAAe,EAAE,OAAO,MAAqC;AAC3E,QAAM,EAAE,OAAO,YAAY,cAAA,IAAkBG,MAAAA,WAAW,iBAAiB;AACzE,SACEH,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL;AAAA,MACA,SAAS,eAAe;AAAA,MACxB,UAAU,MAAM,cAAc,KAAK;AAAA,MACnC,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,aAAa,UAAA;AAAA,IAAU;AAAA,EAAA;AAGrE;AAGA,IAAI,OAAO,aAAa,aAAa;AACnC,QAAM,UAAU;AAChB,MAAI,CAAC,SAAS,eAAe,OAAO,GAAG;AACrC,UAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,UAAM,KAAK;AACX,UAAM,cAAc;AACpB,aAAS,KAAK,YAAY,KAAK;AAAA,EACjC;AACF;AC9WO,SAAS,SAAS;AAAA,EACvB,SAAS;AAAA,EAAG;AAAA,EAAO;AAAA,EAAU;AAAA,EAAY,WAAW;AAAA,EAAO,YAAY;AACzE,GAAkB;AAChB,QAAM,YAAYK,MAAAA,OAAoC,EAAE;AACxD,QAAM,CAAC,aAAa,cAAc,IAAIC,MAAAA,SAAS,CAAC;AAEhDJ,QAAAA,UAAU,MAAM;AAAE,cAAU,UAAU,UAAU,QAAQ,MAAM,GAAG,MAAM;AAAA,EAAG,GAAG,CAAC,MAAM,CAAC;AAErFA,QAAAA,UAAU,MAAM;AACd,QAAI,aAAa,UAAU,QAAQ,CAAC,EAAG,WAAU,QAAQ,CAAC,EAAE,MAAA;AAAA,EAC9D,GAAG,CAAC,SAAS,CAAC;AAEdA,QAAAA,UAAU,MAAM;AACd,QAAI,MAAM,WAAW,UAAU,uBAAuB,KAAK;AAAA,EAC7D,GAAG,CAAC,OAAO,QAAQ,UAAU,CAAC;AAE9B,QAAM,eAAe,CAAC,OAAe,SAAiB;;AACpD,QAAI,SAAU;AACd,UAAM,QAAQ,KAAK,QAAQ,WAAW,EAAE;AACxC,QAAI,CAAC,MAAO;AACZ,UAAM,WAAW,MAAM,MAAM,EAAE;AAC/B,aAAS,KAAK,IAAI;AAClB,aAAS,SAAS,KAAK,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;AAC3C,QAAI,QAAQ,SAAS,GAAG;AACtB,sBAAU,QAAQ,QAAQ,CAAC,MAA3B,mBAA8B;AAC9B,qBAAe,QAAQ,CAAC;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,OAAe,MAAuC;;AAC3E,QAAI,SAAU;AACd,QAAI,EAAE,QAAQ,aAAa;AACzB,QAAE,eAAA;AACF,YAAM,WAAW,MAAM,MAAM,EAAE;AAC/B,UAAI,MAAM,KAAK,GAAG;AAChB,iBAAS,KAAK,IAAI;AAClB,iBAAS,SAAS,KAAK,EAAE,CAAC;AAAA,MAC5B,WAAW,QAAQ,GAAG;AACpB,iBAAS,QAAQ,CAAC,IAAI;AACtB,iBAAS,SAAS,KAAK,EAAE,CAAC;AAC1B,wBAAU,QAAQ,QAAQ,CAAC,MAA3B,mBAA8B;AAC9B,uBAAe,QAAQ,CAAC;AAAA,MAC1B;AAAA,IACF,WAAW,EAAE,QAAQ,eAAe,QAAQ,GAAG;AAC7C,sBAAU,QAAQ,QAAQ,CAAC,MAA3B,mBAA8B;AAC9B,qBAAe,QAAQ,CAAC;AAAA,IAC1B,WAAW,EAAE,QAAQ,gBAAgB,QAAQ,SAAS,GAAG;AACvD,sBAAU,QAAQ,QAAQ,CAAC,MAA3B,mBAA8B;AAC9B,qBAAe,QAAQ,CAAC;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,MAAwC;;AAC3D,QAAI,SAAU;AACd,MAAE,eAAA;AACF,UAAM,SAAS,EAAE,cAAc,QAAQ,MAAM,EAAE,QAAQ,WAAW,EAAE;AACpE,QAAI,QAAQ;AACV,YAAM,WAAW,OAAO,MAAM,GAAG,MAAM;AACvC,eAAS,QAAQ;AACjB,YAAM,aAAa,KAAK,IAAI,SAAS,QAAQ,SAAS,CAAC;AACvD,sBAAU,QAAQ,UAAU,MAA5B,mBAA+B;AAC/B,qBAAe,UAAU;AAAA,IAC3B;AAAA,EACF;AAEA,SACEF,+BAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,KAAK,YACjF,UAAA,MAAM,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,UAC9BA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MAEC,KAAK,CAAC,OAAQ,UAAU,QAAQ,KAAK,IAAI;AAAA,MACzC,MAAK;AAAA,MACL,WAAU;AAAA,MACV,WAAW;AAAA,MACX,OAAO,MAAM,KAAK,KAAK;AAAA,MACvB,UAAU,CAAC,MAAM,aAAa,OAAO,EAAE,OAAO,KAAK;AAAA,MACnD,WAAW,CAAC,MAAM,cAAc,OAAO,CAAC;AAAA,MACxC,SAAS;AAAA,MACT,SAAS,MAAM,eAAe,KAAK;AAAA,MACnC;AAAA,MACA,cAAY,SAAS,QAAQ,CAAC;AAAA,MAC9B,OAAO;AAAA,QACL,OAAO;AAAA,QAAU,QAAQ;AAAA,QAAQ,WAAW;AAAA,QAAU,UAAU;AAAA,QAChE,YAAY;AAAA,QAAK,cAAc;AAAA,QAAY,QAAQ;AAAA,QACnD,aAAa,gBAAgB,SAAS,CAAC,WAAW,qCAAqC,MAAM,KAAK,IAAI,2CAA2C;AAAA,QACjJ,iBAAiB,MAAM,KAAK,IAAI,4CAA4C;AAAA,QAC5E,SAAS;AAAA,QAAQ,YAAY;AAAA,QAC7B,SAAS,WAAW,MAAM;AAAA,QAAG,QAAQ,WAAW,gBAAgB;AAAA,MAAA;AAAA,IAClE;AAAA,IAnBK;AAAA,EAAA,CAqBR,GACH;AAEJ;ACzFA,MAAM,WAAW;AACjB,IAAI,UAAwB,CAAA;AAC5B,IAAI,YAA8C,CAAA;AAElD,SAAS,kBAAkB;AACzB,YAAU,QAAQ,CAAA,OAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;AAC1C;AAEO,SAAS,WACd,QACA,UACA,aACA,gBACQ;AACR,QAAM,KAAK,GAAG,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC;AACtE,QAAM,MAAkB;AAAA,IACtB;AAAA,IACA,YAAW,oBAAI,KAAA,GAAO,YAAA;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,UAAU;AAAA,EAAA;AAGZ,UAAQ,QAAQ,GAAG;AACnB,MAAI,QAAQ,SAAS,UAAU;AAC7B,cAAU,QAAQ,MAAM,GAAG,QAAQ;AAAA,EACrC;AACA,kBAAA;AACA,SAAO;AACT;AAEO,SAAS,eACd,OACA,gBACA,cACA,WACA,OACM;AACN,QAAM,MAAM,QAAQ,KAAK,CAAA,MAAK,EAAE,OAAO,KAAK;AAC5C,MAAI,KAAK;AACP,QAAI,iBAAiB;AACrB,QAAI,eAAe;AACnB,QAAI,WAAW,KAAK,IAAA,IAAQ;AAC5B,QAAI,QAAQ;AACZ,oBAAA;AAAA,EACF;AACF;AAMO,SAAS,eAAqB;AACnC,YAAU,CAAA;AACV,kBAAA;AACF;AAEO,SAAS,gBAAgB,UAAoD;AAClF,YAAU,KAAK,QAAQ;AACvB,SAAO,MAAM;AACX,gBAAY,UAAU,OAAO,CAAA,OAAM,OAAO,QAAQ;AAAA,EACpD;AACF;AAEO,SAAS,mBAA2B;AACzC,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,QAAM,QAAkB;AAAA,IACtB,IAAI,OAAO,EAAE;AAAA,IACb;AAAA,IACA,gBAAe,oBAAI,KAAA,GAAO,aAAa;AAAA,IACvC,IAAI,OAAO,EAAE;AAAA,IACb;AAAA,EAAA;AAGF,UAAQ,QAAQ,QAAA,EAAU,QAAQ,CAAC,KAAK,UAAU;AAChD,UAAM,QAAQ,IAAI,mBAAmB,OAAO,MAAO,IAAI,kBAAkB,OAAO,IAAI,iBAAiB,MAAM,MAAM;AACjH,UAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,IAAI,QAAQ,EAAE;AAClE,UAAM,KAAK,eAAe,IAAI,kBAAkB,aAAa,aAAa,IAAI,QAAQ,IAAI;AAC1F,QAAI,IAAI,YAAa,OAAM,KAAK,gBAAgB,KAAK,UAAU,IAAI,WAAW,CAAC,EAAE;AACjF,QAAI,IAAI,aAAc,OAAM,KAAK,iBAAiB,KAAK,UAAU,IAAI,YAAY,CAAC,EAAE;AACpF,QAAI,IAAI,MAAO,OAAM,KAAK,iBAAiB,IAAI,KAAK,EAAE;AACtD,UAAM,KAAK,EAAE;AAAA,EACf,CAAC;AAED,SAAO,MAAM,KAAK,IAAI;AACxB;AC9FO,MAAM,iBAAiB,MAAM;AAAA,EAMlC,YACE,SACA,MACA,YACA,WACA,UACA;AACA,UAAM,OAAO;AAZf;AACA;AACA;AACA;AAUE,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,aAAa;AAClB,SAAK,YAAY;AACjB,SAAK,WAAW;AAAA,EAClB;AACF;AAwBA,IAAI,SAA2B;AAAA,EAC7B,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,SAAS;AAAA,EACT,OAAO;AAAA,EACP,cAAc;AAChB;AAEO,MAAM,sBAAsB,CAAC,cAA+C;AACjF,WAAS,EAAE,GAAG,QAAQ,GAAG,UAAA;AAEzB,MAAI,OAAO,OAAO;AAChB,YAAQ,IAAI,iCAAiC;AAAA,MAC3C,YAAY,OAAO;AAAA,MACnB,WAAW,OAAO;AAAA,IAAA,CACnB;AAAA,EACH;AACF;AAEO,MAAM,sBAAsB,OAAyB,EAAE,GAAG,OAAA;AAE1D,MAAM,cAAc,MAAe,OAAO,UAAU;AAM3D,MAAM,gBAAgB;AAEf,MAAM,cAAc,MAAc;AACvC,MAAI,OAAO,iBAAiB,YAAa,QAAO;AAEhD,MAAI,WAAW,aAAa,QAAQ,aAAa;AACjD,MAAI,CAAC,UAAU;AACb,eAAW,OAAO,KAAK,IAAA,CAAK,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC;AAC3E,iBAAa,QAAQ,eAAe,QAAQ;AAAA,EAC9C;AACA,SAAO;AACT;AAMA,MAAM,UAAU;AAAA,EACd,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,cAAc;AAAA,EACd,iBAAiB;AACnB;AAEO,MAAM,eAAe,CAAC,UAAwB;AACnD,MAAI,OAAO,iBAAiB,aAAa;AACvC,iBAAa,QAAQ,QAAQ,YAAY,KAAK;AAC9C,iBAAa,QAAQ,QAAQ,OAAO,KAAK;AAAA,EAC3C;AACF;AAEO,MAAM,eAAe,MAAqB;AAC/C,MAAI,OAAO,iBAAiB,YAAa,QAAO;AAChD,SAAO,aAAa,QAAQ,QAAQ,UAAU,KAAK,aAAa,QAAQ,QAAQ,KAAK;AACvF;AAEO,MAAM,iBAAiB,MAAY;AACxC,MAAI,OAAO,iBAAiB,aAAa;AACvC,iBAAa,WAAW,QAAQ,UAAU;AAC1C,iBAAa,WAAW,QAAQ,KAAK;AACrC,iBAAa,WAAW,QAAQ,IAAI;AACpC,iBAAa,WAAW,QAAQ,YAAY;AAC5C,iBAAa,WAAW,QAAQ,eAAe;AAAA,EACjD;AACF;AAEO,MAAM,cAAc,CAAC,SAAwB;AAClD,MAAI,OAAO,iBAAiB,aAAa;AACvC,iBAAa,QAAQ,QAAQ,MAAM,KAAK,UAAU,IAAI,CAAC;AAAA,EACzD;AACF;AAEO,MAAM,cAAc,MAAmB;AAC5C,MAAI,OAAO,iBAAiB,YAAa,QAAO;AAChD,QAAM,OAAO,aAAa,QAAQ,QAAQ,IAAI;AAC9C,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI;AACF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB,QAAQ;AACN,iBAAa,WAAW,QAAQ,IAAI;AACpC,WAAO;AAAA,EACT;AACF;AAQO,MAAM,iBAAiB,MAAqB;AACjD,MAAI,OAAO,iBAAiB,YAAa,QAAO;AAChD,SAAO,aAAa,QAAQ,QAAQ,YAAY;AAClD;AAQA,eAAsB,iBACpB,KACA,SACA,SACY;AACZ,QAAM,aAAa,IAAI,gBAAA;AACvB,QAAM,YAAY,WAAW,MAAM,WAAW,MAAA,GAAS,OAAO;AAE9D,QAAM,SAAU,QAAQ,UAAgD;AACxE,QAAM,QAAQ,YAAA,IAAgB,WAAW,QAAQ,KAAK,QAAQ,OAAO,KAAK,MAAM,QAAQ,IAAc,IAAI,MAAS,IAAI;AACvH,QAAM,YAAY,KAAK,IAAA;AAEvB,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,KAAK;AAAA,MAChC,GAAG;AAAA,MACH,QAAQ,WAAW;AAAA,IAAA,CACpB;AAED,iBAAa,SAAS;AAEtB,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,QAAI,EAAC,2CAAa,SAAS,sBAAqB;AAC9C,YAAM,OAAO,MAAM,SAAS,KAAA;AAC5B,UAAI,eAAe;AACjB,gBAAQ,MAAM,uBAAuB,KAAK,UAAU,GAAG,GAAG,CAAC;AAC3D,YAAI,MAAO,gBAAe,OAAO,SAAS,QAAQ,EAAE,KAAK,KAAK,UAAU,GAAG,GAAG,EAAA,GAAK,WAAW,mBAAmB;AAAA,MACnH;AACA,YAAM,IAAI,SAAS,mBAAmB,SAAS,MAAM,KAAK,UAAU,SAAS,MAAM;AAAA,IACrF;AAEA,UAAM,OAAO,MAAM,SAAS,KAAA;AAE5B,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,sBAAsB,OAAO,SAAS,QAAQ,MAAM,WAAW,KAAK,OAAO;AAC/E,YAAM,IAAI;AAAA,QACR,KAAK,WAAW,UAAU,SAAS,MAAM;AAAA,QACzC,SAAS,WAAW,MAAM,SAAS,SAAS,UAAU,MAAM,WAAW;AAAA,QACvE,SAAS;AAAA,QACT,KAAK;AAAA,QACL;AAAA,MAAA;AAAA,IAEJ;AAEA,QAAI,MAAO,gBAAe,OAAO,SAAS,QAAQ,MAAM,SAAS;AACjE,WAAO;AAAA,EACT,SAAS,OAAO;AACd,iBAAa,SAAS;AAEtB,QAAI,iBAAiB,SAAU,OAAM;AAErC,QAAI,iBAAiB,OAAO;AAC1B,UAAI,MAAM,SAAS,cAAc;AAC/B,YAAI,MAAO,gBAAe,OAAO,GAAG,MAAM,WAAW,SAAS;AAC9D,cAAM,IAAI,SAAS,2BAA4B,SAAS;AAAA,MAC1D;AACA,UAAI,iBAAiB,WAAW;AAC9B,YAAI,MAAO,gBAAe,OAAO,GAAG,MAAM,WAAW,eAAe;AACpE,cAAM,IAAI,SAAS,sCAAsC,SAAS;AAAA,MACpE;AAAA,IACF;AAEA,QAAI,MAAO,gBAAe,OAAO,GAAG,MAAM,WAAW,eAAe;AACpE,UAAM,IAAI,SAAS,qBAAqB,SAAS;AAAA,EACnD;AACF;AAEO,SAAS,WAAW,OAAgB,sBAAsB,OAAoB;AACnF,QAAM,UAAuB;AAAA,IAC3B,gBAAgB;AAAA,IAChB,UAAU;AAAA,EAAA;AAGZ,QAAM,WAAW,YAAA;AACjB,MAAI,UAAU;AACZ,YAAQ,aAAa,IAAI;AAAA,EAC3B;AAGA,MAAI,uBAAuB,OAAO,cAAc;AAC9C,YAAQ,qBAAqB,IAAI,OAAO;AAAA,EAC1C;AAEA,MAAI,OAAO;AACT,YAAQ,eAAe,IAAI,UAAU,KAAK;AAAA,EAC5C;AAEA,SAAO;AACT;AC1NA,IAAI,cAAwC;AAC5C,IAAI,sBAA8B;AAClC,IAAI,iBAAyB;AAE7B,MAAM,cAAc;AACpB,MAAM,iBAAiB;AAMhB,MAAM,oBAAoB;AAAA,EAC/B,iBAA0B;AACxB,WAAO,gBAAgB;AAAA,EACzB;AAAA,EAEA,iBAA2C;AACzC,WAAO,cAAc,EAAE,GAAG,YAAA,IAAgB;AAAA,EAC5C;AAAA,EAEA,oBAA4B;AAC1B,WAAO;AAAA,EACT;AAAA,EAEA,oBAA4B;AAC1B,QAAI,CAAC,oBAAqB,QAAO;AACjC,YAAQ,KAAK,IAAA,IAAQ,uBAAuB;AAAA,EAC9C;AAAA,EAEA,6BAAsC;AACpC,QAAI,CAAC,eAAe,CAAC,oBAAqB,QAAO;AACjD,UAAM,MAAM,KAAK,kBAAA;AACjB,WAAO,OAAQ,iBAAiB;AAAA,EAClC;AAAA,EAEA,MAAM,yBAAwC;AAC5C,QAAI,CAAC,eAAe,KAAK,8BAA8B;AACrD,UAAI,eAAe;AACjB,gBAAQ,IAAI,2DAA2D;AAAA,MACzE;AACA,YAAM,KAAK,gBAAA;AAAA,IACb;AAAA,EACF;AAAA,EAEA,MAAM,kBAA8C;AAClD,UAAMO,UAAS,oBAAA;AACf,QAAI,CAACA,QAAO,YAAY;AACtB,YAAM,IAAI,SAAS,6BAA6B,SAAS;AAAA,IAC3D;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,8BAA8B;AAAA,IAC5C;AAEA,UAAM,WAAW,MAAM;AAAA,MACrB,GAAGA,QAAO,UAAU;AAAA,MACpB,EAAE,QAAQ,OAAO,SAAS,WAAW,QAAW,IAAI,EAAA;AAAA,MACpDA,QAAO,WAAW;AAAA,IAAA;AAGpB,QAAI,CAAC,SAAS,WAAW,CAAC,SAAS,yBAAyB,CAAC,SAAS,SAAS;AAC7E,YAAM,IAAI,SAAS,oFAAoF,QAAQ;AAAA,IACjH;AAEA,kBAAc;AAAA,MACZ,QAAQ,SAAS;AAAA,MACjB,sBAAsB,SAAS;AAAA,IAAA;AAGjC,0BAAsB,KAAK,IAAA;AAC3B,qBAAiB,SAAS,mBAAmB;AAG7C,QAAI,OAAO,SAAS,UAAU,WAAW;AACvC,YAAM,gBAAgB,oBAAA;AACtB,UAAI,cAAc,UAAU,MAAM;AAChC,4BAAoB,EAAE,OAAO,SAAS,MAAA,CAAO;AAAA,MAC/C;AAAA,IACF;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,sCAAsC,gBAAgB,aAAa,SAAS,SAAS,cAAc,GAAG;AAAA,IACpH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QACJ,MACA,MACgC;AAEhC,UAAM,KAAK,uBAAA;AAEX,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,SAAS,+DAAgE,MAAM;AAAA,IAC3F;AAEA,UAAMA,UAAS,oBAAA;AACf,QAAI,CAACA,QAAO,WAAW;AACrB,YAAM,IAAI,SAAS,4BAA4B,SAAS;AAAA,IAC1D;AAEA,UAAM,UAAgC;AAAA,MACpC;AAAA,MACA,SAAS,YAAY;AAAA,MACrB,uBAAuB,YAAY;AAAA,MACnC,GAAG;AAAA,IAAA;AAGL,QAAI,eAAe;AACjB,cAAQ,IAAI,qCAAqC,EAAE,MAAM,GAAG,MAAM;AAAA,IACpE;AAEA,UAAM,WAAW,MAAM;AAAA,MACrB,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU,OAAO;AAAA,MAAA;AAAA,MAE9BA,QAAO,WAAW;AAAA,IAAA;AAGpB,QAAI,eAAe;AACjB,cAAQ,IAAI,0CAA0C,SAAS,YAAY,GAAG;AAAA,IAChF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,aAAkD;AAC3D,UAAMA,UAAS,oBAAA;AACf,QAAI,CAACA,QAAO,WAAW;AACrB,YAAM,IAAI,SAAS,4BAA4B,SAAS;AAAA,IAC1D;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,gCAAgC;AAAA,IAC9C;AAEA,UAAM,WAAW,MAAM;AAAA,MACrB,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU,EAAE,cAAc,aAAa;AAAA,MAAA;AAAA,MAEpDA,QAAO,WAAW;AAAA,IAAA;AAGpB,QAAI,eAAe;AACjB,cAAQ,IAAI,iBAAiB,EAAE,QAAQ,SAAS,QAAQ,iBAAiB,CAAC,CAAC,SAAS,cAAA,CAAe;AAAA,IACrG;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SACJ,cACA,OACiC;AACjC,UAAMA,UAAS,oBAAA;AACf,QAAI,CAACA,QAAO,WAAW;AACrB,YAAM,IAAI,SAAS,4BAA4B,SAAS;AAAA,IAC1D;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,oCAAoC;AAAA,IAClD;AAEA,UAAM,WAAW,MAAM;AAAA,MACrB,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU;AAAA,UACnB,eAAe;AAAA,UACf,GAAG;AAAA,QAAA,CACJ;AAAA,MAAA;AAAA,MAEHA,QAAO,WAAW;AAAA,IAAA;AAGpB,QAAI,eAAe;AACjB,cAAQ,IAAI,qBAAqB;AAAA,QAC/B,aAAa,CAAC,CAAC,SAAS;AAAA,QACxB,aAAa,SAAS;AAAA,MAAA,CACvB;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WACJ,cACA,UACiC;AACjC,UAAMA,UAAS,oBAAA;AACf,QAAI,CAACA,QAAO,WAAW;AACrB,YAAM,IAAI,SAAS,4BAA4B,SAAS;AAAA,IAC1D;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,uCAAuC;AAAA,IACrD;AAEA,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU;AAAA,UACnB,eAAe;AAAA,UACf,WAAW;AAAA,QAAA,CACZ;AAAA,MAAA;AAAA,MAEHA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AAAA,EAEA,MAAM,YAAY,cAA0D;AAC1E,UAAMA,UAAS,oBAAA;AACf,QAAI,CAACA,QAAO,WAAW;AACrB,YAAM,IAAI,SAAS,4BAA4B,SAAS;AAAA,IAC1D;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,wCAAwC;AAAA,IACtD;AAEA,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU,EAAE,eAAe,cAAc;AAAA,MAAA;AAAA,MAEtDA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AAAA,EAEA,MAAM,UAAU,cAAwD;AACtE,UAAMA,UAAS,oBAAA;AACf,QAAI,CAACA,QAAO,WAAW;AACrB,YAAM,IAAI,SAAS,4BAA4B,SAAS;AAAA,IAC1D;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,sCAAsC;AAAA,IACpD;AAEA,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU,EAAE,eAAe,cAAc;AAAA,MAAA;AAAA,MAEtDA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AAAA,EAEA,MAAM,SAAS,eAAwD;;AACrE,UAAMA,UAAS,oBAAA;AACf,QAAI,CAACA,QAAO,YAAY;AACtB,YAAM,IAAI,SAAS,6BAA6B,SAAS;AAAA,IAC3D;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,iCAAiC;AAAA,IAC/C;AAEA,UAAM,WAAW,MAAM;AAAA,MACrB,GAAGA,QAAO,UAAU;AAAA,MACpB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAW,QAAW,IAAI;AAAA,QACnC,MAAM,KAAK,UAAU,EAAE,gBAAgB,eAAe;AAAA,MAAA;AAAA,MAExDA,QAAO,WAAW;AAAA,IAAA;AAGpB,QAAI,SAAS,WAAW,SAAS,OAAO;AACtC,mBAAa,SAAS,KAAK;AAC3B,UAAI,SAAS,MAAM;AACjB,oBAAY,SAAS,IAAI;AAAA,MAC3B;AAAA,IACF;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,6BAA6B,EAAE,OAAM,cAAS,SAAT,mBAAe,MAAM;AAAA,IACxE;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,OAA8F;AAC7G,UAAM,MAAM,oBAAA;AACZ,QAAI,CAAC,IAAI,YAAY;AACnB,YAAM,IAAI,SAAS,6BAA6B,SAAS;AAAA,IAC3D;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,oCAAoC;AAAA,IAClD;AAEA,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,GAAG,IAAI,UAAU;AAAA,QACjB;AAAA,UACE,QAAQ;AAAA,UACR,SAAS,WAAW,OAAO,IAAI;AAAA,QAAA;AAAA,QAEjC;AAAA,MAAA;AAEF,aAAO,EAAE,OAAO,SAAS,UAAU,OAAO,YAAY,SAAS,WAAA;AAAA,IACjE,SAAS,KAAK;AACZ,UAAI,eAAe,YAAY,IAAI,eAAe,KAAK;AACrD,eAAO,EAAE,OAAO,MAAA;AAAA,MAClB;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,OAA+C;AAC1D,UAAMA,UAAS,oBAAA;AACf,QAAI,CAACA,QAAO,YAAY;AACtB,YAAM,IAAI,SAAS,6BAA6B,SAAS;AAAA,IAC3D;AAEA,QAAI;AACF,YAAM,WAAW,MAAM;AAAA,QACrB,GAAGA,QAAO,UAAU;AAAA,QACpB;AAAA,UACE,QAAQ;AAAA,UACR,SAAS,WAAW,OAAO,IAAI;AAAA,QAAA;AAAA,QAEjCA,QAAO,WAAW;AAAA,MAAA;AAGpB,qBAAA;AACA,oBAAc;AACd,4BAAsB;AACtB,aAAO;AAAA,IACT,QAAQ;AACN,qBAAA;AACA,oBAAc;AACd,4BAAsB;AACtB,aAAO,EAAE,SAAS,KAAA;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,mBAAyB;AACvB,kBAAc;AACd,0BAAsB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,WACJ,OACA,cAAgC,QACH;AAC7B,UAAM,EAAE,aAAA,IAAiB,MAAM,KAAK,QAAQ,eAAe;AAAA,MACzD;AAAA,MACA,cAAc;AAAA,IAAA,CACf;AACD,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AAAA,EAEA,MAAM,WACJ,SACA,OACA,cAAgC,QACH;AAC7B,UAAM,EAAE,aAAA,IAAiB,MAAM,KAAK,QAAQ,eAAe;AAAA,MACzD;AAAA,MACA;AAAA,MACA,cAAc;AAAA,IAAA,CACf;AACD,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AAAA,EAEA,MAAM,eAAe,SAA8C;AACjE,UAAM,EAAE,aAAA,IAAiB,MAAM,KAAK,QAAQ,oBAAoB;AAAA,MAC9D,UAAU,QAAQ,QAAQ,UAAU,EAAE;AAAA,IAAA,CACvC;AACD,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AAAA,EAEA,MAAM,SAAS,MAQiB;AAC9B,UAAM,EAAE,aAAA,IAAiB,MAAM,KAAK,QAAQ,YAAY;AAAA,MACtD,GAAG;AAAA,MACH,mBAAmB,KAAK,qBAAqB;AAAA,IAAA,CAC9C;AACD,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AAAA,EAEA,MAAM,kBAAkB,MAMQ;AAC9B,QAAI,KAAK,YAAY,QAAQ;AAC3B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAEJ;AAEA,UAAM,EAAE,aAAA,IAAiB,MAAM,KAAK,QAAQ,YAAY;AAAA,MACtD,GAAG;AAAA,MACH,OAAO;AAAA,MACP,mBAAmB;AAAA,IAAA,CACpB;AACD,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AAAA,EAEA,MAAM,gBACJ,QACA,YAC6B;AAC7B,UAAM,EAAE,aAAA,IAAiB,MAAM,KAAK,QAAQ,qBAAqB;AAAA,MAC/D;AAAA,MACA,GAAG;AAAA,IAAA,CACJ;AACD,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AACF;ACtcA,SAAS,gBAA6B;AACpC,QAAM,QAAQ,kBAAkB,eAAA;AAChC,MAAI,CAAC,OAAO;AACV,UAAM,IAAI,SAAS,+DAAgE,MAAM;AAAA,EAC3F;AAEA,SAAO;AAAA,IACL,gBAAgB;AAAA,IAChB,UAAU;AAAA,EAAA;AAEd;AAMO,MAAM,wBAAwB;AAAA,EACnC,iBAA0B;AACxB,WAAO,kBAAkB,eAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,kBAAkB;AACtB,WAAO,kBAAkB,gBAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,aAAa,OAAoD;AACrE,UAAMA,UAAS,oBAAA;AACf,QAAI,CAACA,QAAO,WAAW;AACrB,YAAM,IAAI,SAAS,4BAA4B,SAAS;AAAA,IAC1D;AAEA,QAAI,CAAC,kBAAkB,kBAAkB;AACvC,YAAM,kBAAkB,gBAAA;AAAA,IAC1B;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,2CAA2C,EAAE,MAAA,CAAO;AAAA,IAClE;AAEA,UAAM,WAAW,MAAM;AAAA,MACrB,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,cAAA;AAAA,QACT,MAAM,KAAK,UAAU,EAAE,OAAO;AAAA,MAAA;AAAA,MAEhCA,QAAO,WAAW;AAAA,IAAA;AAGpB,QAAI,eAAe;AACjB,cAAQ,IAAI,0BAA0B;AAAA,QACpC,QAAQ,SAAS;AAAA,QACjB,QAAQ,CAAC,CAAC,SAAS;AAAA,MAAA,CACpB;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aACJ,cACA,eAC6C;AAC7C,UAAMA,UAAS,oBAAA;AACf,QAAI,CAACA,QAAO,WAAW;AACrB,YAAM,IAAI,SAAS,4BAA4B,SAAS;AAAA,IAC1D;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,oDAAoD,EAAE,cAAA,CAAe;AAAA,IACnF;AAEA,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,cAAA;AAAA,QACT,MAAM,KAAK,UAAU;AAAA,UACnB,eAAe;AAAA,UACf,gBAAgB;AAAA,QAAA,CACjB;AAAA,MAAA;AAAA,MAEHA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AAAA,EAEA,mBAAmB,WAAmB,YAA6B;AACjE,WAAO,cAAc;AAAA,EACvB;AAAA,EAEA,MAAM,MACJ,cACA,UACsC;AACtC,UAAMA,UAAS,oBAAA;AACf,QAAI,CAACA,QAAO,WAAW;AACrB,YAAM,IAAI,SAAS,4BAA4B,SAAS;AAAA,IAC1D;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,0CAA0C;AAAA,IACxD;AAEA,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,cAAA;AAAA,QACT,MAAM,KAAK,UAAU;AAAA,UACnB,eAAe;AAAA,UACf;AAAA,UACA,uBAAuB;AAAA,QAAA,CACxB;AAAA,MAAA;AAAA,MAEHA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AAAA,EAEA,MAAM,UAAU,cAA6D;AAC3E,UAAMA,UAAS,oBAAA;AACf,QAAI,CAACA,QAAO,WAAW;AACrB,YAAM,IAAI,SAAS,4BAA4B,SAAS;AAAA,IAC1D;AAEA,QAAI,eAAe;AACjB,cAAQ,IAAI,2CAA2C;AAAA,IACzD;AAEA,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,cAAA;AAAA,QACT,MAAM,KAAK,UAAU,EAAE,eAAe,cAAc;AAAA,MAAA;AAAA,MAEtDA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AACF;AC5IA,SAASC,kBAAgB,KAAc,SAAoD;AACzF,MAAI,eAAe,UAAU;AAC3B,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM,IAAI,KAAA;AAAA,EAC3C;AACA,MAAI,eAAe,OAAO;AACxB,QAAI,IAAI,QAAQ,SAAS,OAAO,KAAK,IAAI,QAAQ,SAAS,SAAS,GAAG;AACpE,aAAO,EAAE,SAAS,qCAAqC,MAAM,UAAA;AAAA,IAC/D;AACA,QAAI,IAAI,QAAQ,SAAS,SAAS,GAAG;AACnC,aAAO,EAAE,SAAS,2CAA2C,MAAM,UAAA;AAAA,IACrE;AACA,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM,UAAA;AAAA,EACvC;AACA,SAAO,EAAE,SAAS,kBAAkB,OAAO,IAAI,MAAM,UAAA;AACvD;AAEO,SAAS,kBAAkB,SAAmC;AACnE,QAAM,EAAE,YAAY,WAAW,sBAAsB,SAAS;AAE9D,QAAM,gBAAgBH,MAAAA,OAAO,KAAK;AAElCH,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,cAAc,SAAS;AAC1B,0BAAoB,EAAE,YAAY,WAAW;AAC7C,oBAAc,UAAU;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,YAAY,SAAS,CAAC;AAE1B,QAAM,CAAC,OAAO,QAAQ,IAAII,eAAsC;AAAA,IAC9D,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,aAAa;AAAA,IACb,aAAa;AAAA,IACb,aAAa;AAAA,IACb,SAAS;AAAA,IACT,OAAO;AAAA,IACP,WAAW;AAAA,EAAA,CACZ;AAEDJ,QAAAA,UAAU,MAAM;AACd,QAAI,uBAAuB,CAAC,MAAM,mBAAmB;AACnD,sBAAA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,qBAAqB,MAAM,iBAAiB,CAAC;AAEjD,QAAM,kBAAkBO,MAAAA,YAAY,YAAY;AAC9C,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,MAAM,WAAW,KAAA,EAAO;AAC3E,QAAI;AACF,YAAM,sBAAsB,gBAAA;AAC5B,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,mBAAmB,MAAM,SAAS,QAAQ;AACvE,aAAO,EAAE,SAAS,KAAA;AAAA,IACpB,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,eAAe;AAC9D,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,eAAeC,kBAAY,OAAO,UAAkB;AACxD,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,MAAM,WAAW,KAAA,EAAO;AAC3E,QAAI;AACF,UAAI,CAAC,sBAAsB,kBAAkB;AAC3C,cAAM,sBAAsB,gBAAA;AAAA,MAC9B;AACA,YAAM,WAAW,MAAM,sBAAsB,aAAa,KAAK;AAE/D,UAAI,SAAS,WAAW,SAAS,eAAe;AAC9C,YAAI,SAAS,WAAW,mBAAmB;AACzC,mBAAS,CAAA,UAAS;AAAA,YAChB,GAAG;AAAA,YACH,mBAAmB;AAAA,YACnB,cAAc,SAAS;AAAA,YACvB,QAAQ;AAAA,YACR,aAAa,SAAS,gBAAgB;AAAA,YACtC,aAAa,SAAS,gBAAgB;AAAA,YACtC,SAAS;AAAA,UAAA,EACT;AACF,iBAAO,EAAE,SAAS,MAAM,QAAQ,kBAAA;AAAA,QAClC,OAAO;AACL,mBAAS,CAAA,UAAS;AAAA,YAChB,GAAG;AAAA,YACH,mBAAmB;AAAA,YACnB,cAAc,SAAS;AAAA,YACvB,QAAQ;AAAA,YACR,WAAW,SAAS,YAAY;AAAA,YAChC,aAAa;AAAA,YACb,aAAa,SAAS,gBAAgB;AAAA,YACtC,SAAS;AAAA,UAAA,EACT;AACF,iBAAO,EAAE,SAAS,MAAM,QAAQ,cAAA;AAAA,QAClC;AAAA,MACF;AAEA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,QAC3B,WAAW,SAAS,cAAc;AAAA,MAAA,EAClC;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,wBAAwB;AACvE,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,eAAeC,kBAAY,OAAO,WAA8B;AACpE,QAAI,CAAC,MAAM,cAAc;AACvB,aAAO,EAAE,SAAS,OAAO,OAAO,mBAAA;AAAA,IAClC;AACA,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,MAAM,WAAW,KAAA,EAAO;AAC3E,QAAI;AACF,YAAM,WAAW,MAAM,sBAAsB,aAAa,MAAM,cAAc,MAAM;AACpF,UAAI,SAAS,SAAS;AACpB,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,WAAW,SAAS,YAAY;AAAA,UAChC,aAAa,SAAS,gBAAgB;AAAA,UACtC,SAAS;AAAA,QAAA,EACT;AACF,eAAO,EAAE,SAAS,KAAA;AAAA,MACpB;AACA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,QAC3B,WAAW,SAAS,cAAc;AAAA,MAAA,EAClC;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,iBAAkB;AACjE,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,QAAM,YAAYC,kBAAY,CAAC,cAA+B;AAC5D,QAAI,CAAC,MAAM,WAAW;AACpB,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,OAAO,oBAAoB,WAAW,oBAAoB;AACvF,aAAO;AAAA,IACT;AACA,UAAM,UAAU,sBAAsB,mBAAmB,WAAW,MAAM,SAAS;AACnF,QAAI,SAAS;AACX,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,QAAQ,oBAAoB,OAAO,MAAM,WAAW,KAAA,EAAO;AACxF,aAAO;AAAA,IACT;AACA,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,OAAO,kBAAkB,WAAW,gBAAgB;AACjF,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,SAAS,CAAC;AAEpB,QAAM,gBAAgBA,kBAAY,OAAO,aAAqB;AAC5D,QAAI,CAAC,MAAM,cAAc;AACvB,aAAO,EAAE,SAAS,OAAO,OAAO,mBAAA;AAAA,IAClC;AACA,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,MAAM,WAAW,KAAA,EAAO;AAC3E,QAAI;AACF,YAAM,WAAW,MAAM,sBAAsB,MAAM,MAAM,cAAc,QAAQ;AAC/E,UAAI,SAAS,SAAS;AACpB,iBAAS,CAAA,UAAS,EAAE,GAAG,MAAM,QAAQ,aAAa,SAAS,QAAQ;AACnE,eAAO,EAAE,SAAS,KAAA;AAAA,MACpB;AACA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,QAC3B,WAAW,SAAS,cAAc;AAAA,MAAA,EAClC;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,qBAAqB;AACpE,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,QAAM,YAAYC,MAAAA,YAAY,YAAY;AACxC,QAAI,CAAC,MAAM,cAAc;AACvB,aAAO,EAAE,SAAS,OAAO,OAAO,mBAAA;AAAA,IAClC;AACA,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,MAAM,WAAW,KAAA,EAAO;AAC3E,QAAI;AACF,YAAM,WAAW,MAAM,sBAAsB,UAAU,MAAM,YAAY;AACzE,UAAI,SAAS,WAAW,SAAS,UAAU;AACzC,iBAAS,CAAA,UAAS,EAAE,GAAG,MAAM,WAAW,SAAS,UAAW,SAAS,MAAA,EAAQ;AAC7E,eAAO,EAAE,SAAS,MAAM,UAAU,SAAS,mBAAA;AAAA,MAC7C;AACA,eAAS,WAAS,EAAE,GAAG,MAAM,SAAS,QAAQ;AAC9C,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,WAAW;AAC1D,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,QAAM,QAAQC,MAAAA,YAAY,MAAM;AAC9B,aAAS;AAAA,MACP,mBAAmB,MAAM;AAAA,MACzB,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa;AAAA,MACb,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW;AAAA,IAAA,CACZ;AAAA,EACH,GAAG,CAAC,MAAM,iBAAiB,CAAC;AAE5B,QAAM,aAAaA,MAAAA,YAAY,MAAM;AACnC,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,OAAO,MAAM,WAAW,OAAO;AAAA,EAC9D,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,mBAAmB,MAAM;AAAA,IACzB,cAAc,MAAM;AAAA,IACpB,QAAQ,MAAM;AAAA,IACd,WAAW,MAAM;AAAA,IACjB,aAAa,MAAM;AAAA,IACnB,aAAa,MAAM;AAAA,IACnB,aAAa,MAAM;AAAA,IACnB,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,IACb,WAAW,MAAM;AAAA,IAEjB,aAAa,MAAM,WAAW;AAAA,IAC9B,kBAAkB,MAAM,WAAW;AAAA,IACnC,cAAc,MAAM,WAAW;AAAA,IAC/B,mBAAmB,MAAM,WAAW;AAAA,IAEpC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AChPA,MAAMC,MAAI;AAAA,EACR,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EAET,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EAET,KAAK;AAAA,EACL,OAAO;AAET;AAEA,MAAMC,eAAa,CAAC,IAAY,OAAO,YAAiC;AAAA,EACtE,QAAQ;AAAA,EAAU,OAAO;AAAA,EAAM,QAAQ;AAAA,EAAM,iBAAiB;AAAA,EAAI,cAAc;AAAA,EAChF,SAAS;AAAA,EAAQ,YAAY;AAAA,EAAU,gBAAgB;AACzD;AAEA,MAAMC,iBAAoC;AAAA,EACxC,UAAU;AAAA,EAAY,MAAM;AAAA,EAAQ,KAAK;AAAA,EAAQ,YAAY;AAAA,EAAQ,QAAQ;AAAA,EAC7E,QAAQ;AAAA,EAAW,SAAS;AAAA,EAAU,cAAc;AAAA,EAAY,OAAOF,IAAE;AAAA,EAAS,QAAQ;AAC5F;AAEO,SAAS,sBAAsB,EAAE,MAAM,cAAc,WAAW,YAAY,aAAyC;AAC1H,QAAM;AAAA,IACJ;AAAA,IAAQ,SAAS;AAAA,IAAW,OAAO;AAAA,IAAS;AAAA,IAAa;AAAA,IAAa;AAAA,IACtE;AAAA,IAAc;AAAA,IAAc;AAAA,IAAW;AAAA,IAAe;AAAA,IAAW,OAAO;AAAA,IAAW;AAAA,EAAA,IACjF,kBAAkB,EAAE,YAAY,WAAW;AAE/C,QAAM,CAAC,MAAM,OAAO,IAAIJ,MAAAA,SAAuB,OAAO;AACtD,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAS,EAAE;AACrC,QAAM,CAAC,KAAK,MAAM,IAAIA,MAAAA,SAAS,EAAE;AACjC,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAAS,EAAE;AAC3C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,MAAAA,SAAS,EAAE;AACzD,QAAM,CAAC,YAAY,aAAa,IAAIA,MAAAA,SAAwB,IAAI;AAChE,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,MAAAA,SAA4B,OAAO;AAC/E,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,MAAAA,SAAS,CAAC;AAEtD,QAAM,QAAQ,cAAc;AAE5BJ,QAAAA,UAAU,MAAM;AACd,QAAI,WAAW,kBAAmB,SAAQ,eAAe;AAAA,aAChD,WAAW,eAAe;AAAE,cAAQ,KAAK;AAAG,wBAAkB,EAAE;AAAA,IAAG,WACnE,WAAW,mBAAoB,SAAQ,UAAU;AAAA,aACjD,WAAW,YAAa,SAAQ,SAAS;AAAA,EACpD,GAAG,CAAC,MAAM,CAAC;AAEXA,QAAAA,UAAU,MAAM;AACd,QAAI,iBAAiB,GAAG;AACtB,YAAM,QAAQ,WAAW,MAAM,kBAAkB,iBAAiB,CAAC,GAAG,GAAI;AAC1E,aAAO,MAAM,aAAa,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnB,QAAM,aAAa,MAAM;AACvB,YAAQ,OAAO;AAAG,aAAS,EAAE;AAAG,WAAO,EAAE;AAAG,gBAAY,EAAE;AAAG,uBAAmB,EAAE;AAClF,kBAAc,IAAI;AAAG,sBAAkB,OAAO;AAAG,sBAAkB,CAAC;AAAG,cAAA;AAAA,EACzE;AAEA,QAAM,cAAc,MAAM;AAAE,eAAA;AAAc,iBAAa,KAAK;AAAA,EAAG;AAC/D,QAAM,oBAAoB,MAAM;AAAE,eAAA;AAAc,cAAA;AAAA,EAAa;AAE7D,QAAM,oBAAoB,YAAY;AACpC,kBAAc,IAAI;AAAG,eAAA;AACrB,QAAI,CAAC,MAAM,QAAQ;AAAE,oBAAc,6BAA6B;AAAG;AAAA,IAAQ;AAC3E,QAAI,CAAC,6BAA6B,KAAK,MAAM,KAAA,CAAM,GAAG;AAAE,oBAAc,0CAA0C;AAAG;AAAA,IAAQ;AAC3H,UAAM,aAAa,MAAM,MAAM;AAAA,EACjC;AAEA,QAAM,qBAAqB,YAAY;AACrC,kBAAc,IAAI;AAAG,eAAA;AACrB,UAAM,aAAa,cAAc;AAAA,EACnC;AAEA,QAAM,kBAAkB,MAAM;AAC5B,QAAI,IAAI,WAAW,GAAG;AAAE,oBAAc,sCAAsC;AAAG;AAAA,IAAQ;AACvF,kBAAc,IAAI;AAAG,eAAA;AACrB,UAAM,UAAU,UAAU,GAAG;AAC7B,QAAI,CAAC,QAAS,eAAc,gBAAgB;AAAA,EAC9C;AAEA,QAAM,kBAAkB,YAAY;AAClC,QAAI,iBAAiB,EAAG;AACxB,UAAM,SAAS,MAAM,UAAA;AACrB,QAAI,OAAO,SAAS;AAAE,wBAAkB,OAAO,YAAY,EAAE;AAAG,aAAO,EAAE;AAAG,oBAAc,IAAI;AAAA,IAAG;AAAA,EACnG;AAEA,QAAM,uBAAuB,YAAY;AACvC,QAAI,SAAS,SAAS,GAAG;AAAE,oBAAc,qDAAqD;AAAG;AAAA,IAAQ;AACzG,QAAI,aAAa,iBAAiB;AAAE,oBAAc,wCAAwC;AAAG;AAAA,IAAQ;AACrG,kBAAc,IAAI;AAAG,eAAA;AACrB,UAAM,cAAc,QAAQ;AAAA,EAC9B;AAEA,QAAM,SAAS,MAAM;AACnB,kBAAc,IAAI;AAAG,eAAA;AACrB,QAAI,SAAS,iBAAiB;AAAE,cAAQ,OAAO;AAAG,gBAAA;AAAA,IAAa,WACtD,SAAS,OAAO;AAAE,cAAQ,cAAc,kBAAkB,OAAO;AAAG,gBAAA;AAAA,IAAa,WACjF,SAAS,WAAY,SAAQ,KAAK;AAAA,EAC7C;AAGA,MAAI,SAAS,WAAW;AACtB,0CACG,QAAA,EAAO,MAAY,cAAc,aAChC,0CAAC,eAAA,EACC,UAAA;AAAA,MAAAH,2BAAAA,KAAC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,QAAAC,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,GAAGW,aAAWD,IAAE,OAAO,GAAG,OAAO,QAAQ,QAAQ,OAAA,GAC7D,UAAAV,2BAAAA,IAAC,kBAAA,EAAiB,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,OAAOU,IAAE,MAAA,EAAM,CAAG,EAAA,CAC9E;AAAA,QACAV,2BAAAA,IAAC,eAAY,UAAA,yBAAA,CAAsB;AAAA,QACnCA,2BAAAA,IAAC,qBAAkB,UAAA,+CAAA,CAA4C;AAAA,MAAA,GACjE;AAAA,MACAA,2BAAAA,IAAC,QAAA,EAAO,SAAS,mBAAmB,OAAO,EAAE,OAAO,QAAQ,WAAW,UAAU,UAAA,wBAAA,CAAqB;AAAA,IAAA,EAAA,CACxG,EAAA,CACF;AAAA,EAEJ;AAEA,wCACG,QAAA,EAAO,MAAY,cAAc,aAChC,0CAAC,eAAA,EACE,UAAA;AAAA,IAAA,SAAS,WACRA,2BAAAA,IAAC,UAAA,EAAO,SAAS,QAAQ,OAAOY,gBAAc,MAAK,UACjD,UAAAZ,+BAAC,eAAA,EAAc,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU,GAC3D;AAAA,oCAGD,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,MAAAA,2BAAAA,IAAC,OAAA,EAAI,OAAOW,aAAWD,IAAE,UAAU,IAAI,GACpC,UAAA,SAAS,uCACP,cAAA,EAAa,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOA,IAAE,QAAA,EAAQ,CAAG,IAE9EV,+BAAC,YAAS,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOU,IAAE,QAAA,GAAW,GAE9E;AAAA,sCACC,aAAA,EACE,UAAA;AAAA,QAAA,SAAS,WAAW;AAAA,QACpB,SAAS,mBAAmB;AAAA,QAC5B,SAAS,SAAS;AAAA,QAClB,SAAS,cAAc;AAAA,MAAA,GAC1B;AAAA,sCACC,mBAAA,EACE,UAAA;AAAA,QAAA,SAAS,WAAW;AAAA,QACpB,SAAS,mBAAmB;AAAA,QAC5B,SAAS,UAAU,gBAAgB,UAAU,0BAA0B,WAAW,KAAK,2BAA2B,WAAW;AAAA,QAC7H,SAAS,cAAc;AAAA,MAAA,EAAA,CAC1B;AAAA,IAAA,GACF;AAAA,IAEAX,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,WAAW,QAAQ,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAA,GAC7E,UAAA;AAAA,MAAA,wCAAU,OAAA,EAAI,OAAO,EAAE,SAAS,WAAW,cAAc,YAAY,iBAAiBW,IAAE,OAAO,OAAOA,IAAE,KAAK,UAAU,WAAA,GAAe,UAAA,OAAM;AAAA,MAE5I,SAAS,WACRX,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAd,gCAAC,OAAA,EAAI,UAAA;AAAA,UAAAC,2BAAAA,IAAC,OAAA,EAAM,SAAQ,kBAAiB,UAAA,iBAAa;AAAA,yCAAS,OAAA,EAAM,IAAG,kBAAiB,MAAK,SAAQ,aAAY,oBAAmB,OAAO,OAAO,UAAU,OAAK,SAAS,EAAE,OAAO,KAAK,GAAG,UAAU,UAAA,CAAW;AAAA,QAAA,GAAE;AAAA,QAC/MA,2BAAAA,IAAC,UAAO,SAAS,mBAAmB,UAAU,WAAW,OAAO,EAAE,OAAO,OAAA,GACtE,sBACCD,2BAAAA,KAAC,QAAA,EAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,SAAA,GACzD,UAAA;AAAA,UAAAC,+BAAC,eAAY,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU;AAAA,UAAE;AAAA,QAAA,EAAA,CAC3D,IACE,aACN;AAAA,QACAA,2BAAAA,IAAC,QAAA,EAAO,SAAQ,SAAQ,SAAS,mBAAmB,OAAO,EAAE,OAAO,UAAU,UAAA,wBAAA,CAAqB;AAAA,MAAA,GACrG;AAAA,MAGD,SAAS,mBACRD,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAb,+BAAC,cAAW,OAAO,gBAAgB,eAAe,CAAA,MAAK,kBAAkB,CAAsB,GAC7F,UAAAD,gCAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,aAC3D,UAAA;AAAA,UAAAA,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,WAAW,SAAS,QAAQ,cAAc,UAAU,QAAQ,aAAa,mBAAmB,UAAUW,IAAE,UAAUA,IAAE,OAAO,IAAI,QAAQ,UAAA,GAAa,SAAS,MAAM,kBAAkB,OAAO,GACpP,UAAA;AAAA,YAAAV,2BAAAA,IAAC,gBAAA,EAAe,OAAM,SAAQ,IAAG,gBAAe;AAAA,4CAC/C,OAAA,EAAI,UAAA;AAAA,cAAAA,+BAAC,SAAI,OAAO,EAAE,YAAY,IAAA,GAAO,UAAA,aAAS;AAAA,cAAMA,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,UAAU,WAAW,OAAOU,IAAE,WAAY,UAAA,YAAA,CAAY;AAAA,YAAA,EAAA,CAAM;AAAA,UAAA,GACjI;AAAA,UACAX,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,WAAW,SAAS,QAAQ,cAAc,UAAU,QAAQ,aAAa,mBAAmB,UAAUW,IAAE,UAAUA,IAAE,OAAO,IAAI,QAAQ,UAAA,GAAa,SAAS,MAAM,kBAAkB,OAAO,GACpP,UAAA;AAAA,YAAAV,2BAAAA,IAAC,gBAAA,EAAe,OAAM,SAAQ,IAAG,gBAAe;AAAA,4CAC/C,OAAA,EAAI,UAAA;AAAA,cAAAA,+BAAC,SAAI,OAAO,EAAE,YAAY,IAAA,GAAO,UAAA,WAAO;AAAA,cAAMA,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,UAAU,WAAW,OAAOU,IAAE,WAAY,UAAA,YAAA,CAAY;AAAA,YAAA,EAAA,CAAM;AAAA,UAAA,EAAA,CAC/H;AAAA,QAAA,EAAA,CACF,EAAA,CACF;AAAA,QACAV,2BAAAA,IAAC,UAAO,SAAS,oBAAoB,UAAU,WAAW,OAAO,EAAE,OAAO,OAAA,GACvE,sBACCD,2BAAAA,KAAC,QAAA,EAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,SAAA,GACzD,UAAA;AAAA,UAAAC,+BAAC,eAAY,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU;AAAA,UAAE;AAAA,QAAA,EAAA,CAC3D,IACE,kBAAA,CACN;AAAA,MAAA,GACF;AAAA,MAGD,SAAS,SACRD,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAb,+BAAC,YAAS,OAAO,KAAK,UAAU,QAAQ,UAAU,WAAW;AAAA,uCAC5D,OAAA,EAAI,OAAO,EAAE,WAAW,UAAU,UAAU,WAAA,GAC1C,UAAA,iBAAiB,oCAAK,QAAA,EAAK,OAAO,EAAE,OAAOU,IAAE,WAAW,UAAA;AAAA,UAAA;AAAA,UAAe;AAAA,UAAe;AAAA,QAAA,EAAA,CAAC,mCACrF,UAAA,EAAO,MAAK,UAAS,OAAO,EAAE,OAAOA,IAAE,SAAS,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,WAAW,gBAAgB,eAAe,SAAS,iBAAiB,UAAA,2BAAA,CAAwB,EAAA,CAE7L;AAAA,QACAV,2BAAAA,IAAC,QAAA,EAAO,SAAS,iBAAiB,UAAU,IAAI,WAAW,GAAG,OAAO,EAAE,OAAO,OAAA,GAAU,UAAA,WAAA,CAAQ;AAAA,MAAA,GAClG;AAAA,MAGD,SAAS,cACRD,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAd,gCAAC,OAAA,EAAI,UAAA;AAAA,UAAAC,2BAAAA,IAAC,SAAM,UAAA,uBAAA,CAAoB;AAAA,yCAAS,OAAA,EAAM,MAAK,YAAW,aAAY,wBAAuB,OAAO,UAAU,UAAU,CAAA,MAAK,YAAY,EAAE,OAAO,KAAK,GAAG,UAAU,UAAA,CAAW;AAAA,QAAA,GAAE;AAAA,wCACrL,OAAA,EAAI,UAAA;AAAA,UAAAA,2BAAAA,IAAC,SAAM,UAAA,4BAAA,CAAyB;AAAA,yCAAS,OAAA,EAAM,MAAK,YAAW,aAAY,8BAA6B,OAAO,iBAAiB,UAAU,CAAA,MAAK,mBAAmB,EAAE,OAAO,KAAK,GAAG,UAAU,UAAA,CAAW;AAAA,QAAA,GAAE;AAAA,QAC/MA,2BAAAA,IAAC,QAAA,EAAO,SAAS,sBAAsB,UAAU,aAAa,CAAC,YAAY,CAAC,iBAAiB,OAAO,EAAE,OAAO,UAC1G,UAAA,YACCD,2BAAAA,KAAC,QAAA,EAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,SAAA,GACzD,UAAA;AAAA,UAAAC,+BAAC,eAAY,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU;AAAA,UAAE;AAAA,QAAA,EAAA,CAC3D,IACE,2BAAA,CACN;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;AC1OA,MAAM,oBAAoB,IAAI,KAAK;AACnC,MAAM,iBAAiB,IAAI,KAAK;AAehC,eAAe,mBACb,YACA,OACA,OACqD;AAErD,MAAI,OAAO,cAAc,eAAe,CAAC,UAAU,QAAQ;AACzD,QAAI,MAAO,SAAQ,IAAI,iCAAiC;AACxD,UAAM,IAAI,MAAM,SAAS;AAAA,EAC3B;AAEA,QAAM,aAAa,IAAI,gBAAA;AACvB,QAAM,YAAY,WAAW,MAAM,WAAW,MAAA,GAAS,GAAK;AAE5D,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,GAAG,UAAU,uBAAuB;AAAA,MAC/D,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,UAAU;AAAA,QACV,iBAAiB,UAAU,KAAK;AAAA,MAAA;AAAA,MAElC,QAAQ,WAAW;AAAA,IAAA,CACpB;AAED,iBAAa,SAAS;AAGtB,QAAI,SAAS,WAAW,KAAK;AAC3B,UAAI,MAAO,SAAQ,IAAI,uCAAuC;AAC9D,aAAO,EAAE,OAAO,MAAA;AAAA,IAClB;AAGA,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,MAAO,SAAQ,IAAI,mCAAmC,SAAS,MAAM,sBAAsB;AAC/F,YAAM,IAAI,MAAM,gBAAgB,SAAS,MAAM,EAAE;AAAA,IACnD;AAEA,UAAM,OAAO,MAAM,SAAS,KAAA;AAC5B,QAAI,MAAO,SAAQ,IAAI,iCAAiC;AAExD,WAAO;AAAA,MACL,OAAO,KAAK,UAAU;AAAA,MACtB,YAAY,KAAK;AAAA,IAAA;AAAA,EAErB,SAAS,OAAO;AACd,iBAAa,SAAS;AAGtB,QAAI,iBAAiB,SAAS,MAAM,YAAY,WAAW;AACzD,YAAM;AAAA,IACR;AAGA,QAAI,OAAO;AACT,YAAM,MAAM,iBAAiB,QAAQ,MAAM,UAAU;AACrD,cAAQ,IAAI,2CAA2C,GAAG,uBAAuB;AAAA,IACnF;AACA,UAAM;AAAA,EACR;AACF;AAEO,SAAS,oBAAoB,SAA2C;AAC7E,QAAM,EAAE,SAAS,YAAY,gBAAgB,eAAe,QAAQ,UAAU;AAE9E,QAAM,WAAWK,MAAAA,OAA6C,IAAI;AAClE,QAAM,cAAcA,MAAAA,OAA8C,IAAI;AACtE,QAAM,aAAaA,MAAAA,OAAO,OAAO;AACjC,QAAM,eAAeA,MAAAA,OAAO,EAAE,gBAAgB,eAAe;AAG7D,aAAW,UAAU;AACrB,eAAa,UAAU,EAAE,gBAAgB,cAAA;AAEzC,QAAM,eAAeI,MAAAA,YAAY,YAAY;AAC3C,QAAI,CAAC,WAAW,QAAS;AAEzB,UAAM,QAAQ,OAAO,iBAAiB,cAClC,aAAa,QAAQK,QAAa,UAAU,KAAK,aAAa,QAAQA,QAAa,KAAK,IACxF;AAEJ,QAAI,CAAC,OAAO;AACV,UAAI,MAAO,SAAQ,IAAI,uCAAuC;AAC9D;AAAA,IACF;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,mBAAmB,YAAY,OAAO,KAAK;AAEhE,UAAI,CAAC,OAAO,OAAO;AAEjB,qBAAa,QAAQ,eAAA;AACrB;AAAA,MACF;AAGA,UAAI,OAAO,cAAc,aAAa,QAAQ,eAAe;AAC3D,qBAAa,QAAQ,cAAc,OAAO,UAAU;AAAA,MACtD;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,YAAY,KAAK,CAAC;AAEtBZ,QAAAA,UAAU,MAAM;AAEd,QAAI,SAAS,SAAS;AACpB,mBAAa,SAAS,OAAO;AAC7B,eAAS,UAAU;AAAA,IACrB;AACA,QAAI,YAAY,SAAS;AACvB,oBAAc,YAAY,OAAO;AACjC,kBAAY,UAAU;AAAA,IACxB;AAEA,QAAI,CAAC,WAAW,CAAC,WAAY;AAE7B,QAAI,MAAO,SAAQ,IAAI,oDAAoD;AAG3E,aAAS,UAAU,WAAW,MAAM;AAClC,mBAAA;AAGA,kBAAY,UAAU,YAAY,cAAc,cAAc;AAAA,IAChE,GAAG,iBAAiB;AAEpB,WAAO,MAAM;AACX,UAAI,SAAS,QAAS,cAAa,SAAS,OAAO;AACnD,UAAI,YAAY,QAAS,eAAc,YAAY,OAAO;AAAA,IAC5D;AAAA,EACF,GAAG,CAAC,SAAS,YAAY,cAAc,KAAK,CAAC;AAC/C;AChJA,SAAS,YAAY,gBAAwC,aAA8C;;AACzG,QAAM,eAAe,eAAe,cAAc,eAAe;AACjE,eAAa,QAAQY,QAAa,YAAY,YAAY;AAC1D,eAAa,QAAQA,QAAa,OAAO,YAAY;AAGrD,QAAM,WAAW,eAAe,aAC5B,EAAE,GAAG,eAAe,MAAM,GAAG,eAAe,WAAA,IAC5C,eAAe;AAGnB,QAAM,aAAW,oBAAe,SAAf,mBAAqB,oBAAoB,eAAuB,mBAAmB;AACpG,QAAM,WAAS,oBAAe,SAAf,mBAAqB,cAAa;AAEjD,QAAM,cAAc;AAAA,IAClB,GAAG;AAAA,IACH,eAAe;AAAA,IACf,iBAAiB;AAAA,EAAA;AAInB,MAAI,UAAU;AACZ,iBAAa,QAAQA,QAAa,iBAAiB,QAAQ;AAAA,EAC7D;AAIA,QAAM,WAAW,OAAO,gBAAgB,WAAW,cAAc;AACjE,eAAa,QAAQA,QAAa,MAAM,KAAK,UAAU,WAAW,CAAC;AACnE,eAAa,QAAQA,QAAa,cAAc,QAAQ;AAExD,SAAO,EAAE,OAAO,cAAc,MAAM,YAAA;AACtC;AAGA,SAAS,eAAe;AACtB,eAAa,WAAWA,QAAa,UAAU;AAC/C,eAAa,WAAWA,QAAa,KAAK;AAC1C,eAAa,WAAWA,QAAa,IAAI;AACzC,eAAa,WAAWA,QAAa,YAAY;AACjD,eAAa,WAAWA,QAAa,eAAe;AACtD;AAEA,SAASN,kBAAgB,KAAc,SAAoD;AACzF,MAAI,eAAe,OAAO;AACxB,QAAI,IAAI,QAAQ,SAAS,OAAO,KAAK,IAAI,QAAQ,SAAS,SAAS,GAAG;AACpE,aAAO,EAAE,SAAS,qCAAqC,MAAM,UAAA;AAAA,IAC/D;AACA,QAAI,IAAI,QAAQ,SAAS,SAAS,GAAG;AACnC,aAAO,EAAE,SAAS,2CAA2C,MAAM,UAAA;AAAA,IACrE;AACA,WAAO,EAAE,SAAS,IAAI,SAAS,MAAM,UAAA;AAAA,EACvC;AACA,SAAO,EAAE,SAAS,kBAAkB,OAAO,IAAI,MAAM,UAAA;AACvD;AAkBO,SAAS,cAAc,SAA+B;AAC3D,QAAM,EAAE,YAAY,WAAW,sBAAsB,MAAM,qBAAqB,QAAQ,eAAe,MAAA,IAAU;AAEjH,QAAM,gBAAgBH,MAAAA,OAAO,KAAK;AAGlC,QAAM,CAAC,SAAS,UAAU,IAAIC,MAAAA,SAAS,aAAa;AAEpDJ,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,cAAc,SAAS;AAC1B,0BAAoB,EAAE,YAAY,WAAW,aAAA,CAAc;AAC3D,oBAAc,UAAU;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,YAAY,WAAW,YAAY,CAAC;AAExC,QAAM,CAAC,OAAO,QAAQ,IAAII,eAAqF;AAAA,IAC7G,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,mBAAmB;AAAA,IACnB,UAAU;AAAA,IACV,SAAS;AAAA,IACT,OAAO;AAAA,IACP,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,EAAA,CACZ;AAED,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAsB,OAAO;AAGnE,QAAM,qBAAqBG,MAAAA,YAAY,MAAM;AAC3C,QAAI,QAAS,SAAQ,IAAI,sDAAsD;AAC/E,iBAAA;AACA,aAAS;AAAA,MACP,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,mBAAmB;AAAA,MACnB,UAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,IAAA,CACZ;AAAA,EACH,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,oBAAoBA,kBAAY,CAAC,cAAyB;AAE9D,UAAM,YAAY,aAAa,QAAQK,QAAa,IAAI;AACxD,QAAI,WAAW;AACb,UAAI;AACF,cAAM,SAAS,KAAK,MAAM,SAAS;AACnC,cAAM,SAAS,EAAE,GAAG,QAAQ,GAAG,UAAA;AAC/B,qBAAa,QAAQA,QAAa,MAAM,KAAK,UAAU,MAAM,CAAC;AAC9D,iBAAS,WAAS,EAAE,GAAG,MAAM,MAAM,SAAS;AAAA,MAC9C,QAAQ;AAAA,MAAe;AAAA,IACzB;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,sBAAoB;AAAA,IAClB,SAAS,MAAM,WAAW,eAAe,MAAM,SAAS;AAAA,IACxD;AAAA,IACA,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,OAAO;AAAA,EAAA,CACR;AAGDZ,QAAAA,UAAU,MAAM;AACd,UAAM,cAAc,aAAa,QAAQY,QAAa,UAAU,KAAK,aAAa,QAAQA,QAAa,KAAK;AAC5G,UAAM,aAAa,aAAa,QAAQA,QAAa,IAAI;AAEzD,QAAI,eAAe,YAAY;AAC7B,UAAI;AACF,cAAM,OAAO,KAAK,MAAM,UAAU;AAClC,iBAAS,WAAS,EAAE,GAAG,MAAM,MAAM,QAAQ,cAAc;AAAA,MAC3D,QAAQ;AACN,qBAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAA,CAAE;AAGLZ,QAAAA,UAAU,MAAM;AACd,QAAI,uBAAuB,CAAC,MAAM,qBAAqB,CAAC,MAAM,MAAM;AAClE,sBAAA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,qBAAqB,MAAM,mBAAmB,MAAM,IAAI,CAAC;AAG7DA,QAAAA,UAAU,MAAM;AAEd,QAAI,MAAM,WAAW,eAAe,CAAC,MAAM,kBAAmB;AAE9D,UAAM,MAAM,kBAAkB,kBAAA;AAC9B,UAAM,kBAAkB,KAAK,KAAK,MAAM,MAAM,KAAM,GAAK;AAEzD,QAAI,SAAS;AACX,cAAQ,IAAI,8CAA8C,kBAAkB,GAAI,WAAW,GAAG,IAAI;AAAA,IACpG;AAEA,UAAM,QAAQ,YAAY,YAAY;AACpC,UAAI;AACF,cAAM,kBAAkB,gBAAA;AAExB,mBAAW,aAAa;AACxB,YAAI,YAAA,EAAe,SAAQ,IAAI,uCAAuC;AAAA,MACxE,SAAS,KAAK;AACZ,YAAI,YAAA,EAAe,SAAQ,KAAK,oCAAoC,GAAG;AAAA,MACzE;AAAA,IACF,GAAG,eAAe;AAElB,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,GAAG,CAAC,MAAM,QAAQ,MAAM,mBAAmB,OAAO,CAAC;AAEnD,QAAM,kBAAkBO,MAAAA,YAAY,YAAY;AAC9C,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,OAAO;AAC1D,QAAI;AACF,YAAM,kBAAkB,gBAAA;AAExB,iBAAW,aAAa;AACxB,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,mBAAmB,MAAM,SAAS,QAAQ;AACvE,aAAO,EAAE,SAAS,KAAA;AAAA,IACpB,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,eAAe;AAC9D,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,iBAAiBC,MAAAA,YAAY,OACjC,OACA,WAA6B,WAC1B;AACH,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,MAAM,WAAW,KAAA,EAAO;AAC3E,QAAI;AACF,UAAI,CAAC,kBAAkB,kBAAkB;AACvC,cAAM,kBAAkB,gBAAA;AAAA,MAC1B;AACA,YAAM,WAAW,MAAM,kBAAkB,WAAW,OAAO,QAAQ;AAGnE,UAAI,SAAS,YAAY,SAAS,WAAW,kBAAkB,SAAS,eAAe;AACrF,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,cAAc,SAAS,iBAAiB;AAAA,UACxC,QAAQ;AAAA,UACR,aAAa,SAAS,eAAe;AAAA,UACrC,QAAQ,SAAS,UAAU;AAAA,UAC3B,MAAM,SAAS,OAAO;AAAA,YACpB,WAAW,OAAO,SAAS,KAAK,EAAE;AAAA,YAClC,MAAM,SAAS,KAAK;AAAA,YACpB,OAAO,SAAS,KAAK;AAAA,UAAA,IACnB;AAAA,UACJ,SAAS;AAAA,QAAA,EACT;AACF,eAAO,EAAE,SAAS,MAAM,QAAQ,eAAA;AAAA,MAClC;AAEA,UAAI,SAAS,WAAW,SAAS,eAAe;AAC9C,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,cAAc,SAAS;AAAA,UACvB,QAAQ,SAAS;AAAA,UACjB,aAAa,SAAS,eAAe;AAAA,UACrC,QAAQ,SAAS,UAAU;AAAA,UAC3B,MAAM,SAAS,OAAO;AAAA,YACpB,WAAW,OAAO,SAAS,KAAK,EAAE;AAAA,YAClC,MAAM,SAAS,KAAK;AAAA,YACpB,OAAO,SAAS,KAAK;AAAA,UAAA,IACnB;AAAA,UACJ,SAAS;AAAA,QAAA,EACT;AACF,eAAO,EAAE,SAAS,MAAM,QAAQ,SAAS,OAAA;AAAA,MAC3C;AAEA,UAAI,SAAS,eAAe,oBAAoB,SAAS,oBAAoB;AAC3E,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,mBAAmB;AAAA,YACjB,MAAM,SAAS;AAAA,YACf,OAAO,SAAS,uBAAuB,UACnC,SAAS,oBACT,SAAS;AAAA,UAAA;AAAA,UAEf,SAAS;AAAA,UACT,OAAO;AAAA,UACP,WAAW;AAAA,QAAA,EACX;AACF,eAAO,EAAE,SAAS,OAAO,YAAY,iBAAA;AAAA,MACvC;AAEA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,QAC3B,WAAW,SAAS,cAAc;AAAA,MAAA,EAClC;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,oBAAqB;AACpE,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,iBAAiBC,MAAAA,YAAY,OACjC,SACA,OACA,WAA6B,WAC1B;AACH,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,MAAM,WAAW,KAAA,EAAO;AAC3E,QAAI;AACF,UAAI,CAAC,kBAAkB,kBAAkB;AACvC,cAAM,kBAAkB,gBAAA;AAAA,MAC1B;AACA,YAAM,WAAW,MAAM,kBAAkB,WAAW,SAAS,OAAO,QAAQ;AAG5E,UAAI,SAAS,YAAY,SAAS,WAAW,kBAAkB,SAAS,eAAe;AACrF,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,cAAc,SAAS,iBAAiB;AAAA,UACxC,QAAQ;AAAA,UACR,aAAa,SAAS,eAAe;AAAA,UACrC,MAAM,SAAS,OAAO;AAAA,YACpB,WAAW,OAAO,SAAS,KAAK,EAAE;AAAA,YAClC,MAAM,SAAS,KAAK;AAAA,YACpB,OAAO,SAAS,KAAK;AAAA,UAAA,IACnB;AAAA,UACJ,SAAS;AAAA,QAAA,EACT;AACF,eAAO,EAAE,SAAS,MAAM,QAAQ,eAAA;AAAA,MAClC;AAEA,UAAI,SAAS,WAAW,SAAS,eAAe;AAC9C,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,cAAc,SAAS;AAAA,UACvB,QAAQ,SAAS;AAAA,UACjB,aAAa,SAAS,eAAe;AAAA,UACrC,SAAS;AAAA,QAAA,EACT;AACF,eAAO,EAAE,SAAS,MAAM,QAAQ,SAAS,OAAA;AAAA,MAC3C;AAEA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,QAC3B,WAAW,SAAS,cAAc;AAAA,MAAA,EAClC;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,oBAAqB;AACpE,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,qBAAqBC,kBAAY,OAAO,YAAoB;AAChE,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,OAAO;AAC1D,QAAI;AACF,UAAI,CAAC,kBAAkB,kBAAkB;AACvC,cAAM,kBAAkB,gBAAA;AAAA,MAC1B;AACA,YAAM,WAAW,MAAM,kBAAkB,eAAe,OAAO;AAG/D,UAAI,SAAS,WAAW,SAAS,gBAAgB,SAAS,eAAe;AACvE,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,cAAc,SAAS;AAAA,UACvB,QAAQ;AAAA,UACR,aAAa,SAAS,eAAe;AAAA,UACrC,MAAM,SAAS,OAAO;AAAA,YACpB,WAAW,OAAO,SAAS,KAAK,EAAE;AAAA,YAClC,MAAM,SAAS,KAAK;AAAA,YACpB,OAAO,SAAS,KAAK;AAAA,UAAA,IACnB;AAAA,UACJ,SAAS;AAAA,QAAA,EACT;AACF,eAAO,EAAE,SAAS,MAAM,QAAQ,eAAA;AAAA,MAClC;AAGA,UAAI,SAAS,WAAW,SAAS,gBAAgB;AAC/C,iBAAS,WAAS,EAAE,GAAG,MAAM,SAAS,QAAQ;AAC9C,eAAO,EAAE,SAAS,MAAM,QAAQ,aAAa,gBAAgB,SAAS,eAAA;AAAA,MACxE;AAGA,UAAI,SAAS,WAAW,SAAS,eAAe;AAC9C,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,cAAc,SAAS;AAAA,UACvB,QAAQ,SAAS;AAAA,UACjB,SAAS;AAAA,QAAA,EACT;AACF,eAAO,EAAE,SAAS,MAAM,QAAQ,SAAS,OAAA;AAAA,MAC3C;AAEA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,QAC3B,WAAW,SAAS,cAAc;AAAA,MAAA,EAClC;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,oBAAqB;AACpE,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,WAAWC,kBAAY,OAC3B,SAQG;AACH,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,MAAM,WAAW,KAAA,EAAO;AAC3E,QAAI;AACF,UAAI,CAAC,kBAAkB,kBAAkB;AACvC,cAAM,kBAAkB,gBAAA;AAAA,MAC1B;AACA,YAAM,mBAAmB,gBAAgB,eAAe,UAAU;AAElE,YAAM,WAAW,MAAM,kBAAkB,SAAS;AAAA,QAChD,GAAG;AAAA,QACH,OAAO,qBAAqB,UAAU,KAAK,KAAK;AAAA,QAChD,mBAAmB;AAAA,MAAA,CACpB;AAED,UAAI,SAAS,WAAW,SAAS,eAAe;AAC9C,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,cAAc,SAAS;AAAA,UACvB,QAAQ,SAAS;AAAA,UACjB,WAAW,SAAS,cAAc;AAAA,UAClC,WAAW,SAAS,eAAe;AAAA,UACnC,UAAU,SAAS,WAAW;AAAA,YAC5B,MAAM,SAAS,SAAS;AAAA,YACxB,kBAAkB,SAAS,SAAS;AAAA,YACpC,SAAS;AAAA,cACP,UAAU,SAAS,SAAS,QAAQ;AAAA,cACpC,mBAAmB,SAAS,SAAS,QAAQ;AAAA,cAC7C,iBAAiB,SAAS,SAAS,QAAQ;AAAA,cAC3C,aAAa,SAAS,SAAS,QAAQ;AAAA,cACvC,aAAa,SAAS,SAAS,QAAQ;AAAA,YAAA;AAAA,UACzC,IACE;AAAA,UACJ,SAAS;AAAA,QAAA,EACT;AACF,eAAO,EAAE,SAAS,MAAM,QAAQ,SAAS,OAAA;AAAA,MAC3C;AAEA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,QAC3B,WAAW,SAAS,cAAc;AAAA,MAAA,EAClC;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,eAAgB;AAC/D,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,iBAAiBC,kBAAY,OAAO,aAAqB;AAC7D,QAAI,CAAC,MAAM,cAAc;AACvB,aAAO,EAAE,SAAS,OAAO,OAAO,mBAAA;AAAA,IAClC;AACA,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,OAAO;AAC1D,QAAI;AACF,YAAM,WAAW,MAAM,kBAAkB,SAAS,MAAM,cAAc,EAAE,UAAU;AAElF,UAAI,SAAS,WAAW,SAAS,gBAAgB;AAC/C,cAAM,iBAAiB,MAAM,kBAAkB,SAAS,SAAS,cAAc;AAC/E,YAAI,eAAe,SAAS;AAC1B,gBAAM,EAAE,MAAM,UAAA,IAAc,YAAY,gBAAgB,kBAAkB;AAC1E,mBAAS,CAAA,UAAS;AAAA,YAChB,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,cAAc;AAAA,YACd,SAAS;AAAA,UAAA,EACT;AACF,iBAAO,EAAE,SAAS,MAAM,MAAM,WAAW,gBAAgB,SAAS,eAAA;AAAA,QACpE;AACA,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,SAAS;AAAA,UACT,OAAO,eAAe,WAAW;AAAA,UACjC,WAAW;AAAA,QAAA,EACX;AACF,eAAO,EAAE,SAAS,OAAO,YAAY,kBAAA;AAAA,MACvC;AAEA,UAAI,SAAS,cAAc;AACzB,iBAAS,CAAA,UAAS,EAAE,GAAG,MAAM,QAAQ,eAAe,SAAS,QAAQ;AACrE,eAAO,EAAE,SAAS,MAAM,cAAc,KAAA;AAAA,MACxC;AAGA,UAAI,SAAS,YAAY,SAAS,WAAW,kBAAkB,SAAS,eAAe;AACrF,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,cAAc,SAAS,iBAAiB,KAAK;AAAA,UAC7C,aAAa,SAAS,eAAe,KAAK;AAAA,UAC1C,MAAM,SAAS,OAAO;AAAA,YACpB,WAAW,OAAO,SAAS,KAAK,EAAE;AAAA,YAClC,MAAM,SAAS,KAAK;AAAA,YACpB,OAAO,SAAS,KAAK;AAAA,UAAA,IACnB,KAAK;AAAA,UACT,QAAQ,SAAS,UAAU,KAAK;AAAA,UAChC,SAAS;AAAA,QAAA,EACT;AACF,eAAO,EAAE,SAAS,MAAM,QAAQ,eAAA;AAAA,MAClC;AAEA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,QAC3B,WAAW,SAAS,cAAc;AAAA,MAAA,EAClC;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,eAAe;AAC9D,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,QAAM,YAAYC,kBAAY,OAAO,YAAoB;AACvD,QAAI,CAAC,MAAM,cAAc;AACvB,aAAO,EAAE,SAAS,OAAO,OAAO,mBAAA;AAAA,IAClC;AACA,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,OAAO;AAC1D,QAAI;AACF,YAAM,WAAW,MAAM,kBAAkB,SAAS,MAAM,cAAc,EAAE,UAAU,SAAS;AAE3F,UAAI,SAAS,WAAW,SAAS,gBAAgB;AAC/C,cAAM,iBAAiB,MAAM,kBAAkB,SAAS,SAAS,cAAc;AAC/E,YAAI,eAAe,SAAS;AAC1B,gBAAM,EAAE,MAAM,UAAA,IAAc,YAAY,gBAAgB,kBAAkB;AAC1E,mBAAS,CAAA,UAAS;AAAA,YAChB,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,cAAc;AAAA,YACd,SAAS;AAAA,UAAA,EACT;AACF,iBAAO,EAAE,SAAS,MAAM,MAAM,WAAW,gBAAgB,SAAS,eAAA;AAAA,QACpE;AACA,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,SAAS;AAAA,UACT,OAAO,eAAe,WAAW;AAAA,UACjC,WAAW;AAAA,QAAA,EACX;AACF,eAAO,EAAE,SAAS,OAAO,YAAY,kBAAA;AAAA,MACvC;AAEA,UAAI,SAAS,WAAW,SAAS,WAAW,wBAAwB;AAClE,iBAAS,CAAA,UAAS,EAAE,GAAG,MAAM,QAAQ,wBAAwB,SAAS,QAAQ;AAC9E,eAAO,EAAE,SAAS,MAAM,QAAQ,uBAAA;AAAA,MAClC;AAGA,UAAI,SAAS,YAAY,SAAS,WAAW,kBAAkB,SAAS,eAAe;AACrF,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,QAAQ;AAAA,UACR,cAAc,SAAS,iBAAiB,KAAK;AAAA,UAC7C,aAAa,SAAS,eAAe,KAAK;AAAA,UAC1C,MAAM,SAAS,OAAO;AAAA,YACpB,WAAW,OAAO,SAAS,KAAK,EAAE;AAAA,YAClC,MAAM,SAAS,KAAK;AAAA,YACpB,OAAO,SAAS,KAAK;AAAA,UAAA,IACnB,KAAK;AAAA,UACT,QAAQ,SAAS,UAAU,KAAK;AAAA,UAChC,SAAS;AAAA,QAAA,EACT;AACF,eAAO,EAAE,SAAS,MAAM,QAAQ,eAAA;AAAA,MAClC;AAEA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,QAC3B,WAAW,SAAS,cAAc;AAAA,MAAA,EAClC;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,iBAAiB;AAChE,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,QAAM,aAAaC,kBAAY,OAAO,aAAqB;AACzD,QAAI,CAAC,MAAM,cAAc;AACvB,aAAO,EAAE,SAAS,OAAO,OAAO,mBAAA;AAAA,IAClC;AACA,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,OAAO;AAC1D,QAAI;AACF,YAAM,WAAW,MAAM,kBAAkB,WAAW,MAAM,cAAc,QAAQ;AAEhF,UAAI,SAAS,WAAW,SAAS,gBAAgB;AAC/C,cAAM,iBAAiB,MAAM,kBAAkB,SAAS,SAAS,cAAc;AAC/E,YAAI,eAAe,SAAS;AAC1B,gBAAM,EAAE,MAAM,UAAA,IAAc,YAAY,gBAAgB,kBAAkB;AAC1E,mBAAS,CAAA,UAAS;AAAA,YAChB,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,cAAc;AAAA,YACd,SAAS;AAAA,UAAA,EACT;AACF,iBAAO,EAAE,SAAS,MAAM,MAAM,UAAA;AAAA,QAChC;AAAA,MACF;AAEA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,QAC3B,WAAW,SAAS,cAAc;AAAA,MAAA,EAClC;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,qBAAqB;AACpE,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,QAAM,cAAcC,MAAAA,YAAY,YAAY;AAC1C,QAAI,CAAC,MAAM,cAAc;AACvB,aAAO,EAAE,SAAS,OAAO,OAAO,mBAAA;AAAA,IAClC;AACA,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,OAAO;AAC1D,QAAI;AACF,YAAM,WAAW,MAAM,kBAAkB,YAAY,MAAM,YAAY;AAEvE,UAAI,SAAS,WAAW,SAAS,gBAAgB;AAC/C,cAAM,iBAAiB,MAAM,kBAAkB,SAAS,SAAS,cAAc;AAC/E,YAAI,eAAe,SAAS;AAC1B,gBAAM,EAAE,MAAM,UAAA,IAAc,YAAY,gBAAgB,kBAAkB;AAC1E,mBAAS,CAAA,UAAS;AAAA,YAChB,GAAG;AAAA,YACH,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,cAAc;AAAA,YACd,SAAS;AAAA,UAAA,EACT;AACF,iBAAO,EAAE,SAAS,MAAM,MAAM,WAAW,gBAAgB,SAAS,eAAA;AAAA,QACpE;AAAA,MACF;AAEA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,QAC3B,WAAW,SAAS,cAAc;AAAA,MAAA,EAClC;AACF,aAAO,EAAE,SAAS,MAAA;AAAA,IACpB,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,SAAU;AACzD,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,OAAO,YAAY,KAAA;AAAA,IACvC;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,QAAM,YAAYC,MAAAA,YAAY,YAAY;AACxC,QAAI,CAAC,MAAM,cAAc;AACvB,aAAO,EAAE,SAAS,OAAO,OAAO,mBAAA;AAAA,IAClC;AACA,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,OAAO;AAC1D,QAAI;AACF,YAAM,WAAW,MAAM,kBAAkB,UAAU,MAAM,YAAY;AACrE,eAAS,WAAS,EAAE,GAAG,MAAM,SAAS,QAAQ;AAC9C,aAAO;AAAA,QACL,SAAS,SAAS;AAAA,QAClB,UAAU,SAAS;AAAA,QACnB,SAAS,SAAS;AAAA,QAClB,cAAc,SAAS;AAAA,MAAA;AAAA,IAE3B,SAAS,KAAK;AACZ,YAAM,EAAE,SAAS,KAAA,IAASD,kBAAgB,KAAK,WAAW;AAC1D,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,WAAW,KAAA,EAAO;AAC/E,aAAO,EAAE,SAAS,MAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,QAAM,aAAaC,kBAAY,CAAC,SAAiC;AAC/D,UAAM,EAAE,MAAM,UAAA,IAAc,YAAY,MAAM,kBAAkB;AAChE,aAAS,CAAA,UAAS;AAAA,MAChB,GAAG;AAAA,MACH,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,cAAc;AAAA,IAAA,EACd;AAAA,EACJ,GAAG,CAAC,kBAAkB,CAAC;AAEvB,QAAM,SAASA,MAAAA,YAAY,YAAY;AACrC,UAAM,QAAQ,aAAa,QAAQK,QAAa,UAAU,KAAK,aAAa,QAAQA,QAAa,KAAK;AACtG,QAAI;AACF,UAAI,OAAO;AACT,cAAM,kBAAkB,OAAO,KAAK;AAAA,MACtC;AAAA,IACF,QAAQ;AAAA,IAAe;AAEvB,iBAAA;AAEA,aAAS;AAAA,MACP,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,mBAAmB;AAAA,MACnB,UAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO;AAAA,MACP,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,IAAA,CACZ;AAAA,EACH,GAAG,CAAA,CAAE;AAEL,QAAM,QAAQL,MAAAA,YAAY,MAAM;AAC9B,aAAS,CAAA,UAAS;AAAA,MAChB,GAAG;AAAA,MACH,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,mBAAmB;AAAA,MACnB,UAAU;AAAA,MACV,OAAO;AAAA,MACP,WAAW;AAAA,IAAA,EACX;AAAA,EACJ,GAAG,CAAA,CAAE;AAEL,QAAM,aAAaA,MAAAA,YAAY,MAAM;AACnC,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,OAAO,MAAM,WAAW,OAAO;AAAA,EAC9D,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA;AAAA,IAEL,mBAAmB,MAAM;AAAA,IACzB,cAAc,MAAM;AAAA,IACpB,QAAQ,MAAM;AAAA,IACd,MAAM,MAAM;AAAA,IACZ,aAAa,MAAM;AAAA,IACnB,QAAQ,MAAM;AAAA,IACd,mBAAmB,MAAM;AAAA,IACzB,UAAU,MAAM;AAAA,IAChB,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,IACb,WAAW,MAAM;AAAA,IACjB,iBAAiB,MAAM,WAAW,eAAe,MAAM,SAAS;AAAA;AAAA,IAGhE;AAAA,IAEA;AAAA,IACA,aAAa,gBAAgB;AAAA,IAC7B,WAAW,MAAM;AAAA,IACjB,WAAW,MAAM;AAAA;AAAA,IAGjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AC5vBA,MAAMC,MAAI;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AACT;AAGA,MAAMC,eAAa,CAAC,QAAqC;AAAA,EACvD,QAAQ;AAAA,EAAU,OAAO;AAAA,EAAQ,QAAQ;AAAA,EAAQ,iBAAiB;AAAA,EAAI,cAAc;AAAA,EACpF,SAAS;AAAA,EAAQ,YAAY;AAAA,EAAU,gBAAgB;AACzD;AAEA,MAAMC,iBAAoC;AAAA,EACxC,UAAU;AAAA,EAAY,MAAM;AAAA,EAAQ,KAAK;AAAA,EAAQ,YAAY;AAAA,EAAQ,QAAQ;AAAA,EAC7E,QAAQ;AAAA,EAAW,SAAS;AAAA,EAAU,cAAc;AAAA,EAAY,OAAOF,IAAE;AAAA,EAAS,QAAQ;AAC5F;AAEA,MAAMK,cAAiC;AAAA,EACrC,OAAOL,IAAE;AAAA,EAAS,QAAQ;AAAA,EAAW,YAAY;AAAA,EAAQ,QAAQ;AAAA,EACjE,YAAY;AAAA,EAAK,gBAAgB;AAAA,EAAa,UAAU;AAC1D;AAEA,MAAM,gBAAqC;AAAA,EACzC,SAAS;AAAA,EAAW,cAAc;AAAA,EAAY,iBAAiBA,IAAE;AAAA,EACjE,OAAOA,IAAE;AAAA,EAAK,UAAU;AAC1B;AAEA,MAAM,iBAAsC;AAAA,EAC1C,OAAO;AAAA,EAAQ,QAAQ;AAAA,EAAU,gBAAgB;AAAA,EAAc,KAAK;AAAA,EACpE,WAAW;AAAA,EAAiB,iBAAiBA,IAAE;AAAA,EAAS,aAAaA,IAAE;AACzE;AAEA,MAAM,kBAAkB,CAAC,QAAqC;AAAA,EAC5D,OAAO;AAAA,EAAU,QAAQ;AAAA,EAAU,iBAAiB;AAAA,EAAI,cAAc;AAAA,EACtE,SAAS;AAAA,EAAQ,YAAY;AAAA,EAAU,gBAAgB;AAAA,EAAU,YAAY;AAC/E;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EAAM;AAAA,EAAc;AAAA,EAAkB;AAAA,EAAgB;AAAA,EAAY;AAAA,EAAW;AAAA,EAAS,qBAAqB;AAAA,EAAM;AACnH,GAAoB;AAClB,QAAM;AAAA,IACJ;AAAA,IAAQ;AAAA,IAAM;AAAA,IAAa;AAAA,IAAmB,SAAS;AAAA,IAAa,OAAO;AAAA,IAC3E;AAAA,IAAgB;AAAA,IAAgB;AAAA,IAAgB;AAAA,IAAW;AAAA,IAAa;AAAA,IACxE;AAAA,IAAW;AAAA,IAAY,OAAO;AAAA,IAAW;AAAA,EAAA,IACvC,cAAc,EAAE,YAAY,WAAW,oBAAoB;AAE/D,QAAM,CAAC,MAAM,OAAO,IAAIJ,MAAAA,SAAoB,QAAQ;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAS,EAAE;AACrC,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAAS,EAAE;AAC3C,QAAM,CAAC,cAAc,eAAe,IAAIA,MAAAA,SAAS,KAAK;AACtD,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAAwB,IAAI;AAC5D,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAS,EAAE;AACrC,QAAM,CAAC,cAAc,eAAe,IAAIA,MAAAA,SAAS,EAAE;AACnD,QAAM,CAAC,cAAc,eAAe,IAAIA,MAAAA,SAAS,EAAE;AACnD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,MAAAA,SAAS,EAAE;AACrD,QAAM,CAAC,YAAY,aAAa,IAAIA,MAAAA,SAAwB,IAAI;AAChE,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,MAAAA,SAAS,CAAC;AACtD,QAAM,CAAC,cAAc,eAAe,IAAIA,MAAAA,SAAS,KAAK;AACtD,QAAM,CAAC,WAAW,YAAY,IAAIA,MAAAA,SAAoD,IAAI;AAC1F,QAAM,CAAC,sBAAsB,uBAAuB,IAAIA,MAAAA,SAAS,KAAK;AAEtE,QAAM,UAAU;AAChB,QAAM,eAAe,eAAe;AACpC,QAAM,QAAQ,cAAc;AAE5BJ,QAAAA,UAAU,MAAM;AACd,QAAI,iBAAiB,GAAG;AACtB,YAAM,QAAQ,WAAW,MAAM,kBAAkB,OAAK,IAAI,CAAC,GAAG,GAAI;AAClE,aAAO,MAAM,aAAa,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AAEnBA,QAAAA,UAAU,MAAM;AACd,QAAI,WAAW,mBAAoB,SAAQ,gBAAgB;AAAA,aAClD,WAAW,eAAe;AACjC,UAAI,SAAS,iBAAiB,SAAS,0BAA0B,WAAW;AAAA,eACnE,SAAS,cAAe,SAAQ,WAAW;AACpD,wBAAkB,EAAE;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,QAAQ,IAAI,CAAC;AAEjBA,QAAAA,UAAU,MAAM;AACd,QAAI,gBAAgB,WAAW;AAC7B,YAAM,QAAQ,WAAW,MAAM;AAC7B,mBAAW,EAAE,SAAS,MAAM,OAAO,UAAU,OAAO,YAAY,IAAI,KAAK,KAAK,QAAQ,KAAK,KAAK,KAAK,KAAK,GAAI,EAAE,eAAe,MAAM,UAAU,MAAa;AAC5J,yDAAiB,UAAU,OAAO,UAAU;AAAA,MAC9C,GAAG,GAAI;AACP,aAAO,MAAM,aAAa,KAAK;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,cAAc,SAAS,CAAC;AAE5B,QAAM,aAAa,MAAM;AACvB,YAAQ,QAAQ;AAAG,aAAS,EAAE;AAAG,gBAAY,EAAE;AAC/C,oBAAgB,KAAK;AAAG,gBAAY,IAAI;AAAG,aAAS,EAAE;AAAG,oBAAgB,EAAE;AAAG,oBAAgB,EAAE;AAChG,qBAAiB,EAAE;AAAG,kBAAc,IAAI;AAAG,oBAAgB,KAAK;AAAG,iBAAa,IAAI;AACpF,sBAAkB,CAAC;AAAG,cAAA;AAAA,EACxB;AAEAA,QAAAA,UAAU,MAAM;AAAE,QAAI,CAAC,KAAM,YAAA;AAAA,EAAc,GAAG,CAAC,IAAI,CAAC;AAEpD,QAAM,wBAAwB,OAAO,kBAA0B;AAC7D,QAAI;AACF,YAAM,WAAW,MAAM,kBAAkB,SAAS,aAAa;AAC/D,UAAI,SAAS,WAAW,SAAS,OAAO;AACtC,qBAAa,EAAE,OAAO,SAAS,OAAO,MAAM,SAAS,MAAmB;AACxE,wBAAgB,IAAI;AAAA,MACtB,OAAO;AACL,sBAAc,gDAAgD;AAAA,MAChE;AAAA,IACF,QAAQ;AAAE,oBAAc,gCAAgC;AAAA,IAAG;AAAA,EAC7D;AAEA,QAAM,mBAAmB,YAAY;AACnC,kBAAc,IAAI;AAAG,eAAA;AACrB,QAAI,CAAC,MAAM,QAAQ;AAAE,oBAAc,6BAA6B;AAAG;AAAA,IAAQ;AAC3E,QAAI,CAAC,6BAA6B,KAAK,KAAK,GAAG;AAAE,oBAAc,wBAAwB;AAAG;AAAA,IAAQ;AAClG,UAAM,SAAS,MAAM,eAAe,MAAM,MAAM;AAChD,QAAI,OAAO,YAAW,6BAAM,MAAM,aAAY,KAAK,IAAI;AAAA,EACzD;AAEA,QAAM,4BAA4B,OAAO,MAAuB;AAC9D,MAAE,eAAA;AAAkB,kBAAc,IAAI;AAAG,eAAA;AACzC,QAAI,CAAC,UAAU;AAAE,oBAAc,4BAA4B;AAAG;AAAA,IAAQ;AACtE,QAAI,SAAS,SAAS,GAAG;AAAE,oBAAc,qDAAqD;AAAG;AAAA,IAAQ;AACzG,UAAM,SAAS,MAAM,eAAe,QAAQ;AAC5C,QAAI,OAAO,WAAY,OAAe,eAAgB,OAAM,sBAAuB,OAAe,cAAc;AAAA,EAClH;AAEA,QAAM,uBAAuB,YAAY;AACvC,kBAAc,IAAI;AAAG,eAAA;AACrB,QAAI,aAAa,WAAW,GAAG;AAAE,oBAAc,kCAAkC;AAAG;AAAA,IAAQ;AAC5F,UAAM,SAAS,MAAM,UAAU,YAAY;AAC3C,QAAI,OAAO,WAAY,OAAe,eAAgB,OAAM,sBAAuB,OAAe,cAAc;AAAA,EAClH;AAEA,QAAM,kBAAkB,YAAY;AAClC,kBAAc,IAAI;AAAG,eAAA;AACrB,UAAM,aAAa,MAAM,QAAQ,OAAO,EAAE;AAC1C,QAAI,WAAW,WAAW,GAAG;AAAE,oBAAc,+CAA+C;AAAG;AAAA,IAAQ;AACvG,UAAM,eAAe,SAAS,UAAU;AAAA,EAC1C;AAEA,QAAM,oBAAoB,YAAY;AACpC,kBAAc,IAAI;AAAG,eAAA;AACrB,QAAI,aAAa,WAAW,GAAG;AAAE,oBAAc,sCAAsC;AAAG;AAAA,IAAQ;AAChG,UAAM,SAAS,MAAM,UAAU,YAAY;AAC3C,QAAI,OAAO,WAAY,OAAe,eAAgB,OAAM,sBAAuB,OAAe,cAAc;AAAA,EAClH;AAEA,QAAM,wBAAwB,YAAY;AACxC,kBAAc,IAAI;AAAG,eAAA;AACrB,QAAI,cAAc,WAAW,GAAG;AAAE,oBAAc,sCAAsC;AAAG;AAAA,IAAQ;AACjG,UAAM,SAAS,MAAM,mBAAmB,aAAa;AACrD,QAAI,OAAO,SAAS;AAClB,UAAK,OAAe,gBAAgB;AAClC,cAAM,sBAAuB,OAAe,cAAc;AAAA,MAC5D;AAAA,IAEF;AAAA,EACF;AAEA,QAAM,oBAAoB,YAAY;AACpC,kBAAc,IAAI;AAAG,eAAA;AACrB,UAAM,SAAS,MAAM,YAAA;AACrB,QAAI,OAAO,WAAW,OAAO,eAAgB,OAAM,sBAAsB,OAAO,cAAc;AAAA,EAChG;AAEA,QAAM,kBAAkB,YAAY;AAClC,QAAI,iBAAiB,EAAG;AACxB,UAAM,SAAS,MAAM,UAAA;AACrB,QAAI,OAAO,QAAS,mBAAkB,OAAO,YAAY,EAAE;AAAA,EAC7D;AAEA,QAAM,SAAS,MAAM;AACnB,kBAAc,IAAI;AAAG,eAAA;AACrB,YAAQ,MAAA;AAAA,MACN,KAAK;AAAA,MAAe,KAAK;AAAA,MAAe,KAAK;AAAc,gBAAQ,QAAQ;AAAG,kBAAA;AAAa;AAAA,MAC3F,KAAK;AAAA,MAAkB,KAAK;AAAa,gBAAQ,aAAa;AAAG,kBAAA;AAAa;AAAA,MAC9E,KAAK;AAAa,gBAAQ,aAAa;AAAG,kBAAA;AAAa;AAAA,MACvD;AAAS,gBAAQ,QAAQ;AAAG,kBAAA;AAAA,IAAU;AAAA,EAE1C;AAGA,QAAM,cAAc,MAAM,QAAQF,2BAAAA,IAAC,SAAI,OAAO,eAAgB,iBAAM,IAAS;AAE7E,QAAM,gBAAgB,MACpBA,2BAAAA,IAAC,YAAO,SAAS,QAAQ,OAAOY,gBAAc,MAAK,UACjD,UAAAZ,+BAAC,eAAA,EAAc,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU,GAC3D;AAGF,QAAM,mBAAmB,MACvBA,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,WAAW,UAAU,UAAU,WAAA,GAC1C,UAAA,iBAAiB,oCACf,QAAA,EAAK,OAAO,EAAE,OAAOU,IAAE,WAAW,UAAA;AAAA,IAAA;AAAA,IAAe;AAAA,IAAe;AAAA,EAAA,EAAA,CAAC,IAElEV,2BAAAA,IAAC,UAAA,EAAO,MAAK,UAAS,OAAOe,aAAW,SAAS,iBAAiB,UAAA,2BAAA,CAElE,EAAA,CAEJ;AAGF,QAAM,kBAAkB,CAAC,MAAc,aAAqB,SAAqB,UAAmB,eAClGf,2BAAAA,IAAC,QAAA,EAAO,SAAkB,UAAU,gBAAgB,UAAU,OAAO,EAAE,OAAO,QAAQ,GAAG,WAAA,GACtF,UAAA,+CACE,QAAA,EAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,YACzD,UAAA;AAAA,IAAAA,+BAAC,eAAY,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU;AAAA,IACtD;AAAA,EAAA,EAAA,CACH,IACE,MACN;AAGF,SACED,2BAAAA,KAAAc,qBAAA,EACE,UAAA;AAAA,IAAAb,+BAAC,QAAA,EAAO,MAAY,cAClB,UAAAA,2BAAAA,IAAC,eAAA,EAGE,UAAA,gBAAgB,YACfD,2BAAAA,KAAC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,MAAAC,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,GAAGW,aAAWD,IAAE,OAAO,GAAG,OAAO,QAAQ,QAAQ,OAAA,GAC7D,UAAAV,2BAAAA,IAAC,kBAAA,EAAiB,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,OAAOU,IAAE,MAAA,EAAM,CAAG,EAAA,CAC9E;AAAA,MACAV,2BAAAA,IAAC,eAAY,UAAA,oBAAA,CAAiB;AAAA,qCAC7B,mBAAA,EACC,UAAAD,2BAAAA,KAAC,QAAA,EAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,KAAK,UAAU,WAAW,YACxG,UAAA;AAAA,QAAAC,2BAAAA,IAAC,aAAA,EAAY,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,OAAOU,IAAE,QAAA,EAAQ,CAAG;AAAA,QAAE;AAAA,MAAA,EAAA,CAE7E,EAAA,CACF;AAAA,IAAA,GACF,IAGE,WAAW,kBAAkB,QAAQ,cACvCX,2BAAAA,KAAAc,qBAAA,EACE,UAAA;AAAA,MAAAd,2BAAAA,KAAC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,QAAAC,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,GAAGW,aAAWD,IAAE,UAAU,IAAI,GAAG,OAAO,QAAQ,QAAQ,UAClE,UAAA,YAAoB,sCACnB,OAAA,EAAI,KAAM,YAAoB,MAAM,KAAM,YAAoB,MAAM,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,cAAc,YAAY,IAE3IV,2BAAAA,IAAC,mBAAgB,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,OAAOU,IAAE,QAAA,EAAQ,CAAG,EAAA,CAEjF;AAAA,wCACC,aAAA,EAAY,UAAA;AAAA,UAAA;AAAA,UAAgB,YAAoB;AAAA,UAAK;AAAA,QAAA,GAAE;AAAA,wCACvD,mBAAA,EAAkB,UAAA;AAAA,UAAA;AAAA,UACTV,2BAAAA,IAAC,YAAO,OAAO,EAAE,OAAOU,IAAE,WAAY,UAAA,KAAK,KAAA,CAAK;AAAA,UAAS;AAAA,UAAuCV,2BAAAA,IAAC,YAAO,OAAO,EAAE,OAAOU,IAAE,WAAa,UAAA,YAAoB,KAAA,CAAK;AAAA,UAAS;AAAA,QAAA,EAAA,CACnL;AAAA,MAAA,GACF;AAAA,sCACC,OAAA,EAAI,OAAO,EAAE,WAAW,UACvB,UAAA;AAAA,QAAAX,gCAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,iBAAiBW,IAAE,SAAS,cAAc,UAAU,cAAc,QAAQ,UAAU,YAAY,OAAOA,IAAE,WAAW,UAAA;AAAA,UAAA;AAAA,UACpIV,+BAAC,YAAO,OAAO,EAAE,OAAOU,IAAE,QAAA,GAAW,UAAA,kBAAc;AAAA,UAAS;AAAA,UAA6DV,2BAAAA,IAAC,YAAO,OAAO,EAAE,OAAOU,IAAE,WAAa,UAAA,YAAoB,KAAA,CAAK;AAAA,UAAS;AAAA,QAAA,GACjN;AAAA,QACC,YAAA;AAAA,QACDV,2BAAAA,IAAC,QAAA,EAAO,SAAS,mBAAmB,UAAU,cAAc,OAAO,EAAE,OAAO,QAAQ,WAAW,UAAA,GAC5F,UAAA,eACCD,2BAAAA,KAAC,QAAA,EAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,SAAA,GACzD,UAAA;AAAA,UAAAC,+BAAC,eAAY,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU;AAAA,UAAE;AAAA,QAAA,EAAA,CAE3D,IACE,uCACN;AAAA,QACAA,2BAAAA,IAAC,QAAA,EAAO,SAAQ,WAAU,SAAS,MAAM;AAAE,oBAAA;AAAa,kBAAQ,QAAQ;AAAA,QAAG,GAAG,UAAU,cAAc,OAAO,EAAE,OAAO,QAAQ,WAAW,YAAY,UAAA,UAAA,CAErJ;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF,IAGE,oBACFD,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,MAAAd,2BAAAA,KAAC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,QAAAC,+BAAC,SAAI,OAAO,EAAE,GAAGW,aAAWD,IAAE,OAAO,GAAG,OAAO,QAAQ,QAAQ,UAC5D,UAAA,kBAAkB,SAAS,UAC1BV,2BAAAA,IAAC,YAAS,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,OAAOU,IAAE,QAAM,CAAG,IAEpEV,2BAAAA,IAAC,WAAA,EAAU,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,OAAOU,IAAE,SAAS,GAEzE;AAAA,QACAV,2BAAAA,IAAC,eAAY,UAAA,+BAAA,CAA4B;AAAA,QACzCA,2BAAAA,IAAC,qBAAkB,UAAA,0GAAA,CAEnB;AAAA,MAAA,GACF;AAAA,sCACC,OAAA,EAAI,OAAO,EAAE,WAAW,UACtB,UAAA;AAAA,QAAA,kBAAkB,SACjBD,gCAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,iBAAiBW,IAAE,SAAS,cAAc,UAAU,cAAc,UAC/F,UAAA;AAAA,UAAAV,2BAAAA,IAAC,KAAA,EAAE,OAAO,EAAE,UAAU,YAAY,OAAOU,IAAE,SAAS,cAAc,UAAA,GAAa,UAAA,oCAAA,CAAiC;AAAA,0CAC/G,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,UAAU,UAAU,YAAY,YAAY,KAAK,OAAOA,IAAE,WACjH,UAAA;AAAA,YAAA,kBAAkB,SAAS,UAC1BV,2BAAAA,IAAC,WAAA,EAAU,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,OAAOU,IAAE,WAAW,IAEvEV,2BAAAA,IAAC,UAAA,EAAS,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,OAAOU,IAAE,QAAA,EAAQ,CAAG;AAAA,YAExEV,2BAAAA,IAAC,QAAA,EAAM,UAAA,kBAAkB,MAAA,CAAM;AAAA,UAAA,EAAA,CACjC;AAAA,QAAA,GACF;AAAA,QAEFA,+BAAC,QAAA,EAAO,SAAS,MAAM;AACrB,cAAI,kBAAkB,SAAS,QAAS,SAAQ,aAAa;AAAA,uBAChD,aAAa;AAC1B,oBAAA;AAAA,QACF,GAAG,OAAO,EAAE,OAAO,OAAA,GAChB,UAAA,kBAAkB,SAAS,UAAU,+BAA+B,yBAAA,CACvE;AAAA,uCACC,QAAA,EAAO,SAAQ,WAAU,SAAS,MAAM,OAAO,KAAK,0BAA0B,QAAQ,GAAG,OAAO,EAAE,OAAO,QAAQ,WAAW,SAAA,GAAY,UAAA,mCAEzI;AAAA,uCACC,QAAA,EAAO,SAAQ,SAAQ,SAAS,MAAM,aAAa,KAAK,GAAG,OAAO,EAAE,OAAO,QAAQ,WAAW,SAAA,GAAY,UAAA,UAAA,CAE3G;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF,IAIAD,2BAAAA,KAAAc,WAAAA,UAAA,EACG,UAAA;AAAA,MAAA,SAAS,YAAY,cAAA;AAAA,MAGrB,SAAS,YACRd,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAd,2BAAAA,KAAC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,UAAAC,+BAAC,SAAI,OAAOW,aAAWD,IAAE,OAAO,GAC9B,yCAAC,iBAAA,EAAgB,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOA,IAAE,WAAW,GACnF;AAAA,UACAV,2BAAAA,IAAC,eAAY,UAAA,YAAA,CAAS;AAAA,UACtBA,2BAAAA,IAAC,qBAAkB,UAAA,wCAAA,CAAqC;AAAA,QAAA,GAC1D;AAAA,QACAD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,WAAW,QAAQ,SAAS,QAAQ,eAAe,UAAU,KAAK,UAAA,GAC7E,UAAA;AAAA,UAAA,YAAA;AAAA,UAEDA,2BAAAA,KAAC,QAAA,EAAO,SAAQ,WAAU,SAAS,MAAM,QAAQ,aAAa,GAAG,OAAO,gBACtE,UAAA;AAAA,YAAAC,+BAAC,SAAI,OAAO,gBAAgBU,IAAE,MAAM,GAClC,yCAAC,UAAA,EAAS,OAAO,EAAE,OAAO,WAAW,QAAQ,WAAW,OAAOA,IAAE,SAAS,GAC5E;AAAA,4CACC,OAAA,EACC,UAAA;AAAA,cAAAV,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,YAAY,KAAK,OAAOU,IAAE,QAAA,GAAW,UAAA,gBAAA,CAAa;AAAA,cAChEV,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,UAAU,WAAW,OAAOU,IAAE,WAAW,UAAA,uBAAA,CAAoB;AAAA,YAAA,EAAA,CAC7E;AAAA,UAAA,GACF;AAAA,UAEAX,2BAAAA,KAAC,QAAA,EAAO,SAAQ,WAAU,SAAS,MAAM,QAAQ,aAAa,GAAG,OAAO,gBACtE,UAAA;AAAA,YAAAC,+BAAC,SAAI,OAAO,gBAAgBU,IAAE,MAAM,GAClC,yCAAC,WAAA,EAAU,OAAO,EAAE,OAAO,WAAW,QAAQ,WAAW,OAAOA,IAAE,SAAS,GAC7E;AAAA,4CACC,OAAA,EACC,UAAA;AAAA,cAAAX,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,YAAY,KAAK,OAAOW,IAAE,WAAW,UAAA;AAAA,gBAAA;AAAA,gBAC7BV,+BAAC,UAAK,OAAO,EAAE,OAAOU,IAAE,QAAA,GAAW,UAAA,YAAA,CAAS;AAAA,cAAA,GAClE;AAAA,cACAV,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,UAAU,WAAW,OAAOU,IAAE,WAAW,UAAA,0BAAA,CAAuB;AAAA,YAAA,EAAA,CAChF;AAAA,UAAA,GACF;AAAA,UAEAX,2BAAAA,KAAC,QAAA,EAAO,SAAQ,WAAU,SAAS,MAAM,QAAQ,YAAY,GAAG,OAAO,gBACrE,UAAA;AAAA,YAAAC,+BAAC,SAAI,OAAO,gBAAgBU,IAAE,OAAO,GACnC,yCAAC,cAAA,EAAa,OAAO,EAAE,OAAO,WAAW,QAAQ,WAAW,OAAOA,IAAE,SAAS,GAChF;AAAA,4CACC,OAAA,EACC,UAAA;AAAA,cAAAV,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,YAAY,KAAK,OAAOU,IAAE,QAAA,GAAW,UAAA,YAAA,CAAS;AAAA,cAC5DV,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,UAAU,WAAW,OAAOU,IAAE,WAAW,UAAA,mCAAA,CAAgC;AAAA,YAAA,EAAA,CACzF;AAAA,UAAA,GACF;AAAA,UAGAX,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,WAAW,UAAU,UAAU,YAAY,YAAY,SAAA,GACnE,UAAA;AAAA,YAAAC,+BAAC,UAAK,OAAO,EAAE,OAAOU,IAAE,QAAA,GAAW,UAAA,0BAAsB;AAAA,YACzDV,2BAAAA,IAAC,UAAA,EAAO,MAAK,UAAS,OAAOe,aAAW,SAAS,MAAM,wBAAwB,IAAI,GAAG,UAAA,YAAA,CAAS;AAAA,UAAA,GACjG;AAAA,UAGAf,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,UAAU,YAAY,SAAS,WAAA,GAC3C,yCAAC,OAAA,EAAI,OAAO,EAAE,UAAU,YAAY,OAAO,GAAG,SAAS,QAAQ,YAAY,SAAA,GACzE,UAAAA,2BAAAA,IAAC,QAAA,EAAK,OAAO,EAAE,OAAO,QAAQ,WAAW,aAAaU,IAAE,OAAO,KAAG,CAAG,GACvE,GACF;AAAA,UAGC,sDACE,OAAA,EAAI,OAAO,EAAE,WAAW,UAAU,UAAU,WAAA,GAC3C,UAAA;AAAA,YAAAV,+BAAC,UAAK,OAAO,EAAE,OAAOU,IAAE,QAAA,GAAW,UAAA,2BAAuB;AAAA,YAC1DV,2BAAAA,IAAC,YAAO,MAAK,UAAS,OAAOe,aAAW,SAAS,kBAAkB,UAAA,iBAAA,CAAc;AAAA,UAAA,EAAA,CACnF;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,GACF;AAAA,MAID,SAAS,iBACRhB,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAd,2BAAAA,KAAC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,UAAAC,+BAAC,SAAI,OAAOW,aAAWD,IAAE,MAAM,GAC7B,yCAAC,UAAA,EAAS,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOA,IAAE,SAAS,GAC1E;AAAA,UACAV,2BAAAA,IAAC,eAAY,UAAA,sBAAA,CAAmB;AAAA,UAChCA,2BAAAA,IAAC,qBAAkB,UAAA,6BAAA,CAA0B;AAAA,QAAA,GAC/C;AAAA,QACAD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,WAAW,QAAQ,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAA,GAC7E,UAAA;AAAA,UAAA,YAAA;AAAA,UACDA,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,UAAA,GAC3D,UAAA;AAAA,YAAAC,2BAAAA,IAAC,OAAA,EAAM,SAAQ,SAAQ,UAAA,iBAAa;AAAA,YACpCA,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAAM,IAAG;AAAA,gBAAQ,MAAK;AAAA,gBAAQ,aAAY;AAAA,gBAAmB,OAAO;AAAA,gBACnE,UAAU,CAAA,MAAK,SAAS,EAAE,OAAO,KAAK;AAAA,gBAAG,UAAU;AAAA,gBACnD,WAAW,CAAA,MAAK;AAAE,sBAAI,EAAE,QAAQ,SAAS;AAAE,sBAAE,eAAA;AAAkB,qCAAA;AAAA,kBAAoB;AAAA,gBAAE;AAAA,cAAA;AAAA,YAAA;AAAA,UACvF,GACF;AAAA,UACAA,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,WAAW,WACvB,UAAAA,2BAAAA,IAAC,UAAA,EAAO,MAAK,UAAS,OAAO,EAAE,GAAGe,aAAW,UAAU,UAAA,GAAa,SAAS,MAAM,wBAAwB,IAAI,GAAG,UAAA,wBAAA,CAElH,EAAA,CACF;AAAA,UACC,gBAAgB,aAAa,mBAAmB,kBAAkB,CAAC,MAAM,MAAM;AAAA,UAC/E,sDACE,OAAA,EAAI,OAAO,EAAE,WAAW,UAAU,UAAU,WAAA,GAC3C,UAAA;AAAA,YAAAf,+BAAC,UAAK,OAAO,EAAE,OAAOU,IAAE,QAAA,GAAW,UAAA,2BAAuB;AAAA,YAC1DV,2BAAAA,IAAC,YAAO,MAAK,UAAS,OAAOe,aAAW,SAAS,kBAAkB,UAAA,iBAAA,CAAc;AAAA,UAAA,EAAA,CACnF;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,GACF;AAAA,MAID,SAAS,oBACRhB,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAd,2BAAAA,KAAC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,UAAAC,+BAAC,SAAI,OAAOW,aAAWD,IAAE,MAAM,GAC7B,yCAAC,UAAA,EAAS,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOA,IAAE,SAAS,GAC1E;AAAA,UACC,4CAAa,aAAA,EAAY,UAAA;AAAA,YAAA;AAAA,YAAS;AAAA,YAAS;AAAA,UAAA,GAAG;AAAA,UAC/CV,2BAAAA,IAAC,qBAAmB,UAAA,MAAA,CAAM;AAAA,QAAA,GAC5B;AAAA,QACAD,2BAAAA,KAAC,QAAA,EAAK,UAAU,2BAA2B,OAAO,EAAE,WAAW,QAAQ,SAAS,QAAQ,eAAe,UAAU,KAAK,UACnH,UAAA;AAAA,UAAA,YAAA;AAAA,UACDA,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,UAAA,GAC3D,UAAA;AAAA,YAAAA,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,YAAY,SAAA,GAC1E,UAAA;AAAA,cAAAC,2BAAAA,IAAC,OAAA,EAAM,SAAQ,YAAW,UAAA,gBAAY;AAAA,6CACrC,UAAA,EAAO,MAAK,UAAS,OAAO,EAAE,GAAGe,aAAW,UAAU,UAAA,GAAa,SAAS,MAAM,wBAAwB,IAAI,GAAG,UAAA,wBAAA,CAElH;AAAA,YAAA,GACF;AAAA,4CACC,OAAA,EAAI,OAAO,EAAE,UAAU,cACtB,UAAA;AAAA,cAAAf,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBAAM,IAAG;AAAA,kBAAW,MAAM,eAAe,SAAS;AAAA,kBAAY,aAAY;AAAA,kBAAW,OAAO;AAAA,kBAC3F,UAAU,CAAA,MAAK,YAAY,EAAE,OAAO,KAAK;AAAA,kBAAG,UAAU;AAAA,kBACtD,OAAO,EAAE,cAAc,SAAA;AAAA,gBAAS;AAAA,cAAA;AAAA,cAElCA,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBAAO,MAAK;AAAA,kBAAS,SAAS,MAAM,gBAAgB,CAAC,YAAY;AAAA,kBAChE,OAAO,EAAE,UAAU,YAAY,OAAO,GAAG,KAAK,GAAG,QAAQ,QAAQ,SAAS,aAAa,YAAY,QAAQ,QAAQ,QAAQ,QAAQ,UAAA;AAAA,kBAClI,UAAA,eACCA,+BAAC,YAAA,EAAW,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,OAAOU,IAAE,WAAW,IAExEV,2BAAAA,IAAC,SAAA,EAAQ,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,OAAOU,IAAE,QAAA,EAAQ,CAAG;AAAA,gBAAA;AAAA,cAAA;AAAA,YAEzE,EAAA,CACF;AAAA,UAAA,GACF;AAAA,UACAV,2BAAAA,IAAC,QAAA,EAAO,MAAK,UAAS,UAAU,gBAAgB,CAAC,UAAU,OAAO,EAAE,OAAO,OAAA,GACxE,UAAA,eACCD,gCAAC,QAAA,EAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,SAAA,GACzD,UAAA;AAAA,YAAAC,+BAAC,eAAY,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU;AAAA,YAAE;AAAA,UAAA,EAAA,CAE3D,IACE,eAAA,CACN;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAID,SAAS,eACRD,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAd,2BAAAA,KAAC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,UAAAC,+BAAC,SAAI,OAAOW,aAAWD,IAAE,MAAM,GAC7B,yCAAC,cAAA,EAAa,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOA,IAAE,SAAS,GAC9E;AAAA,UACAV,2BAAAA,IAAC,eAAY,UAAA,eAAA,CAAY;AAAA,0CACxB,mBAAA,EAAkB,UAAA;AAAA,YAAA;AAAA,2CACsB,MAAA,EAAG;AAAA,YAC1CA,+BAAC,YAAO,OAAO,EAAE,OAAOU,IAAE,QAAA,GAAY,UAAA,MAAA,CAAM;AAAA,UAAA,EAAA,CAC9C;AAAA,QAAA,GACF;AAAA,QACAX,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,WAAW,QAAQ,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAA,GAC7E,UAAA;AAAA,UAAA,YAAA;AAAA,yCACA,UAAA,EAAS,OAAO,cAAc,UAAU,iBAAiB,UAAU,cAAc;AAAA,UACjF,iBAAA;AAAA,UACA,gBAAgB,YAAY,mBAAmB,sBAAsB,aAAa,WAAW,CAAC;AAAA,QAAA,EAAA,CACjG;AAAA,MAAA,GACF;AAAA,MAID,SAAS,iBACRA,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAd,2BAAAA,KAAC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,UAAAC,+BAAC,SAAI,OAAOW,aAAWD,IAAE,MAAM,GAC7B,yCAAC,WAAA,EAAU,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOA,IAAE,SAAS,GAC3E;AAAA,UACAV,2BAAAA,IAAC,eAAY,UAAA,0BAAA,CAAuB;AAAA,UACpCA,2BAAAA,IAAC,qBAAkB,UAAA,gDAAA,CAA6C;AAAA,QAAA,GAClE;AAAA,QACAD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,WAAW,QAAQ,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAA,GAC7E,UAAA;AAAA,UAAA,YAAA;AAAA,UACDA,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,UAAA,GAC3D,UAAA;AAAA,YAAAC,2BAAAA,IAAC,SAAM,UAAA,YAAA,CAAS;AAAA,4CACf,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,UAAU,SAAS,WAAW,iBAAiBU,IAAE,SAAS,cAAc,cAChI,UAAA;AAAA,cAAAV,+BAAC,UAAK,OAAO,EAAE,UAAU,WAAA,GAAc,UAAA,QAAI;AAAA,cAC3CA,2BAAAA,IAAC,QAAA,EAAK,OAAO,EAAE,YAAY,KAAK,OAAOU,IAAE,WAAW,UAAA,iBAAA,CAAc;AAAA,YAAA,EAAA,CACpE;AAAA,UAAA,GACF;AAAA,UACAX,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,UAAA,GAC3D,UAAA;AAAA,YAAAC,2BAAAA,IAAC,OAAA,EAAM,SAAQ,eAAc,UAAA,uBAAmB;AAAA,YAChDA,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAAM,IAAG;AAAA,gBAAc,MAAK;AAAA,gBAAM,aAAY;AAAA,gBAAe,OAAO;AAAA,gBACnE,UAAU,CAAA,MAAK;AAAE,wBAAM,MAAM,EAAE,OAAO,MAAM,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,CAAC;AAAG,2BAAS,GAAG;AAAA,gBAAG;AAAA,gBAC3F,UAAU;AAAA,gBAAc,WAAW;AAAA,gBACnC,WAAW,CAAA,MAAK;AAAE,sBAAI,EAAE,QAAQ,SAAS;AAAE,sBAAE,eAAA;AAAkB,oCAAA;AAAA,kBAAmB;AAAA,gBAAE;AAAA,cAAA;AAAA,YAAA;AAAA,YAEtFD,2BAAAA,KAAC,OAAE,OAAO,EAAE,UAAU,WAAW,OAAOW,IAAE,QAAA,GAAW,UAAA;AAAA,cAAA;AAAA,cAAoB,MAAM,QAAQ,OAAO,EAAE,EAAE;AAAA,cAAO;AAAA,YAAA,EAAA,CAAG;AAAA,UAAA,GAC9G;AAAA,UACC,gBAAgB,wBAAwB,qBAAqB,iBAAiB,MAAM,QAAQ,OAAO,EAAE,EAAE,WAAW,CAAC;AAAA,UACnH,sDACE,OAAA,EAAI,OAAO,EAAE,WAAW,UAAU,UAAU,WAAA,GAC3C,UAAA;AAAA,YAAAV,+BAAC,UAAK,OAAO,EAAE,OAAOU,IAAE,QAAA,GAAW,UAAA,2BAAuB;AAAA,YAC1DV,2BAAAA,IAAC,YAAO,MAAK,UAAS,OAAOe,aAAW,SAAS,kBAAkB,UAAA,iBAAA,CAAc;AAAA,UAAA,EAAA,CACnF;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,GACF;AAAA,MAID,SAAS,eACRhB,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAd,2BAAAA,KAAC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,UAAAC,+BAAC,SAAI,OAAOW,aAAWD,IAAE,MAAM,GAC7B,yCAAC,WAAA,EAAU,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOA,IAAE,SAAS,GAC3E;AAAA,UACAV,2BAAAA,IAAC,eAAY,UAAA,eAAA,CAAY;AAAA,0CACxB,mBAAA,EAAkB,UAAA;AAAA,YAAA;AAAA,YACO;AAAA,4CACvB,UAAA,EAAO,OAAO,EAAE,OAAOU,IAAE,WAAW,UAAA;AAAA,cAAA;AAAA,cAAM,MAAM,MAAM,GAAG,CAAC;AAAA,cAAE;AAAA,cAAI,MAAM,MAAM,EAAE;AAAA,YAAA,EAAA,CAAE;AAAA,UAAA,EAAA,CACnF;AAAA,QAAA,GACF;AAAA,QACAX,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,WAAW,QAAQ,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAA,GAC7E,UAAA;AAAA,UAAA,YAAA;AAAA,yCACA,UAAA,EAAS,OAAO,cAAc,UAAU,iBAAiB,UAAU,cAAc;AAAA,UACjF,iBAAA;AAAA,UACA,gBAAgB,gBAAgB,mBAAmB,mBAAmB,aAAa,WAAW,CAAC;AAAA,QAAA,EAAA,CAClG;AAAA,MAAA,GACF;AAAA,MAID,SAAS,gBACRA,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,QAAAd,2BAAAA,KAAC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,UAAAC,+BAAC,SAAI,OAAOW,aAAWD,IAAE,OAAO,GAC9B,yCAAC,cAAA,EAAa,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOA,IAAE,SAAS,GAC9E;AAAA,UACAV,2BAAAA,IAAC,eAAY,UAAA,eAAA,CAAY;AAAA,UACzBA,2BAAAA,IAAC,qBAAkB,UAAA,sCAAA,CAAmC;AAAA,QAAA,GACxD;AAAA,QACAD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,WAAW,QAAQ,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAA,GAC7E,UAAA;AAAA,UAAA,YAAA;AAAA,UACDA,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,UAAA,GAC3D,UAAA;AAAA,YAAAC,2BAAAA,IAAC,SAAM,UAAA,4BAAA,CAAyB;AAAA,YAChCA,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAAM,MAAK;AAAA,gBAAO,WAAU;AAAA,gBAAU,aAAY;AAAA,gBAAY,OAAO;AAAA,gBACpE,UAAU,CAAA,MAAK,iBAAiB,EAAE,OAAO,MAAM,QAAQ,OAAO,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,gBAC7E,UAAU;AAAA,gBACV,OAAO,EAAE,WAAW,UAAU,UAAU,UAAU,eAAe,UAAU,YAAY,YAAA;AAAA,gBACvF,WAAW;AAAA,cAAA;AAAA,YAAA;AAAA,UACb,GACF;AAAA,UACC,gBAAgB,gBAAgB,mBAAmB,uBAAuB,cAAc,WAAW,CAAC;AAAA,QAAA,EAAA,CACvG;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CAEJ,GAEJ,GACF;AAAA,IAEAA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,cAAc;AAAA,QACd,WAAW,MAAM,wBAAwB,KAAK;AAAA,QAC9C;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEF,GACF;AAEJ;AChnBA,MAAM,sBAAsB;AAAA,EAC1B,EAAE,MAAM,QAAQ,MAAM,WAAW,MAAM,QAAQ,QAAQ,EAAA;AAAA,EACvD,EAAE,MAAM,QAAQ,MAAM,SAAS,MAAM,QAAQ,QAAQ,EAAA;AAAA,EACrD,EAAE,MAAM,QAAQ,MAAM,iBAAiB,MAAM,QAAQ,QAAQ,GAAA;AAAA,EAC7D,EAAE,MAAM,QAAQ,MAAM,QAAQ,MAAM,QAAQ,QAAQ,EAAA;AAAA,EACpD,EAAE,MAAM,QAAQ,MAAM,YAAY,MAAM,QAAQ,QAAQ,EAAA;AAAA,EACxD,EAAE,MAAM,OAAO,MAAM,UAAU,MAAM,QAAQ,QAAQ,EAAA;AACvD;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EAAO;AAAA,EAAU,UAAU;AAAA,EAAQ;AAAA,EAAiB,WAAW;AAAA,EAAO;AAAA,EAAO,cAAc;AAAA,EAAgB,cAAc;AAC3H,GAAoB;AAClB,QAAM,kBAAkB,oBAAoB,KAAK,CAAA,MAAK,EAAE,SAAS,OAAO,KAAK,oBAAoB,CAAC;AAElG,QAAM,eAAe,CAAC,MAA2C;AAC/D,UAAM,UAAU,EAAE,OAAO,MAAM,QAAQ,OAAO,EAAE;AAChD,aAAS,QAAQ,MAAM,GAAG,gBAAgB,MAAM,CAAC;AAAA,EACnD;AAEA,QAAM,cAAc,CAAC,UAA0B;AAC7C,QAAI,MAAM,UAAU,EAAG,QAAO;AAC9B,QAAI,MAAM,UAAU,EAAG,QAAO,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC,CAAC;AACpE,QAAI,MAAM,UAAU,EAAG,QAAO,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC,CAAC;AACzF,WAAO,GAAG,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,MAAM,CAAC,CAAC;AAAA,EACzF;AAEA,yCACG,OAAA,EACC,UAAA;AAAA,IAAAD,gCAAC,SAAI,OAAO;AAAA,MACV,SAAS;AAAA,MAAQ,YAAY;AAAA,MAAU,QAAQ,aAAa,QAAQ,YAAY,SAAS;AAAA,MACzF,cAAc;AAAA,MAAU,UAAU;AAAA,MAAU,SAAS,WAAW,MAAM;AAAA,MACtE,iBAAiB,WAAW,YAAY;AAAA,IAAA,GAEvC,UAAA;AAAA,MAAA,mBAAmB,CAAC,cACnBC,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,OAAO;AAAA,UACP,UAAU,CAAC,MAAM,gBAAgB,EAAE,OAAO,KAAK;AAAA,UAC/C;AAAA,UACA,OAAO,EAAE,SAAS,WAAW,iBAAiB,WAAW,aAAa,qBAAqB,YAAY,KAAK,OAAO,WAAW,SAAS,QAAQ,QAAQ,OAAA;AAAA,UAEtJ,UAAA,oBAAoB,IAAI,CAAC,sCACvB,UAAA,EAAoB,OAAO,EAAE,MAAO,UAAA;AAAA,YAAA,EAAE;AAAA,YAAK;AAAA,YAAE,EAAE;AAAA,UAAA,EAAA,GAAnC,EAAE,IAAsC,CACtD;AAAA,QAAA;AAAA,MAAA,IAGHD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,UAAU,SAAS,WAAW,iBAAiB,WAAW,aAAa,uBAC/H,UAAA;AAAA,QAAAC,+BAAC,UAAK,OAAO,EAAE,UAAU,WAAA,GAAe,0BAAgB,MAAK;AAAA,QAC7DA,2BAAAA,IAAC,QAAA,EAAK,OAAO,EAAE,YAAY,KAAK,OAAO,UAAA,GAAc,UAAA,gBAAgB,KAAA,CAAK;AAAA,MAAA,GAC5E;AAAA,MAEFA,2BAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,OAAO,YAAY,KAAK;AAAA,UACxB,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA,OAAO,EAAE,MAAM,GAAG,SAAS,WAAW,UAAU,YAAY,QAAQ,QAAQ,SAAS,QAAQ,iBAAiB,cAAA;AAAA,QAAc;AAAA,MAAA;AAAA,IAC9H,GACF;AAAA,IACC,SAASA,2BAAAA,IAAC,KAAA,EAAE,OAAO,EAAE,UAAU,YAAY,OAAO,WAAW,WAAW,UAAA,GAAc,UAAA,MAAA,CAAM;AAAA,IAC7FD,2BAAAA,KAAC,KAAA,EAAE,OAAO,EAAE,UAAU,WAAW,OAAO,WAAW,WAAW,UAAA,GAC3D,UAAA;AAAA,MAAA,gBAAgB;AAAA,MAAO;AAAA,MAAmB,MAAM;AAAA,MAAO;AAAA,MAAE,gBAAgB;AAAA,MAAO;AAAA,IAAA,EAAA,CACnF;AAAA,EAAA,GACF;AAEJ;ACpEO,SAAS,eAAe,EAAE,QAAQ,UAAU,YAAY,IAAI,WAAW,iBAAsC;AAClH,QAAM,YAAYM,MAAAA,OAAuB,IAAI;AAC7C,QAAM,CAAC,UAAU,WAAW,IAAIC,MAAAA,SAAS,KAAK;AAC9C,QAAM,CAAC,cAAc,eAAe,IAAIA,MAAAA,SAAoB,CAAA,CAAE;AAC9D,QAAM,CAAC,WAAW,YAAY,IAAIA,MAAAA,SAAS,IAAI;AAE/C,QAAM,WAAW,EAAE,MAAM,IAAI,QAAQ,IAAI,MAAM,GAAA;AAE/CJ,QAAAA,UAAU,MAAM;AACd,UAAM,oBAAoB,iBAAiB,oBAAA,EAAsB;AACjE,QAAI,CAAC,kBAAmB;AACxB,UAAM,YAAY,YAAY;AAC5B,UAAI;AACF,cAAM,aAAa,kBAAkB,QAAQ,QAAQ,EAAE;AACvD,cAAM,WAAW,MAAM,MAAM,GAAG,UAAU,4BAA4B,EAAE,SAAS,EAAE,UAAU,mBAAA,EAAmB,CAAG;AACnH,YAAI,SAAS,IAAI;AACf,gBAAM,OAAO,MAAM,SAAS,KAAA;AAC5B,cAAI,KAAK,WAAW,MAAM,QAAQ,KAAK,IAAI,EAAG,iBAAgB,KAAK,IAAI;AAAA,QACzE;AAAA,MACF,QAAQ;AAAA,MAAe,UAAA;AAAY,qBAAa,KAAK;AAAA,MAAG;AAAA,IAC1D;AACA,cAAA;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElBA,QAAAA,UAAU,MAAM;AACd,UAAM,YAAY,UAAU;AAC5B,QAAI,CAAC,aAAa,aAAa,WAAW,EAAG;AAC7C,QAAI,MAAM;AACV,UAAM,KAAK,YAAY,MAAM;AAC3B,UAAI,CAAC,YAAY,WAAW;AAC1B,eAAO;AACP,YAAI,OAAO,UAAU,cAAc,EAAG,OAAM;AAC5C,kBAAU,aAAa;AAAA,MACzB;AAAA,IACF,GAAG,SAAS,KAAK,CAAC;AAClB,WAAO,MAAM,cAAc,EAAE;AAAA,EAC/B,GAAG,CAAC,UAAU,OAAO,aAAa,MAAM,CAAC;AAEzC,QAAM,aAAa,CAAC,SAAuC;AACzD,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,KAAK,WAAW,MAAM,EAAG,QAAO;AACpC,UAAM,cAAc,iBAAiB,oBAAA,EAAsB;AAC3D,WAAO,GAAG,YAAY,QAAQ,QAAQ,EAAE,CAAC,yBAAyB,IAAI;AAAA,EACxE;AAEA,MAAI,WAAW;AACb,0CACG,OAAA,EAAI,WAAsB,OAAO,EAAE,UAAU,YAC5C,UAAAF,+BAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,QAAQ,SAAS,WAAA,GAClD,UAAA,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,MACpBD,gCAAC,SAAY,OAAO,EAAE,YAAY,GAAG,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,KAAK,YACxG,UAAA;AAAA,MAAAC,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,cAAc,WAAW,iBAAiB,UAAA,EAAU,CAAG;AAAA,MACpGA,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,OAAO,UAAU,QAAQ,WAAW,cAAc,WAAW,iBAAiB,UAAA,EAAU,CAAG;AAAA,IAAA,EAAA,GAFjG,CAGV,CACD,EAAA,CACH,GACF;AAAA,EAEJ;AAEA,MAAI,aAAa,WAAW,EAAG,QAAO;AAEtC,QAAM,cAAc,CAAC,GAAG,cAAc,GAAG,YAAY;AAErD,SACEA,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,OAAO,EAAE,UAAU,YAAY,UAAU,SAAA;AAAA,MACzC,cAAc,MAAM,YAAY,IAAI;AAAA,MACpC,cAAc,MAAM,YAAY,KAAK;AAAA,MAErC,yCAAC,OAAA,EAAI,KAAK,WAAW,OAAO,EAAE,SAAS,QAAQ,KAAK,QAAQ,UAAU,UAAU,SAAS,WAAA,GACtF,sBAAY,IAAI,CAAC,KAAK,UAAU;AAC/B,cAAM,UAAU,WAAW,IAAI,IAAI;AACnC,eACED,2BAAAA,KAAC,OAAA,EAA+B,OAAO,EAAE,YAAY,GAAG,SAAS,QAAQ,eAAe,UAAU,YAAY,UAAU,KAAK,YAC3H,UAAA;AAAA,UAAAC,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,cAAc,WAAW,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,WAAW,6BAA6B,iBAAiB,SAAS,QAAQ,oBAAA,GAC9M,UAAA,UACCA,2BAAAA,IAAC,OAAA,EAAI,KAAK,SAAS,KAAK,IAAI,MAAM,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,WAAW,WAAW,cAAc,SAAA,EAAS,CAAG,IAE9HA,2BAAAA,IAAC,QAAA,EAAK,OAAO,EAAE,YAAY,KAAK,UAAU,YAAY,OAAO,mCAAA,GAC1D,UAAA,IAAI,KAAK,OAAO,CAAC,EAAE,YAAA,EAAY,CAClC,EAAA,CAEJ;AAAA,UACAA,2BAAAA,IAAC,QAAA,EAAK,OAAO,EAAE,UAAU,WAAW,OAAO,WAAW,YAAY,IAAA,GAAQ,UAAA,IAAI,KAAA,CAAK;AAAA,QAAA,EAAA,GAV3E,GAAG,IAAI,EAAE,IAAI,KAAK,EAW5B;AAAA,MAEJ,CAAC,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;ACnFO,MAAM,4BAA4B;AAAA;AAAA;AAAA;AAAA,EAIvC,MAAM,KACJ,MAC6B;AAC7B,QAAI,CAAC,kBAAkB,kBAAkB;AACvC,YAAM,kBAAkB,gBAAA;AAAA,IAC1B;AAEA,WAAO,kBAAkB,SAAS;AAAA,MAChC,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,mBAAmB,KAAK;AAAA,IAAA,CACzB;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UACJ,cACA,SACkC;AAClC,UAAMO,UAAS,oBAAA;AAEf,QAAI,eAAe;AACjB,cAAQ,IAAI,uDAAuD;AAAA,IACrE;AAEA,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU;AAAA,UACnB,eAAe;AAAA,UACf,UAAU;AAAA,QAAA,CACX;AAAA,MAAA;AAAA,MAEHA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SACJ,cACA,UAC6C;AAC7C,UAAMA,UAAS,oBAAA;AAEf,QAAI,eAAe;AACjB,cAAQ,IAAI,4DAA4D;AAAA,IAC1E;AAEA,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU;AAAA,UACnB,eAAe;AAAA,UACf;AAAA,UACA,uBAAuB;AAAA,QAAA,CACxB;AAAA,MAAA;AAAA,MAEHA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBACJ,cAC6C;AAC7C,UAAMA,UAAS,oBAAA;AAEf,QAAI,eAAe;AACjB,cAAQ,IAAI,0DAA0D;AAAA,IACxE;AAEA,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU;AAAA,UACnB,eAAe;AAAA,QAAA,CAChB;AAAA,MAAA;AAAA,MAEHA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,cAAwD;AACtE,WAAO,kBAAkB,UAAU,YAAY;AAAA,EACjD;AACF;AChGA,SAAS,gBAAgB,KAAc,SAAyB;AAC9D,MAAI,eAAe,OAAO;AACxB,QAAI,IAAI,QAAQ,SAAS,OAAO,KAAK,IAAI,QAAQ,SAAS,SAAS,GAAG;AACpE,aAAO;AAAA,IACT;AACA,QAAI,IAAI,QAAQ,SAAS,SAAS,GAAG;AACnC,aAAO;AAAA,IACT;AACA,WAAO,IAAI;AAAA,EACb;AACA,SAAO,kBAAkB,OAAO;AAClC;AAQO,SAAS,sBAAsB,SAAwC;AAC5E,QAAM,gBAAgBF,MAAAA,OAAO,KAAK;AAElCH,QAAAA,UAAU,MAAM;AACd,QAAI,WAAW,CAAC,cAAc,SAAS;AACrC,0BAAoB;AAAA,QAClB,YAAY,QAAQ;AAAA,QACpB,WAAW,QAAQ;AAAA,MAAA,CACpB;AACD,oBAAc,UAAU;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,CAAC,OAAO,QAAQ,IAAII,eAA4B;AAAA,IACpD,cAAc;AAAA,IACd,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,EAAA,CACX;AAED,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAA8C,CAAA,CAAE;AAChF,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAsB,OAAO;AAEnE,QAAM,iBAAiBG,kBAAY,CAAC,SAA8C;AAChF,gBAAY,WAAS,EAAE,GAAG,MAAM,GAAG,OAAO;AAAA,EAC5C,GAAG,CAAA,CAAE;AAEL,QAAM,mBAAmBA,kBAAY,OACnC,SACG;AACH,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,MAAM,UAAU,KAAA,EAAO;AAE1E,UAAM,eAAe;AAAA,MACnB,GAAG;AAAA,MACH,OAAO,gBAAgB,eAAe,KAAK,KAAK;AAAA,MAChD,mBAAmB,gBAAgB,eAAe,UAAmB;AAAA,IAAA;AAGvE,gBAAY,YAAY;AAExB,QAAI;AACF,UAAI,CAAC,kBAAkB,kBAAkB;AACvC,cAAM,kBAAkB,gBAAA;AAAA,MAC1B;AAEA,YAAM,WAAW,MAAM,0BAA0B,KAAK,YAAY;AAElE,UAAI,SAAS,WAAW,SAAS,eAAe;AAC9C,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,cAAc,SAAS;AAAA,UACvB,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,UAAU;AAAA,QAAA,EACV;AACF,eAAO;AAAA,UACL,SAAS;AAAA,UACT,cAAc,SAAS;AAAA,UACvB,YAAY,SAAS;AAAA,UACrB,aAAa,SAAS;AAAA,QAAA;AAAA,MAE1B;AAEA,UAAI,SAAS,UAAU;AACrB,iBAAS,CAAA,UAAS;AAAA,UAChB,GAAG;AAAA,UACH,SAAS;AAAA,UACT,OAAO,SAAS,WAAW;AAAA,UAC3B,UAAU,SAAS;AAAA,QAAA,EACnB;AACF,eAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,MAChD;AAEA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,QAC3B,UAAU;AAAA,MAAA,EACV;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,UAAU,gBAAgB,KAAK,eAAgB;AACrD,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,SAAS,UAAU,KAAA,EAAO;AAC9E,aAAO,EAAE,SAAS,MAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,WAAW,CAAC;AAEhB,QAAM,YAAYA,kBAAY,OAAO,YAAoB;AACvD,QAAI,CAAC,MAAM,cAAc;AACvB,aAAO,EAAE,SAAS,OAAO,OAAO,mBAAA;AAAA,IAClC;AACA,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,OAAO;AAC1D,QAAI;AACF,YAAM,WAAW,MAAM,0BAA0B,UAAU,MAAM,cAAc,OAAO;AAEtF,UAAI,SAAS,SAAS;AACpB,YAAI,SAAS,WAAW,eAAe,SAAS,gBAAgB;AAC9D,mBAAS,CAAA,UAAS,EAAE,GAAG,MAAM,QAAQ,aAAa,SAAS,QAAQ;AACnE,iBAAO,EAAE,SAAS,MAAM,WAAW,MAAM,gBAAgB,SAAS,eAAA;AAAA,QACpE;AAEA,iBAAS,CAAA,UAAS,EAAE,GAAG,MAAM,QAAQ,oBAAoB,SAAS,QAAQ;AAC1E,eAAO,EAAE,SAAS,MAAM,WAAW,MAAA;AAAA,MACrC;AAEA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,MAAA,EAC3B;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,UAAU,gBAAgB,KAAK,iBAAiB;AACtD,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,UAAU;AAC9D,aAAO,EAAE,SAAS,MAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,QAAM,uBAAuBA,kBAAY,OAAO,aAAqB;AACnE,QAAI,CAAC,MAAM,cAAc;AACvB,aAAO,EAAE,SAAS,OAAO,OAAO,mBAAA;AAAA,IAClC;AACA,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,OAAO;AAC1D,QAAI;AACF,YAAM,WAAW,MAAM,0BAA0B,SAAS,MAAM,cAAc,QAAQ;AAEtF,UAAI,SAAS,WAAW,SAAS,gBAAgB;AAC/C,iBAAS,CAAA,UAAS,EAAE,GAAG,MAAM,QAAQ,aAAa,SAAS,QAAQ;AACnE,eAAO,EAAE,SAAS,MAAM,gBAAgB,SAAS,eAAA;AAAA,MACnD;AAEA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,MAAA,EAC3B;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,UAAU,gBAAgB,KAAK,iBAAiB;AACtD,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,UAAU;AAC9D,aAAO,EAAE,SAAS,MAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,QAAM,gCAAgCA,MAAAA,YAAY,YAAY;AAC5D,QAAI,CAAC,MAAM,cAAc;AACvB,aAAO,EAAE,SAAS,OAAO,OAAO,mBAAA;AAAA,IAClC;AACA,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,OAAO;AAC1D,QAAI;AACF,YAAM,WAAW,MAAM,0BAA0B,kBAAkB,MAAM,YAAY;AAErF,UAAI,SAAS,WAAW,SAAS,gBAAgB;AAC/C,iBAAS,CAAA,UAAS,EAAE,GAAG,MAAM,QAAQ,aAAa,SAAS,QAAQ;AACnE,eAAO,EAAE,SAAS,MAAM,gBAAgB,SAAS,eAAA;AAAA,MACnD;AAEA,eAAS,CAAA,UAAS;AAAA,QAChB,GAAG;AAAA,QACH,SAAS;AAAA,QACT,OAAO,SAAS,WAAW;AAAA,MAAA,EAC3B;AACF,aAAO,EAAE,SAAS,OAAO,YAAY,SAAS,WAAA;AAAA,IAChD,SAAS,KAAK;AACZ,YAAM,UAAU,gBAAgB,KAAK,iBAAiB;AACtD,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,UAAU;AAC9D,aAAO,EAAE,SAAS,MAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,QAAM,YAAYA,MAAAA,YAAY,YAAY;AACxC,QAAI,CAAC,MAAM,cAAc;AACvB,aAAO,EAAE,SAAS,OAAO,OAAO,mBAAA;AAAA,IAClC;AACA,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,MAAM,OAAO,OAAO;AAC1D,QAAI;AACF,YAAM,WAAW,MAAM,0BAA0B,UAAU,MAAM,YAAY;AAC7E,eAAS,WAAS,EAAE,GAAG,MAAM,SAAS,QAAQ;AAC9C,aAAO;AAAA,QACL,SAAS,SAAS;AAAA,QAClB,UAAU,SAAS;AAAA,QACnB,cAAc,SAAS;AAAA,MAAA;AAAA,IAE3B,SAAS,KAAK;AACZ,YAAM,UAAU,gBAAgB,KAAK,WAAW;AAChD,eAAS,CAAA,UAAS,EAAE,GAAG,MAAM,SAAS,OAAO,OAAO,UAAU;AAC9D,aAAO,EAAE,SAAS,MAAA;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,MAAM,YAAY,CAAC;AAEvB,QAAM,QAAQA,MAAAA,YAAY,MAAM;AAC9B,aAAS;AAAA,MACP,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,OAAO;AAAA,MACP,UAAU;AAAA,IAAA,CACX;AACD,gBAAY,CAAA,CAAE;AACd,mBAAe,OAAO;AAAA,EACxB,GAAG,CAAA,CAAE;AAEL,QAAM,aAAaA,MAAAA,YAAY,MAAM;AACnC,aAAS,CAAA,UAAS,EAAE,GAAG,MAAM,OAAO,MAAM,UAAU,OAAO;AAAA,EAC7D,GAAG,CAAA,CAAE;AAEL,SAAO;AAAA,IACL,cAAc,MAAM;AAAA,IACpB,QAAQ,MAAM;AAAA,IACd;AAAA,IACA,SAAS,MAAM;AAAA,IACf,OAAO,MAAM;AAAA,IACb,UAAU,MAAM;AAAA,IAChB,aAAa,MAAM,WAAW;AAAA,IAC9B,aAAa,MAAM,aAAa;AAAA,IAEhC;AAAA,IACA;AAAA,IACA,aAAa,gBAAgB;AAAA,IAE7B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AC1PA,MAAMC,MAAI;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,KAAK;AAAA,EACL,OAAO;AAAA,EAEP,SAAS;AAAA,EACT,OAAO;AACT;AAEA,MAAM,aAAa,CAAC,IAAY,OAAO,YAAiC;AAAA,EACtE,QAAQ;AAAA,EAAU,OAAO;AAAA,EAAM,QAAQ;AAAA,EAAM,iBAAiB;AAAA,EAAI,cAAc;AAAA,EAChF,SAAS;AAAA,EAAQ,YAAY;AAAA,EAAU,gBAAgB;AACzD;AAEA,MAAM,eAAoC;AAAA,EACxC,UAAU;AAAA,EAAY,MAAM;AAAA,EAAQ,KAAK;AAAA,EAAQ,YAAY;AAAA,EAAQ,QAAQ;AAAA,EAC7E,QAAQ;AAAA,EAAW,SAAS;AAAA,EAAU,cAAc;AAAA,EAAY,OAAOA,IAAE;AAAA,EAAS,QAAQ;AAC5F;AAEA,MAAM,YAAiC;AAAA,EACrC,OAAOA,IAAE;AAAA,EAAS,QAAQ;AAAA,EAAW,YAAY;AAAA,EAAQ,QAAQ;AAAA,EACjE,YAAY;AAAA,EAAK,gBAAgB;AAAA,EAAa,UAAU;AAC1D;AAEA,MAAM,cAAc;AAEpB,SAAS,cAAc,EAAE,WAAgC;AACvD,SACEX,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,KAAK,UAAU,WAAW,aACtG,UAAA;AAAA,IAAA,MAAM,KAAK,EAAE,QAAQ,YAAA,GAAe,CAAC,GAAG,MACvCC,2BAAAA,IAAC,OAAA,EAAY,OAAO;AAAA,MAClB,OAAO,IAAI,MAAM,UAAU,WAAW;AAAA,MACtC,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,iBAAiB,IAAI,KAAK,UAAUU,IAAE,SAASA,IAAE;AAAA,MACjD,YAAY;AAAA,IAAA,EACd,GANU,CAMP,CACJ;AAAA,IACDX,2BAAAA,KAAC,QAAA,EAAK,OAAO,EAAE,UAAU,WAAW,OAAOW,IAAE,SAAS,YAAY,SAAA,GAAY,UAAA;AAAA,MAAA;AAAA,MAAO;AAAA,MAAQ;AAAA,MAAE;AAAA,IAAA,EAAA,CAAY;AAAA,EAAA,GAC7G;AAEJ;AAGA,SAAS,eAAe;AACtB,QAAM,aAAa,CAAC,UAAU,cAAc,UAAU,mBAAmB,WAAW,YAAY;AAChG,SACEX,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,UAAU,YAAY,OAAO,SAAS,QAAQ,SAAS,QAAQ,SAAA,GAE3E,UAAA;AAAA,IAAAC,+BAAC,SAAI,OAAO;AAAA,MACV,UAAU;AAAA,MAAY,KAAK;AAAA,MAAO,MAAM;AAAA,MAAO,WAAW;AAAA,MAC1D,OAAO;AAAA,MAAQ,QAAQ;AAAA,MAAQ,iBAAiBU,IAAE;AAAA,MAAS,cAAc;AAAA,MACzE,SAAS;AAAA,MAAQ,YAAY;AAAA,MAAU,gBAAgB;AAAA,MAAU,QAAQ;AAAA,IAAA,GAEzE,UAAAV,2BAAAA,IAAC,iBAAA,EAAgB,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,OAAOU,IAAE,MAAA,GAAS,EAAA,CAC7E;AAAA,IAEC,WAAW,IAAI,CAAC,MAAM,MAAM;AAC3B,YAAM,QAAS,IAAI,MAAO,WAAW;AACrC,aACEV,2BAAAA,IAAC,SAAY,OAAO;AAAA,QAClB,UAAU;AAAA,QAAY,KAAK;AAAA,QAAO,MAAM;AAAA,QAAO,OAAO;AAAA,QAAQ,QAAQ;AAAA,QACtE,WAAW,UAAU,KAAK,gCAAgC,KAAK;AAAA,QAC/D,iBAAiB;AAAA,QACjB,WAAW,QAAQ,IAAI,CAAC;AAAA,MAAA,GAExB,UAAAA,2BAAAA,IAAC,OAAA,EAAI,OAAO;AAAA,QACV,OAAO;AAAA,QAAQ,QAAQ;AAAA,QAAQ,iBAAiBU,IAAE;AAAA,QAAS,cAAc;AAAA,QACzE,SAAS;AAAA,QAAQ,YAAY;AAAA,QAAU,gBAAgB;AAAA,MAAA,GAEvD,UAAAV,2BAAAA,IAAC,MAAA,EAAK,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,OAAOU,IAAE,QAAA,EAAQ,CAAG,EAAA,CACpE,KAXQ,CAYV;AAAA,IAEJ,CAAC;AAAA,EAAA,GACH;AAEJ;AAEO,SAAS,YAAY,EAAE,MAAM,cAAc,iBAAiB,iBAAiB,YAAY,WAAW,sBAAwC;AACjJ,QAAM;AAAA,IACJ;AAAA,IAAQ;AAAA,IAAU,SAAS;AAAA,IAAY,OAAO;AAAA,IAAU;AAAA,IAAa;AAAA,IAAgB;AAAA,IACrF;AAAA,IAAgB;AAAA,IAAkB;AAAA,IAAW;AAAA,IAAsB;AAAA,IAAW,OAAO;AAAA,IAAU;AAAA,EAAA,IAC7F,sBAAsB,EAAE,YAAY,WAAW;AAEnD,QAAM,CAAC,MAAM,OAAO,IAAIJ,MAAAA,SAAqB,OAAO;AACpD,QAAM,CAAC,SAAS,UAAU,IAAIA,MAAAA,SAAS,EAAE;AACzC,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAAS,EAAE;AAC3C,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,MAAAA,SAAS,EAAE;AACzD,QAAM,CAAC,YAAY,aAAa,IAAIA,MAAAA,SAAwB,IAAI;AAChE,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,MAAAA,SAAS,CAAC;AACtD,QAAM,CAAC,eAAe,gBAAgB,IAAIA,MAAAA,SAAS,KAAK;AACxD,QAAM,CAAC,YAAY,aAAa,IAAIA,MAAAA,SAAoD,IAAI;AAE5F,QAAM,QAAQ,cAAc;AAE5BJ,QAAAA,UAAU,MAAM;AAAE,QAAI,CAAC,MAAM;AAAE,cAAQ,OAAO;AAAG,iBAAW,EAAE;AAAG,kBAAY,EAAE;AAAG,yBAAmB,EAAE;AAAG,oBAAc,IAAI;AAAG,uBAAiB,KAAK;AAAG,oBAAc,IAAI;AAAG,wBAAkB,CAAC;AAAG,eAAA;AAAA,IAAY;AAAA,EAAE,GAAG,CAAC,IAAI,CAAC;AAC1NA,QAAAA,UAAU,MAAM;AAAE,QAAI,WAAW,eAAe;AAAE,cAAQ,KAAK;AAAG,wBAAkB,EAAE;AAAA,IAAG,WAAW,WAAW,mBAAoB,SAAQ,UAAU;AAAA,EAAG,GAAG,CAAC,MAAM,CAAC;AACnKA,QAAAA,UAAU,MAAM;AAAE,QAAI,iBAAiB,GAAG;AAAE,YAAM,IAAI,WAAW,MAAM,kBAAkB,OAAK,IAAI,CAAC,GAAG,GAAI;AAAG,aAAO,MAAM,aAAa,CAAC;AAAA,IAAG;AAAA,EAAE,GAAG,CAAC,cAAc,CAAC;AAChKA,QAAAA,UAAU,MAAM;AAAE,QAAI,iBAAiB,YAAY;AAAE,YAAM,IAAI,WAAW,MAAM,gBAAgB,WAAW,OAAO,WAAW,IAAI,GAAG,GAAI;AAAG,aAAO,MAAM,aAAa,CAAC;AAAA,IAAG;AAAA,EAAE,GAAG,CAAC,eAAe,UAAU,CAAC;AAEzM,QAAM,wBAAwB,OAAO,kBAA0B;AAC7D,QAAI;AACF,YAAM,WAAW,MAAM,kBAAkB,SAAS,aAAa;AAC/D,UAAI,SAAS,WAAW,SAAS,OAAO;AACtC,sBAAc,EAAE,OAAO,SAAS,OAAO,MAAM,SAAS,MAAmB;AACzE,yBAAiB,IAAI;AAAA,MACvB,qBAAqB,iDAAiD;AAAA,IACxE,QAAQ;AAAE,oBAAc,gCAAgC;AAAA,IAAG;AAAA,EAC7D;AAEA,QAAM,mBAAmB,OAAO,MAAuB;;AACrD,MAAE,eAAA;AAAkB,kBAAc,IAAI;AAAG,eAAA;AACzC,QAAI,GAAC,cAAS,SAAT,mBAAe,SAAQ;AAAE,oBAAc,mBAAmB;AAAG;AAAA,IAAQ;AAC1E,QAAI,CAAC,eAAe,GAAC,cAAS,UAAT,mBAAgB,SAAQ;AAAE,oBAAc,6BAA6B;AAAG;AAAA,IAAQ;AACrG,QAAI,GAAC,cAAS,UAAT,mBAAgB,cAAW,cAAS,UAAT,mBAAgB,WAAU,KAAK,GAAG;AAAE,oBAAc,8BAA8B;AAAG;AAAA,IAAQ;AAC3H,QAAI,eAAe,SAAS,YAAY,QAAQ;AAAE,oBAAc,wEAAwE;AAAG;AAAA,IAAQ;AACnJ,QAAI,GAAC,cAAS,SAAT,mBAAe,SAAQ;AAAE,oBAAc,sBAAsB;AAAG;AAAA,IAAQ;AAC7E,QAAI,GAAC,cAAS,YAAT,mBAAkB,SAAQ;AAAE,oBAAc,oBAAoB;AAAG;AAAA,IAAQ;AAC9E,UAAM,iBAAiB,EAAE,MAAM,SAAS,QAAQ,IAAI,OAAO,SAAS,SAAS,IAAI,SAAS,SAAS,WAAW,QAAQ,OAAO,SAAS,SAAS,IAAI,MAAM,SAAS,MAAM,SAAS,SAAS,QAAA,CAAgB;AAAA,EAC5M;AAEA,QAAM,kBAAkB,YAAY;AAClC,QAAI,QAAQ,WAAW,GAAG;AAAE,oBAAc,sCAAsC;AAAG;AAAA,IAAQ;AAC3F,kBAAc,IAAI;AAAG,eAAA;AACrB,UAAM,SAAS,MAAM,UAAU,OAAO;AACtC,QAAI,OAAO,WAAW,OAAO,aAAa,OAAO,eAAgB,OAAM,sBAAsB,OAAO,cAAc;AAAA,EACpH;AAEA,QAAM,uBAAuB,CAAC,MAAuB;AACnD,MAAE,eAAA;AAAkB,kBAAc,IAAI;AACtC,QAAI,CAAC,YAAY,SAAS,SAAS,GAAG;AAAE,oBAAc,qDAAqD;AAAG;AAAA,IAAQ;AACtH,QAAI,aAAa,iBAAiB;AAAE,oBAAc,wCAAwC;AAAG;AAAA,IAAQ;AACrG,YAAQ,SAAS;AAAA,EACnB;AAEA,QAAM,gBAAgB,YAAY;AAChC,kBAAc,IAAI;AAAG,eAAA;AACrB,UAAM,SAAS,MAAM,qBAAqB,QAAQ;AAClD,QAAI,OAAO,WAAW,OAAO,eAAgB,OAAM,sBAAsB,OAAO,cAAc;AAAA,EAChG;AAEA,QAAM,kBAAkB,YAAY;AAAE,QAAI,iBAAiB,EAAG;AAAQ,UAAM,IAAI,MAAM,UAAA;AAAa,QAAI,EAAE,QAAS,mBAAkB,EAAE,YAAY,EAAE;AAAA,EAAG;AAEvJ,QAAM,WAAW,CAAC,MAAkB;AAAE,kBAAc,IAAI;AAAG,eAAA;AAAc,YAAQ,CAAC;AAAA,EAAG;AAErF,QAAM,0BAA0B,CAAC,SAAiC;AAChE,mBAAe,IAAI;AACnB,QAAI,SAAS,aAAc,gBAAe,EAAE,SAAS,QAAQ,SAAS,WAAW,OAAO,IAAI;AAC5F,aAAS,MAAM;AAAA,EACjB;AAIA,QAAM,cAAc,MAAM,QAAQF,2BAAAA,IAAC,SAAI,OAAO,EAAE,SAAS,WAAW,cAAc,YAAY,iBAAiBU,IAAE,OAAO,OAAOA,IAAE,KAAK,UAAU,cAAe,UAAA,MAAA,CAAM,IAAS;AAE9K,SACEV,2BAAAA,IAAC,QAAA,EAAO,MAAY,cAClB,yCAAC,eAAA,EAGE,UAAA,iBAAiB,aAChBD,2BAAAA,KAAC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,IAAAC,2BAAAA,IAAC,cAAA,EAAa;AAAA,IACdA,2BAAAA,IAAC,eAAY,UAAA,kBAAA,CAAe;AAAA,oCAC3B,mBAAA,EAAkB,UAAA;AAAA,MAAA;AAAA,MAC+B,SAAS;AAAA,MAAK;AAAA,IAAA,GAChE;AAAA,oCACC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,KAAK,UAAU,UAAU,YAAY,OAAOU,IAAE,SAAS,WAAW,UAC/I,UAAA;AAAA,MAAAV,+BAAC,eAAY,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU;AAAA,MAAE;AAAA,IAAA,EAAA,CAE3D;AAAA,EAAA,EAAA,CACF,IAEAD,2BAAAA,KAAAc,WAAAA,UAAA,EAEG,UAAA;AAAA,IAAA,SAAS,WACRd,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,MAAAd,2BAAAA,KAAC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,QAAAC,2BAAAA,IAAC,OAAA,EAAI,OAAO,WAAWU,IAAE,SAAS,MAAM,MAAM,GAC5C,UAAAV,2BAAAA,IAAC,iBAAA,EAAgB,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,OAAOU,IAAE,OAAA,GAAU,EAAA,CAC9E;AAAA,QACAV,2BAAAA,IAAC,eAAY,UAAA,0BAAA,CAAuB;AAAA,QACpCA,2BAAAA,IAAC,qBAAkB,UAAA,kEAAA,CAA+D;AAAA,MAAA,GACpF;AAAA,MACAA,+BAAC,kBAAe,WAAsB;AAAA,MACtCA,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,WAAW,UAAU,YAAY,OAAOU,IAAE,SAAS,QAAQ,YACrH,UAAA,CAAC,+CAA+C,0CAA0C,mCAAmC,EAAE,IAAI,UAClIX,2BAAAA,KAAC,OAAA,EAAe,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,aACnE,UAAA;AAAA,QAAAC,2BAAAA,IAAC,kBAAA,EAAiB,OAAO,EAAE,OAAO,WAAW,QAAQ,WAAW,OAAOU,IAAE,OAAO,YAAY,EAAA,EAAE,CAAG;AAAA,QAChG;AAAA,MAAA,KAFO,IAGV,CACD,GACH;AAAA,MACAV,2BAAAA,IAAC,eAAA,EAAc,SAAS,EAAA,CAAG;AAAA,MAC3BA,2BAAAA,IAAC,QAAA,EAAO,SAAS,MAAM,SAAS,cAAc,GAAG,OAAO,EAAE,OAAO,QAAQ,WAAW,OAAA,GAAU,UAAA,aAAS;AAAA,MACvGD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,WAAW,UAAU,UAAU,YAAY,WAAW,OAAA,GAClE,UAAA;AAAA,QAAAC,+BAAC,UAAK,OAAO,EAAE,OAAOU,IAAE,QAAA,GAAW,UAAA,qBAAiB;AAAA,QACpDV,2BAAAA,IAAC,YAAO,MAAK,UAAS,OAAO,WAAW,SAAS,iBAAiB,UAAA,iBAAA,CAAc;AAAA,MAAA,EAAA,CAClF;AAAA,IAAA,GACF;AAAA,IAID,SAAS,kBACRD,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,MAAAb,+BAAC,YAAO,SAAS,MAAM,SAAS,OAAO,GAAG,OAAO,cAAc,MAAK,UAClE,UAAAA,+BAAC,eAAA,EAAc,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU,GAC3D;AAAA,sCACC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,QAAAA,+BAAC,SAAI,OAAO,WAAWU,IAAE,OAAO,GAC9B,yCAAC,iBAAA,EAAgB,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOA,IAAE,WAAW,GACnF;AAAA,QACAV,2BAAAA,IAAC,eAAY,UAAA,kCAAA,CAA+B;AAAA,MAAA,GAC9C;AAAA,MACAD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,WAAW,WAAW,OAAA,GACjF,UAAA;AAAA,QAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAAO,MAAK;AAAA,YAAS,SAAS,MAAM,wBAAwB,OAAO;AAAA,YAClE,OAAO,EAAE,OAAO,QAAQ,SAAS,QAAQ,QAAQ,aAAaW,IAAE,OAAO,IAAI,cAAc,UAAU,WAAW,QAAQ,QAAQ,WAAW,YAAYA,IAAE,OAAO,SAAS,QAAQ,YAAY,UAAU,KAAK,UAAA;AAAA,YAC1M,UAAA;AAAA,cAAAV,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,iBAAiBU,IAAE,QAAQ,cAAc,UAAU,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,YAAY,KAC/K,UAAAV,2BAAAA,IAAC,YAAS,OAAO,EAAE,OAAO,WAAW,QAAQ,WAAW,OAAOU,IAAE,MAAA,GAAS,GAC5E;AAAA,8CACC,OAAA,EACC,UAAA;AAAA,gBAAAV,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,YAAY,KAAK,OAAOU,IAAE,QAAA,GAAW,UAAA,oBAAA,CAAiB;AAAA,gBACpEV,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,UAAU,YAAY,OAAOU,IAAE,WAAW,UAAA,iBAAA,CAAc;AAAA,cAAA,EAAA,CACxE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAEFX,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAAO,MAAK;AAAA,YAAS,SAAS,MAAM,wBAAwB,YAAY;AAAA,YACvE,OAAO,EAAE,OAAO,QAAQ,SAAS,QAAQ,QAAQ,aAAaW,IAAE,OAAO,IAAI,cAAc,UAAU,WAAW,QAAQ,QAAQ,WAAW,YAAYA,IAAE,OAAO,SAAS,QAAQ,YAAY,UAAU,KAAK,UAAA;AAAA,YAC1M,UAAA;AAAA,cAAAV,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,iBAAiBU,IAAE,QAAQ,cAAc,UAAU,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,YAAY,KAC/K,UAAAV,2BAAAA,IAAC,kBAAe,OAAO,EAAE,OAAO,WAAW,QAAQ,WAAW,OAAOU,IAAE,MAAA,GAAS,GAClF;AAAA,8CACC,OAAA,EACC,UAAA;AAAA,gBAAAV,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,YAAY,KAAK,OAAOU,IAAE,QAAA,GAAW,UAAA,uBAAA,CAAoB;AAAA,gBACvEV,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,UAAU,YAAY,OAAOU,IAAE,WAAW,UAAA,0BAAA,CAAuB;AAAA,cAAA,EAAA,CACjF;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACF,GACF;AAAA,MACAV,2BAAAA,IAAC,eAAA,EAAc,SAAS,EAAA,CAAG;AAAA,IAAA,GAC7B;AAAA,IAID,SAAS,UACRD,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,MAAAb,+BAAC,YAAO,SAAS,MAAM,SAAS,cAAc,GAAG,OAAO,cAAc,MAAK,UACzE,UAAAA,+BAAC,eAAA,EAAc,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU,GAC3D;AAAA,sCACC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,QAAAA,+BAAC,SAAI,OAAO,WAAWU,IAAE,UAAU,IAAI,GACrC,UAAAV,+BAAC,iBAAA,EAAgB,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOU,IAAE,WAAW,GACnF;AAAA,QACAV,2BAAAA,IAAC,eAAY,UAAA,qBAAA,CAAkB;AAAA,MAAA,GACjC;AAAA,MACC,8CACE,OAAA,EAAI,OAAO,EAAE,SAAS,WAAW,cAAc,YAAY,iBAAiBU,IAAE,SAAS,MAAM,OAAOA,IAAE,QAAQ,UAAU,aAAa,WAAW,UAAU,WAAW,SAAA,GAAY,UAAA,yDAAA,CAElL;AAAA,MAED,CAAC,eACAV,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,SAAS,WAAW,cAAc,YAAY,iBAAiBU,IAAE,SAAS,OAAO,WAAW,UAAU,aAAa,WAAW,UAAU,WAAW,SAAA,GAAY,UAAA,yDAAA,CAE7K;AAAA,MAEFX,2BAAAA,KAAC,QAAA,EAAK,UAAU,kBAAkB,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,WAAW,WAAW,aAC7G,UAAA;AAAA,QAAA,YAAA;AAAA,wCACA,OAAA,EAAI,UAAA;AAAA,UAAAC,2BAAAA,IAAC,SAAM,UAAA,cAAA,CAAW;AAAA,yCAAS,OAAA,EAAM,aAAY,eAAc,OAAO,SAAS,QAAQ,IAAI,UAAU,OAAK,eAAe,EAAE,MAAM,EAAE,OAAO,OAAO,GAAG,UAAU,WAAA,CAAY;AAAA,QAAA,GAAE;AAAA,QAC5K,CAAC,eAAeD,2BAAAA,KAAC,OAAA,EAAI,UAAA;AAAA,UAAAC,2BAAAA,IAAC,SAAM,UAAA,gBAAA,CAAa;AAAA,UAAQA,+BAAC,SAAM,MAAK,SAAQ,aAAY,oBAAmB,OAAO,SAAS,SAAS,IAAI,UAAU,CAAA,MAAK,eAAe,EAAE,OAAO,EAAE,OAAO,MAAA,CAAO,GAAG,UAAU,WAAA,CAAY;AAAA,QAAA,GAAE;AAAA,wCACnN,OAAA,EAAI,UAAA;AAAA,UAAAA,2BAAAA,IAAC,SAAM,UAAA,sBAAA,CAAmB;AAAA,UAAQA,2BAAAA,IAAC,YAAA,EAAW,OAAO,SAAS,SAAS,IAAI,UAAU,CAAA,MAAK,eAAe,EAAE,OAAO,EAAA,CAAG,GAAG,SAAS,SAAS,WAAW,QAAQ,iBAAiB,CAAA,MAAK,eAAe,EAAE,SAAS,EAAA,CAAG,GAAG,UAAU,YAAY,aAAa,YAAA,CAAa;AAAA,QAAA,GAAE;AAAA,QAC1QD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,qBAAqB,WAAW,KAAK,UAAA,GAClE,UAAA;AAAA,UAAAA,gCAAC,OAAA,EAAI,UAAA;AAAA,YAAAC,2BAAAA,IAAC,SAAM,UAAA,QAAA,CAAK;AAAA,2CAAS,OAAA,EAAM,aAAY,SAAQ,OAAO,SAAS,QAAQ,IAAI,UAAU,OAAK,eAAe,EAAE,MAAM,EAAE,OAAO,OAAO,GAAG,UAAU,WAAA,CAAY;AAAA,UAAA,GAAE;AAAA,0CAChK,OAAA,EAAI,UAAA;AAAA,YAAAA,2BAAAA,IAAC,SAAM,UAAA,OAAA,CAAI;AAAA,YAAQA,+BAAC,SAAM,aAAY,WAAU,OAAO,SAAS,WAAW,IAAI,UAAU,CAAA,MAAK,eAAe,EAAE,SAAS,EAAE,OAAO,MAAA,CAAO,GAAG,UAAU,cAAc,YAAA,CAAa;AAAA,UAAA,EAAA,CAAE;AAAA,QAAA,GACzL;AAAA,QACAA,2BAAAA,IAAC,eAAA,EAAc,SAAS,EAAA,CAAG;AAAA,QAC3BA,2BAAAA,IAAC,UAAO,MAAK,UAAS,UAAU,YAAY,OAAO,EAAE,OAAO,OAAA,GACzD,uBACCD,2BAAAA,KAAC,QAAA,EAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,SAAA,GACzD,UAAA;AAAA,UAAAC,+BAAC,eAAY,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU;AAAA,UAAE;AAAA,QAAA,EAAA,CAC3D,IACE,YAAA,CACN;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAID,SAAS,SACRD,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,MAAAb,+BAAC,YAAO,SAAS,MAAM,SAAS,MAAM,GAAG,OAAO,cAAc,MAAK,UACjE,UAAAA,+BAAC,eAAA,EAAc,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU,GAC3D;AAAA,sCACC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,QAAAA,+BAAC,SAAI,OAAO,WAAWU,IAAE,MAAM,GAC7B,yCAAC,cAAA,EAAa,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOA,IAAE,SAAS,GAC9E;AAAA,QACAV,2BAAAA,IAAC,eAAY,UAAA,eAAA,CAAY;AAAA,wCACxB,mBAAA,EAAkB,UAAA;AAAA,UAAA;AAAA,UAAuB,cAAc,MAAM,SAAS,OAAO,IAAI,SAAS,KAAK,KAAK,KAAK,SAAS,KAAK;AAAA,QAAA,EAAA,CAAG;AAAA,MAAA,GAC7H;AAAA,MACAD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,WAAW,QAAQ,SAAS,QAAQ,eAAe,UAAU,KAAK,OAAA,GAC7E,UAAA;AAAA,QAAA,YAAA;AAAA,uCACA,UAAA,EAAS,OAAO,SAAS,UAAU,YAAY,UAAU,YAAY;AAAA,uCACrE,OAAA,EAAI,OAAO,EAAE,WAAW,UAAU,UAAU,WAAA,GAC1C,UAAA,iBAAiB,oCAAK,QAAA,EAAK,OAAO,EAAE,OAAOW,IAAE,WAAW,UAAA;AAAA,UAAA;AAAA,UAAe;AAAA,UAAe;AAAA,QAAA,EAAA,CAAC,IAAUV,2BAAAA,IAAC,UAAA,EAAO,MAAK,UAAS,SAAS,iBAAiB,OAAO,WAAW,UAAA,2BAAA,CAAwB,EAAA,CAC9L;AAAA,QACAA,2BAAAA,IAAC,eAAA,EAAc,SAAS,EAAA,CAAG;AAAA,QAC3BA,2BAAAA,IAAC,QAAA,EAAO,SAAS,iBAAiB,UAAU,cAAc,QAAQ,WAAW,GAAG,OAAO,EAAE,OAAO,UAC7F,UAAA,aACCD,2BAAAA,KAAC,QAAA,EAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,SAAA,GACzD,UAAA;AAAA,UAAAC,+BAAC,eAAY,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU;AAAA,UAAE;AAAA,QAAA,EAAA,CAC3D,IACE,WAAA,CACN;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,GACF;AAAA,IAID,SAAS,cACRD,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,MAAAb,+BAAC,YAAO,SAAS,MAAM,SAAS,KAAK,GAAG,OAAO,cAAc,MAAK,UAChE,UAAAA,+BAAC,eAAA,EAAc,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU,GAC3D;AAAA,sCACC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,QAAAA,+BAAC,SAAI,OAAO,WAAWU,IAAE,MAAM,GAC7B,yCAAC,UAAA,EAAS,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOA,IAAE,SAAS,GAC1E;AAAA,QACAV,2BAAAA,IAAC,eAAY,UAAA,wBAAA,CAAqB;AAAA,MAAA,GACpC;AAAA,MACAD,2BAAAA,KAAC,QAAA,EAAK,UAAU,sBAAsB,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,WAAW,WAAW,aACjH,UAAA;AAAA,QAAA,YAAA;AAAA,wCACA,OAAA,EAAI,UAAA;AAAA,UAAAC,2BAAAA,IAAC,SAAM,UAAA,eAAA,CAAY;AAAA,yCAAS,OAAA,EAAM,MAAK,YAAW,aAAY,wBAAuB,OAAO,UAAU,UAAU,CAAA,MAAK,YAAY,EAAE,OAAO,KAAK,GAAG,UAAU,WAAA,CAAY;AAAA,QAAA,GAAE;AAAA,wCAC9K,OAAA,EAAI,UAAA;AAAA,UAAAA,2BAAAA,IAAC,SAAM,UAAA,4BAAA,CAAyB;AAAA,yCAAS,OAAA,EAAM,MAAK,YAAW,aAAY,YAAW,OAAO,iBAAiB,UAAU,CAAA,MAAK,mBAAmB,EAAE,OAAO,KAAK,GAAG,UAAU,WAAA,CAAY;AAAA,QAAA,GAAE;AAAA,QAC9LA,2BAAAA,IAAC,eAAA,EAAc,SAAS,EAAA,CAAG;AAAA,QAC3BA,2BAAAA,IAAC,QAAA,EAAO,MAAK,UAAS,UAAU,YAAY,OAAO,EAAE,OAAO,UAAU,UAAA,YAAA,CAAS;AAAA,MAAA,EAAA,CACjF;AAAA,IAAA,GACF;AAAA,IAID,SAAS,aACRD,2BAAAA,KAAAc,WAAAA,UAAA,EACE,UAAA;AAAA,MAAAb,+BAAC,YAAO,SAAS,MAAM,SAAS,UAAU,GAAG,OAAO,cAAc,MAAK,UACrE,UAAAA,+BAAC,eAAA,EAAc,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU,GAC3D;AAAA,sCACC,cAAA,EAAa,OAAO,EAAE,WAAW,YAChC,UAAA;AAAA,QAAAA,+BAAC,SAAI,OAAO,WAAWU,IAAE,UAAU,IAAI,GACrC,UAAAV,+BAAC,iBAAA,EAAgB,OAAO,EAAE,OAAO,UAAU,QAAQ,UAAU,OAAOU,IAAE,WAAW,GACnF;AAAA,QACAV,2BAAAA,IAAC,eAAY,UAAA,8BAAA,CAA2B;AAAA,MAAA,GAC1C;AAAA,MACAD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,WAAW,QAAQ,SAAS,QAAQ,eAAe,UAAU,KAAK,UAAA,GAC7E,UAAA;AAAA,QAAA,YAAA;AAAA,QACDC,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,iBAAiBU,IAAE,SAAS,cAAc,UAAU,SAAS,OAAA,GACxE,WAAC,CAAC,OAAO,SAAS,IAAI,GAAG,GAAI,CAAC,cAAc,CAAC,CAAC,SAAS,SAAS,KAAK,CAAC,IAAI,CAAA,GAAK,CAAC,aAAa,GAAG,SAAS,OAAO,IAAI,SAAS,KAAK,EAAE,GAAG,CAAC,SAAS,SAAS,IAAI,GAAG,CAAC,QAAQ,SAAS,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO,KAAK,sCAC7M,OAAA,EAA0B,OAAO,EAAE,SAAS,QAAQ,gBAAgB,iBAAiB,SAAS,gBAC7F,UAAA;AAAA,UAAAV,2BAAAA,IAAC,QAAA,EAAK,OAAO,EAAE,UAAU,YAAY,OAAOU,IAAE,QAAA,GAAY,UAAA,MAAA,CAAM;AAAA,UAChEV,2BAAAA,IAAC,UAAK,OAAO,EAAE,UAAU,YAAY,YAAY,IAAA,GAAQ,UAAA,MAAA,CAAgB;AAAA,QAAA,KAFjE,KAGV,CACD,GACH;AAAA,QACAA,2BAAAA,IAAC,eAAA,EAAc,SAAS,EAAA,CAAG;AAAA,QAC3BA,2BAAAA,IAAC,UAAO,SAAS,eAAe,UAAU,YAAY,OAAO,EAAE,OAAO,OAAA,GACnE,uBACCD,2BAAAA,KAAC,QAAA,EAAK,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,SAAA,GACzD,UAAA;AAAA,UAAAC,+BAAC,eAAY,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAU;AAAA,UAAE;AAAA,QAAA,EAAA,CAC3D,IACE,mBAAA,CACN;AAAA,MAAA,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,EAAA,CAEJ,GAEJ,GACF;AAEJ;ACrZA,MAAM,IAAI;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AACT;AAYO,SAAS,gBAAgB,EAAE,MAAM,cAAc,MAAM,YAAY,UAAgC;AACtG,QAAM,aAAa,CAAC,KAAK;AACzB,QAAM,aAAa,CAAC,KAAK;AACzB,QAAM,aAAa,CAAC,KAAK;AAEzB,QAAM,CAAC,cAAc,eAAe,IAAIM,MAAAA,SAAiB,EAAE;AAC3D,QAAM,CAAC,WAAW,YAAY,IAAIA,MAAAA,SAAsB,IAAI;AAC5D,QAAM,CAAC,SAAS,UAAU,IAAIA,MAAAA,SAAS,KAAK,WAAW,MAAM;AAC7D,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAS,KAAK,SAAS,EAAE;AACnD,QAAM,CAAC,OAAO,QAAQ,IAAIA,MAAAA,SAAS,EAAE;AACrC,QAAM,CAAC,WAAW,YAAY,IAAIA,MAAAA,SAAS,KAAK;AAChD,QAAM,CAAC,YAAY,aAAa,IAAIA,MAAAA,SAAS,KAAK;AAElD,QAAM,CAAC,WAAW,YAAY,IAAIA,MAAAA,SAAS,EAAE;AAE7C,QAAM,mBAAmBG,kBAAY,CAAC,MAA2C;;AAC/E,UAAM,QAAO,OAAE,OAAO,UAAT,mBAAiB;AAC9B,QAAI,CAAC,KAAM;AAGX,QAAI,KAAK,OAAO,IAAI,OAAO,MAAM;AAC/B,mBAAa,kEAAkE;AAC/E,QAAE,OAAO,QAAQ;AACjB;AAAA,IACF;AACA,iBAAa,EAAE;AACf,iBAAa,IAAI;AACjB,UAAM,SAAS,IAAI,WAAA;AACnB,WAAO,SAAS,MAAM,gBAAgB,OAAO,MAAgB;AAC7D,WAAO,cAAc,IAAI;AAAA,EAC3B,GAAG,CAAA,CAAE;AAEL,QAAM,YAAY,eACf,aAAa,CAAC,CAAC,eAAe,UAC9B,aAAa,MAAM,UAAU,IAAI;AAGpC,QAAM,eAAeA,MAAAA,YAAY,MAAM;AACrC,QAAI,CAAC,UAAW;AAChB,kBAAc,IAAI;AAElB,UAAM,OAAiF,CAAA;AACvF,QAAI,cAAc,cAAc;AAC9B,WAAK,YAAY;AAAA,IACnB;AACA,QAAI,cAAc,OAAO;AACvB,WAAK,UAAU;AACf,WAAK,QAAQ;AAAA,IACf;AACA,QAAI,cAAc,MAAM,QAAQ;AAC9B,WAAK,QAAQ,MAAM,KAAA;AAAA,IACrB;AAEA,eAAW,IAAI;AAAA,EACjB,GAAG,CAAC,WAAW,YAAY,YAAY,YAAY,cAAc,SAAS,OAAO,OAAO,UAAU,CAAC;AAGnG,QAAM,aAAa,MACjBV,gCAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAQ,EAAE,QAAQ,aAAY,KAAI,eAAc,SAAQ,gBAAe,SACjI,UAAA;AAAA,IAAAC,2BAAAA,IAAC,QAAA,EAAK,GAAE,qKAAA,CAAqK;AAAA,IAC7KA,2BAAAA,IAAC,QAAA,EAAK,GAAE,gBAAA,CAAgB;AAAA,EAAA,GAC1B;AAGF,SACEA,2BAAAA,IAAC,QAAA,EAAO,MAAY,cAClB,0CAAC,eAAA,EACC,UAAA;AAAA,IAAAD,gCAAC,cAAA,EACC,UAAA;AAAA,MAAAA,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,UAAU,cAAc,UAAA,GAChF,UAAA;AAAA,QAAAC,2BAAAA,IAAC,YAAA,EAAW;AAAA,QACZA,2BAAAA,IAAC,eAAY,UAAA,yBAAA,CAAsB;AAAA,MAAA,GACrC;AAAA,MACAA,2BAAAA,IAAC,qBAAkB,UAAA,mEAAA,CAEnB;AAAA,IAAA,GACF;AAAA,IAEAD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,WAAW,WAAW,OAAA,GAEhF,UAAA;AAAA,MAAA,8CACE,OAAA,EACC,UAAA;AAAA,QAAAC,2BAAAA,IAAC,OAAA,EAAM,OAAO,EAAE,SAAS,SAAS,cAAc,UAAU,OAAO,EAAE,SAAS,YAAY,IAAA,GAAO,UAAA,mBAE/F;AAAA,QACAD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,OAAA,GAExD,UAAA;AAAA,UAAAC,+BAAC,SAAI,OAAO;AAAA,YACV,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,cAAc;AAAA,YACd,iBAAiB,EAAE;AAAA,YACnB,QAAQ,cAAc,EAAE,OAAO;AAAA,YAC/B,UAAU;AAAA,YACV,SAAS;AAAA,YACT,YAAY;AAAA,YACZ,gBAAgB;AAAA,YAChB,YAAY;AAAA,UAAA,GAEX,UAAA,eACCA,+BAAC,OAAA,EAAI,KAAK,cAAc,KAAI,WAAU,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,WAAW,UAAQ,CAAG,IAEpGD,2BAAAA,KAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAQ,EAAE,SAAS,aAAY,OAAM,eAAc,SAAQ,gBAAe,SACpI,UAAA;AAAA,YAAAC,+BAAC,YAAO,IAAG,MAAK,IAAG,KAAI,GAAE,KAAI;AAAA,YAC7BA,2BAAAA,IAAC,QAAA,EAAK,GAAE,+BAAA,CAA+B;AAAA,UAAA,EAAA,CACzC,EAAA,CAEJ;AAAA,0CAEC,OAAA,EAAI,OAAO,EAAE,MAAM,KAClB,UAAA;AAAA,YAAAD,gCAAC,WAAM,OAAO;AAAA,cACZ,SAAS;AAAA,cACT,SAAS;AAAA,cACT,iBAAiB,EAAE;AAAA,cACnB,QAAQ,aAAa,EAAE,OAAO;AAAA,cAC9B,cAAc;AAAA,cACd,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,OAAO,EAAE;AAAA,cACT,YAAY;AAAA,YAAA,GACX,UAAA;AAAA,cAAA;AAAA,cAEDC,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,UAAU;AAAA,kBACV,OAAO,EAAE,SAAS,OAAA;AAAA,gBAAO;AAAA,cAAA;AAAA,YAC3B,GACF;AAAA,YACAA,2BAAAA,IAAC,KAAA,EAAE,OAAO,EAAE,UAAU,WAAW,OAAO,YAAY,YAAY,EAAE,SAAS,WAAW,UAAA,GACnF,uBAAa,sBAAA,CAChB;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAID,8CACE,OAAA,EACC,UAAA;AAAA,QAAAA,2BAAAA,IAAC,OAAA,EAAM,OAAO,EAAE,SAAS,SAAS,cAAc,UAAU,OAAO,EAAE,SAAS,YAAY,IAAA,GAAO,UAAA,uBAE/F;AAAA,QACAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,OAAO;AAAA,YACP,UAAU;AAAA,YACV;AAAA,YACA,iBAAiB;AAAA,UAAA;AAAA,QAAA;AAAA,MACnB,GACF;AAAA,MAID,8CACE,OAAA,EACC,UAAA;AAAA,QAAAD,2BAAAA,KAAC,OAAA,EAAM,OAAO,EAAE,SAAS,SAAS,cAAc,UAAU,OAAO,EAAE,SAAS,YAAY,IAAA,GAAO,UAAA;AAAA,UAAA;AAAA,UAC/EC,2BAAAA,IAAC,QAAA,EAAK,OAAO,EAAE,OAAO,EAAE,SAAS,YAAY,OAAO,UAAA,cAAA,CAAW;AAAA,QAAA,GAC/E;AAAA,QACAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO;AAAA,YACP,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK;AAAA,YACxC,aAAY;AAAA,YACZ,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,QAAQ,aAAa,EAAE,OAAO;AAAA,cAC9B,cAAc;AAAA,cACd,UAAU;AAAA,cACV,OAAO,EAAE;AAAA,cACT,iBAAiB,EAAE;AAAA,cACnB,SAAS;AAAA,YAAA;AAAA,UACX;AAAA,QAAA;AAAA,MACF,GACF;AAAA,MAIFD,gCAAC,WAAM,OAAO;AAAA,QACZ,SAAS;AAAA,QACT,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,OAAO,EAAE;AAAA,MAAA,GAET,UAAA;AAAA,QAAAC,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS;AAAA,YACT,UAAU,CAAC,MAAM,aAAa,EAAE,OAAO,OAAO;AAAA,YAC9C,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,aAAa,EAAE;AAAA,cACf,QAAQ;AAAA,YAAA;AAAA,UACV;AAAA,QAAA;AAAA,QAEFA,2BAAAA,IAAC,UAAK,UAAA,gDAAA,CAA6C;AAAA,MAAA,GACrD;AAAA,MAGAD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,SAAA,GAC3D,UAAA;AAAA,QAAAC,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS;AAAA,YACT,UAAU,CAAC,aAAa;AAAA,YACxB,OAAO,EAAE,OAAO,QAAQ,QAAQ,WAAW,SAAS,aAAa,CAAC,aAAa,IAAI,IAAA;AAAA,YAElF,uBAAa,sBAAsB;AAAA,UAAA;AAAA,QAAA;AAAA,QAEtCA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,SAAS;AAAA,YACT,UAAU;AAAA,YACV,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAA;AAAA,YACjC,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,EAAA,CACF;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;ACjPO,SAAS,WAAW,EAAE,YAAY,aAA8B;AACrE,QAAM,CAAC,MAAM,OAAO,IAAIM,MAAAA,SAAuB,CAAA,CAAE;AACjD,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAAS,IAAI;AAC7C,QAAM,CAAC,aAAa,cAAc,IAAIA,MAAAA,SAAwB,IAAI;AAElEJ,QAAAA,UAAU,MAAM;AACd,WAAO,gBAAgB,OAAO;AAAA,EAChC,GAAG,CAAA,CAAE;AAEL,QAAM,aAAaO,MAAAA,YAAY,MAAM;;AACnC,UAAM,OAAO,iBAAA;AACb,oBAAU,cAAV,mBAAqB,UAAU,MAAM,MAAM,MAAM;AAAA,IAAC;AAAA,EACpD,GAAG,CAAA,CAAE;AAEL,QAAM,cAAcA,MAAAA,YAAY,MAAM;AACpC,iBAAA;AACA,mBAAe,IAAI;AAAA,EACrB,GAAG,CAAA,CAAE;AAEL,QAAM,cAAc,CAAC,WAA0B;AAC7C,QAAI,WAAW,KAAM,QAAO;AAC5B,QAAI,UAAU,OAAO,SAAS,IAAK,QAAO;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,CAAC,WAA0B;AAC7C,QAAI,WAAW,KAAM,QAAO;AAC5B,QAAI,UAAU,OAAO,SAAS,IAAK,QAAO;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,cAAc,KAAK,KAAK,OAAK,EAAE,OAAO,WAAW,IAAI;AAEtE,SACEV,2BAAAA,KAAC,SAAI,OAAO;AAAA,IACV,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA,GAGV,UAAA;AAAA,IAAAA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,MAAM,YAAY,CAAC,QAAQ;AAAA,QACpC,OAAO;AAAA,UACL,YAAY;AAAA,UACZ,OAAO;AAAA,UACP,SAAS;AAAA,UACT,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,WAAW;AAAA,QAAA;AAAA,QAGb,UAAA;AAAA,UAAAA,gCAAC,QAAA,EAAK,UAAA;AAAA,YAAA;AAAA,YAAgB,KAAK;AAAA,YAAO;AAAA,YAAO,KAAK,SAAS,IAAI,MAAM;AAAA,UAAA,GAAG;AAAA,UACpEA,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,KAAK,OAAO,YAAY,SAAA,GACpD,UAAA;AAAA,YAAA,YACCA,2BAAAA,KAAAc,qBAAA,EACE,UAAA;AAAA,cAAAb,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBAAO,SAAS,CAAC,MAAM;AAAE,sBAAE,gBAAA;AAAmB,+BAAA;AAAA,kBAAc;AAAA,kBAC3D,OAAO,EAAE,YAAY,WAAW,OAAO,WAAW,QAAQ,QAAQ,cAAc,OAAO,SAAS,WAAW,QAAQ,WAAW,UAAU,OAAA;AAAA,kBAAU,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAGpJA,2BAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBAAO,SAAS,CAAC,MAAM;AAAE,sBAAE,gBAAA;AAAmB,gCAAA;AAAA,kBAAe;AAAA,kBAC5D,OAAO,EAAE,YAAY,WAAW,OAAO,WAAW,QAAQ,QAAQ,cAAc,OAAO,SAAS,WAAW,QAAQ,WAAW,UAAU,OAAA;AAAA,kBAAU,UAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,YAEpJ,GACF;AAAA,YAEFA,2BAAAA,IAAC,QAAA,EAAM,UAAA,WAAW,MAAM,IAAA,CAAI;AAAA,UAAA,EAAA,CAC9B;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAID,YACCD,2BAAAA,KAAC,OAAA,EAAI,OAAO;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,WAAW;AAAA,MACX,WAAW;AAAA,IAAA,GAGX,UAAA;AAAA,MAAAA,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,YAAY,YAAY,WAAW,UAAU,QAAQ,OAAO,WAAW,SAAS,QAAQ,KAAK,UAClH,UAAA;AAAA,QAAAA,gCAAC,QAAA,EAAK,UAAA;AAAA,UAAA;AAAA,yCAAO,QAAA,EAAK,OAAO,EAAE,OAAO,UAAA,GAAc,UAAA,WAAA,CAAW;AAAA,QAAA,GAAO;AAAA,wCACjE,QAAA,EAAK,UAAA;AAAA,UAAA;AAAA,yCAAM,QAAA,EAAK,OAAO,EAAE,OAAO,UAAA,GAAc,UAAA,UAAA,CAAU;AAAA,QAAA,EAAA,CAAO;AAAA,MAAA,GAClE;AAAA,MAEC,KAAK,WAAW,IACfC,2BAAAA,IAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,WAAW,UAAU,OAAO,UAAA,GAAa,uEAExE,IAEAA,+BAAC,SACE,UAAA,KAAK,IAAI,CAAA,QACRD,2BAAAA,KAAC,OAAA,EACC,UAAA;AAAA,QAAAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAS,MAAM,eAAe,gBAAgB,IAAI,KAAK,OAAO,IAAI,EAAE;AAAA,YACpE,OAAO;AAAA,cACL,SAAS;AAAA,cACT,cAAc;AAAA,cACd,QAAQ;AAAA,cACR,SAAS;AAAA,cACT,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,YAAY,gBAAgB,IAAI,KAAK,YAAY;AAAA,YAAA;AAAA,YAGnD,UAAA;AAAA,cAAAC,2BAAAA,IAAC,QAAA,EAAM,UAAA,YAAY,IAAI,cAAc,GAAE;AAAA,cACvCA,+BAAC,UAAK,OAAO;AAAA,gBACX,YAAY,IAAI,WAAW,QAAQ,YAAY;AAAA,gBAC/C,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,cAAc;AAAA,gBACd,UAAU;AAAA,gBACV,YAAY;AAAA,cAAA,GACV,cAAI,QAAO;AAAA,cACfA,2BAAAA,IAAC,QAAA,EAAK,OAAO,EAAE,MAAM,GAAG,UAAU,UAAU,cAAc,YAAY,YAAY,SAAA,GAC/E,cAAI,UACP;AAAA,cACAA,2BAAAA,IAAC,QAAA,EAAK,OAAO,EAAE,OAAO,YAAY,IAAI,cAAc,GAAG,UAAU,OAAA,GAC9D,UAAA,IAAI,kBAAkB,OACzB;AAAA,6CACC,QAAA,EAAK,OAAO,EAAE,OAAO,WAAW,UAAU,QAAQ,WAAW,QAAA,GAC3D,UAAA,IAAI,WAAW,GAAG,IAAI,QAAQ,OAAO,MAAA,CACxC;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAID,gBAAgB,IAAI,MAAM,4CACxB,OAAA,EAAI,OAAO,EAAE,SAAS,qBAAqB,YAAY,WAAW,cAAc,uBAC/E,UAAA;AAAA,UAAAD,gCAAC,SAAI,OAAO,EAAE,OAAO,WAAW,cAAc,SAAS,UAAA;AAAA,YAAA;AAAA,YAClD,IAAI,KAAK,IAAI,SAAS,EAAE,mBAAA;AAAA,UAAmB,GAChD;AAAA,UACC,IAAI,cACHA,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,cAAc,SAC1B,UAAA;AAAA,YAAAC,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,OAAO,WAAW,UAAU,OAAA,GAAU,UAAA,WAAA,CAAQ;AAAA,YAC5DA,2BAAAA,IAAC,SAAI,OAAO,EAAE,OAAO,WAAW,YAAY,YAAY,WAAW,aAAa,QAAQ,GAAG,WAAW,QAAQ,UAAU,OAAA,GACrH,UAAA,KAAK,UAAU,IAAI,aAAa,MAAM,CAAC,EAAA,CAC1C;AAAA,UAAA,EAAA,CACF,IACE;AAAA,UACH,IAAI,eACHD,2BAAAA,KAAC,OAAA,EACC,UAAA;AAAA,YAAAC,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,OAAO,WAAW,UAAU,OAAA,GAAU,UAAA,YAAA,CAAS;AAAA,YAC7DA,2BAAAA,IAAC,SAAI,OAAO,EAAE,OAAO,WAAW,YAAY,YAAY,WAAW,aAAa,QAAQ,GAAG,WAAW,SAAS,UAAU,OAAA,GACtH,UAAA,KAAK,UAAU,IAAI,cAAc,MAAM,CAAC,EAAA,CAC3C;AAAA,UAAA,EAAA,CACF,IACE;AAAA,UACH,IAAI,SACHD,gCAAC,OAAA,EAAI,OAAO,EAAE,OAAO,WAAW,WAAW,MAAA,GAAS,UAAA;AAAA,YAAA;AAAA,YAAI,IAAI;AAAA,UAAA,EAAA,CAAM;AAAA,QAAA,EAAA,CAEtE;AAAA,MAAA,KA1DM,IAAI,EA4Dd,CACD,EAAA,CACH;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GAEJ;AAEJ;AC9HA,MAAM,SAAS;AAAA,EACb,SAAS;AAAA,EAET,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AACV;AAGA,MAAM,aAAqC;AAAA,EACzC,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,qBAAqB;AAAA,EACrB,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,aAAa;AAAA,EACb,wBAAwB;AAAA,EACxB,eAAe;AAAA,EACf,0BAA0B;AAAA,EAC1B,WAAW;AAAA,EACX,sBAAsB;AAAA,EACtB,YAAY;AAAA,EACZ,uBAAuB;AAAA,EACvB,iBAAiB;AAAA,EACjB,4BAA4B;AAAA,EAC5B,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,UAAU;AACZ;AAGA,MAAM,kBAAkB,MACtBA,gCAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,QAAQ,OAAO,QAAQ,aAAY,KAAI,eAAc,SAAQ,gBAAe,SACtI,UAAA;AAAA,EAAAC,2BAAAA,IAAC,QAAA,EAAK,GAAE,qKAAA,CAAqK;AAAA,EAC7KA,2BAAAA,IAAC,QAAA,EAAK,GAAE,gBAAA,CAAgB;AAAA,GAC1B;AAIF,SAAS,gBAAgB,MAAuC;AAC9D,SAAO,CAAC,KAAK,aAAa,CAAC,KAAK;AAClC;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,cAAc;AAAA,EACd;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,CAAC,OAAO,QAAQ,IAAIM,MAAAA,SAAqB,MAAM;AACrD,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,MAAAA,SAAS,KAAK;AAC1D,QAAM,CAAC,gBAAgB,iBAAiB,IAAIA,MAAAA,SAAqD,IAAI;AACrG,QAAM,CAAC,SAAS,UAAU,IAAIA,MAAAA,SAAqD,MAAM;AACvF,QAAI;AACF,YAAM,QAAQ,aAAa,QAAQQ,QAAa,UAAU,KAAK,aAAa,QAAQA,QAAa,KAAK;AACtG,YAAM,UAAU,aAAa,QAAQA,QAAa,IAAI;AACtD,UAAI,SAAS,QAAS,QAAO,EAAE,OAAO,MAAM,KAAK,MAAM,OAAO,EAAA;AAAA,IAChE,QAAQ;AAAA,IAAC;AACT,WAAO;AAAA,EACT,CAAC;AAGD,QAAM,EAAE,SAAS,cAAA,IAAkB,cAAc,EAAE,YAAY,WAAW,cAAc,qBAAqB,MAAM;AAGnHZ,QAAAA,UAAU,MAAM;AACd,UAAM,OAAO,SAAS;AACtB,UAAM,iBAAyC,CAAA;AAE/C,WAAO,KAAK,UAAU,EAAE,QAAQ,CAAC,QAAQ;AACvC,qBAAe,GAAG,IAAI,KAAK,MAAM,iBAAiB,GAAG;AAAA,IACvD,CAAC;AACD,WAAO,QAAQ,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACnD,WAAK,MAAM,YAAY,KAAK,KAAK;AAAA,IACnC,CAAC;AACD,SAAK,UAAU,IAAI,OAAO;AAC1B,SAAK,UAAU,OAAO,MAAM;AAC5B,SAAK,MAAM,cAAc;AAGzB,UAAM,OAAO,SAAS,cAAc,MAAM;AAC1C,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,aAAS,KAAK,YAAY,IAAI;AAE9B,WAAO,MAAM;AACX,aAAO,QAAQ,cAAc,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACvD,YAAI,MAAO,MAAK,MAAM,YAAY,KAAK,KAAK;AAAA,YACvC,MAAK,MAAM,eAAe,GAAG;AAAA,MACpC,CAAC;AACD,WAAK,UAAU,OAAO,OAAO;AAC7B,WAAK,MAAM,cAAc;AACzB,WAAK,OAAA;AAAA,IACP;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,QAAM,YAAYO,MAAAA,YAAY,MAAM,SAAS,OAAO,GAAG,CAAA,CAAE;AACzD,QAAM,aAAaA,MAAAA,YAAY,MAAM,SAAS,QAAQ,GAAG,CAAA,CAAE;AAC3D,QAAM,aAAaA,MAAAA,YAAY,MAAM,SAAS,MAAM,GAAG,CAAA,CAAE;AAEzD,QAAM,iBAAiBA,MAAAA,YAAY,MAAM;AACvC,aAAS,MAAM;AACf,eAAW,MAAM,SAAS,QAAQ,GAAG,GAAG;AAAA,EAC1C,GAAG,CAAA,CAAE;AAEL,QAAM,gBAAgBA,MAAAA,YAAY,MAAM;AACtC,aAAS,MAAM;AACf,eAAW,MAAM,SAAS,OAAO,GAAG,GAAG;AAAA,EACzC,GAAG,CAAA,CAAE;AAEL,QAAM,qBAAqBA,MAAAA,YAAY,CAAC,OAAe,SAAoB;AAEzE,UAAM,UAAsB;AAAA,MAC1B,WAAW;AAAA,MACX,MAAM,KAAK;AAAA,MACX,OAAO,KAAK,SAAS;AAAA,MACrB,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,WAAW,KAAK;AAAA,MAChB,cAAe,KAAa,gBAAgB;AAAA,IAAA;AAG9C,aAAS,MAAM;AAGf,QAAI,gBAAgB,OAAO,GAAG;AAC5B,wBAAkB,EAAE,OAAO,MAAM,QAAA,CAAS;AAC1C,wBAAkB,IAAI;AAAA,IACxB,OAAO;AACL,iBAAW,EAAE,OAAO,MAAM,QAAA,CAAS;AACnC,uDAAiB,OAAO;AACxB,UAAI,mBAAoB,QAAO,SAAS,OAAO;AAAA,IACjD;AAAA,EACF,GAAG,CAAC,gBAAgB,kBAAkB,CAAC;AAEvC,QAAM,2BAA2BA,kBAAY,CAAC,SAAmE;AAC/G,QAAI,CAAC,eAAgB;AAGrB,UAAM,cAAc,EAAE,GAAG,eAAe,MAAM,GAAG,KAAA;AAGjD,iBAAa,QAAQK,QAAa,MAAM,KAAK,UAAU,WAAW,CAAC;AAEnE,sBAAkB,KAAK;AACvB,eAAW,EAAE,OAAO,eAAe,OAAO,MAAM,aAAa;AAC7D,sBAAkB,IAAI;AAEtB,iEAAuB;AACvB,qDAAiB,eAAe,OAAO;AACvC,QAAI,mBAAoB,QAAO,SAAS,OAAO;AAAA,EACjD,GAAG,CAAC,gBAAgB,gBAAgB,sBAAsB,kBAAkB,CAAC;AAE7E,QAAM,uBAAuBL,MAAAA,YAAY,MAAM;AAC7C,QAAI,CAAC,eAAgB;AAErB,sBAAkB,KAAK;AACvB,eAAW,cAAc;AACzB,sBAAkB,IAAI;AAEtB,qDAAiB,eAAe,OAAO,eAAe;AACtD,QAAI,mBAAoB,QAAO,SAAS,OAAO;AAAA,EACjD,GAAG,CAAC,gBAAgB,gBAAgB,kBAAkB,CAAC;AAEvD,QAAM,eAAeA,MAAAA,YAAY,MAAM;AACrC,iBAAa,WAAWK,QAAa,UAAU;AAC/C,iBAAa,WAAWA,QAAa,KAAK;AAC1C,iBAAa,WAAWA,QAAa,IAAI;AACzC,iBAAa,WAAWA,QAAa,YAAY;AACjD,iBAAa,WAAWA,QAAa,eAAe;AACpD,eAAW,IAAI;AACf;AACA,QAAI,oBAAqB,QAAO,SAAS,OAAO;AAAA,EAClD,GAAG,CAAC,UAAU,mBAAmB,CAAC;AAGlC,QAAM,iBAAsC;AAAA,IAC1C,WAAW;AAAA,IACX,iBAAiB,OAAO;AAAA,IACxB,SAAS;AAAA,IACT,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,SAAS;AAAA,EAAA;AAGX,QAAM,YAAiC;AAAA,IACrC,OAAO;AAAA,IACP,UAAU;AAAA,IACV,iBAAiB,OAAO;AAAA,IACxB,QAAQ,aAAa,OAAO,MAAM;AAAA,IAClC,cAAc;AAAA,IACd,WAAW,OAAO;AAAA,IAClB,UAAU;AAAA,EAAA;AAGZ,QAAM,cAAmC;AAAA,IACvC,WAAW;AAAA,IACX,UAAU;AAAA,IACV,OAAO;AAAA,IACP,WAAW;AAAA,EAAA;AAIb,QAAM,iBAAiB,MACrBd,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,WAAW,UAAU,cAAc,YAC/C,UAAAD,2BAAAA,KAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,KAAK,UAAU,cAAc,SAAA,GAC1G,UAAA;AAAA,IAAAC,2BAAAA,IAAC,iBAAA,EAAgB;AAAA,IACjBD,2BAAAA,KAAC,QAAA,EAAK,OAAO,EAAE,UAAU,YAAY,YAAY,KAAK,OAAO,OAAO,QAAA,GAAW,UAAA;AAAA,MAAA;AAAA,MACzEC,+BAAC,UAAK,OAAO,EAAE,OAAO,OAAO,OAAA,GAAU,UAAA,UAAM;AAAA,MAAO;AAAA,IAAA,EAAA,CAC1D;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAIF,MAAI,SAAS;AACX,WACED,2BAAAA,KAAC,OAAA,EAAI,OAAO,gBAEV,UAAA;AAAA,MAAAC,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,OAAO,QAAQ,UAAU,SAAS,cAAc,SAAA,GAC5D,UAAAA,2BAAAA,IAAC,gBAAA,EAAe,WAAsB,GACxC;AAAA,MAEAA,2BAAAA,IAAC,OAAA,EAAI,OAAO,WACV,UAAAD,2BAAAA,KAAC,SAAI,OAAO,EAAE,SAAS,qBAAA,GACrB,UAAA;AAAA,QAAAC,2BAAAA,IAAC,gBAAA,EAAe;AAAA,QAChBD,2BAAAA,KAAC,MAAA,EAAG,OAAO,EAAE,UAAU,WAAW,YAAY,KAAK,WAAW,UAAU,OAAO,OAAO,kBAAkB,UAAA;AAAA,UAAA;AAAA,UAC1F,QAAQ,KAAK;AAAA,QAAA,GAC3B;AAAA,QACAC,2BAAAA,IAAC,KAAA,EAAE,OAAO,EAAE,UAAU,YAAY,OAAO,OAAO,OAAO,WAAW,UAAU,WAAW,UAAA,GAAa,UAAA,gDAEpG;AAAA,uCACC,OAAA,EAAI,OAAO,EAAE,WAAW,YACvB,UAAAA,2BAAAA,IAAC,QAAA,EAAO,SAAQ,WAAU,SAAS,cAAc,OAAO,EAAE,OAAO,UAAU,yBAE3E,EAAA,CACF;AAAA,MAAA,EAAA,CACF,EAAA,CACF;AAAA,MAEC,CAAC,cACAD,2BAAAA,KAAC,KAAA,EAAE,OAAO,aAAa,UAAA;AAAA,QAAA;AAAA,QACZ;AAAA,uCACR,KAAA,EAAE,MAAK,0BAAyB,QAAO,UAAS,KAAI,uBAAsB,OAAO,EAAE,OAAO,OAAO,QAAQ,gBAAgB,UAAU,UAAA,kBAEpI;AAAA,QACC;AAAA,QAAI;AAAA,MAAA,EAAA,CACP;AAAA,IAAA,GAEJ;AAAA,EAEJ;AAGA,SACEA,2BAAAA,KAAC,OAAA,EAAI,OAAO,gBAEV,UAAA;AAAA,IAAAC,2BAAAA,IAAC,OAAA,EAAI,OAAO,EAAE,OAAO,QAAQ,UAAU,SAAS,cAAc,SAAA,GAC3D,UAAA,UACCA,2BAAAA,IAAC,OAAA,EAAI,KAAK,SAAS,KAAI,QAAO,OAAO,EAAE,QAAQ,QAAQ,QAAQ,SAAA,EAAS,CAAG,IAE3EA,2BAAAA,IAAC,gBAAA,EAAe,UAAA,CAAsB,GAE1C;AAAA,IAGAA,2BAAAA,IAAC,OAAA,EAAI,OAAO,WACV,UAAAD,2BAAAA,KAAC,SAAI,OAAO,EAAE,SAAS,qBAAA,GACrB,UAAA;AAAA,MAAAC,2BAAAA,IAAC,gBAAA,EAAe;AAAA,qCAEf,MAAA,EAAG,OAAO,EAAE,UAAU,WAAW,YAAY,KAAK,WAAW,UAAU,OAAO,OAAO,gBAAgB,cAAc,YACjH,UAAA,OACH;AAAA,MACAA,2BAAAA,IAAC,KAAA,EAAE,OAAO,EAAE,UAAU,YAAY,OAAO,OAAO,OAAO,WAAW,UAAU,cAAc,SAAA,GACvF,UAAA,aACH;AAAA,MAGAD,2BAAAA,KAAC,OAAA,EAAI,OAAO,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,UAAA,GAC3D,UAAA;AAAA,QAAAC,2BAAAA,IAAC,QAAA,EAAO,SAAS,WAAW,OAAO,EAAE,OAAO,QAAQ,QAAQ,UAAA,GAAa,UAAA,YAAA,CAEzE;AAAA,QACAA,2BAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,SAAQ;AAAA,YACR,SAAS;AAAA,YACT,OAAO;AAAA,cACL,OAAO;AAAA,cACP,QAAQ;AAAA,cACR,aAAa,OAAO;AAAA,cACpB,OAAO,OAAO;AAAA,YAAA;AAAA,YAEjB,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAED,EAAA,CACF;AAAA,IAAA,EAAA,CACF,EAAA,CACF;AAAA,IAGC,CAAC,cACAD,2BAAAA,KAAC,KAAA,EAAE,OAAO,aAAa,UAAA;AAAA,MAAA;AAAA,MACZ;AAAA,qCACR,KAAA,EAAE,MAAK,0BAAyB,QAAO,UAAS,KAAI,uBAAsB,OAAO,EAAE,OAAO,OAAO,QAAQ,gBAAgB,UAAU,UAAA,kBAEpI;AAAA,MACC;AAAA,MAAI;AAAA,IAAA,GACP;AAAA,IAGFC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,UAAU;AAAA,QAChB,cAAc,CAAA,SAAQ;AAAE,cAAI,CAAC,KAAM,YAAA;AAAA,QAAc;AAAA,QACjD,kBAAkB;AAAA,QAClB,gBAAgB;AAAA,QAChB;AAAA,QACA;AAAA,QACA,oBAAoB;AAAA,MAAA;AAAA,IAAA;AAAA,IAGtBA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,UAAU;AAAA,QAChB,cAAc,CAAA,SAAQ;AAAE,cAAI,CAAC,KAAM,YAAA;AAAA,QAAc;AAAA,QACjD,iBAAiB;AAAA,QACjB,iBAAiB;AAAA,QACjB;AAAA,QACA;AAAA,QACA,oBAAoB;AAAA,MAAA;AAAA,IAAA;AAAA,IAIrB,kBACCA,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,cAAc,CAAC,SAAS;AAAE,cAAI,CAAC,KAAM,sBAAA;AAAA,QAAwB;AAAA,QAC7D,MAAM,eAAe;AAAA,QACrB,YAAY;AAAA,QACZ,QAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,IAIX,iBAAiBA,2BAAAA,IAAC,YAAA,EAAW,YAAwB,UAAA,CAAsB;AAAA,EAAA,GAC9E;AAEJ;ACrYA,MAAM,mBAAmBC,MAAAA,cAAsC,IAAI;AAiB5D,SAAS,kBAAkB,EAAE,QAAAM,SAAQ,YAAoC;AAC9E,QAAM,gBAAgBF,MAAAA,OAAO,KAAK;AAElCH,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,cAAc,SAAS;AAC1B,0BAAoBK,OAAM;AAC1B,oBAAc,UAAU;AAAA,IAC1B;AAAA,EACF,GAAG,CAACA,OAAM,CAAC;AAEX,wCACG,iBAAiB,UAAjB,EAA0B,OAAOA,SAC/B,UACH;AAEJ;AAMO,SAAS,qBAAsC;AACpD,QAAM,MAAMJ,MAAAA,WAAW,gBAAgB;AACvC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,kEAAkE;AAAA,EACpF;AACA,SAAO;AACT;AC9BA,SAAS,sBAAsB,QAAmD;AAChF,QAAM,UAAU,OAAO;AACvB,QAAM,aAAa,OAAO;AAE1B,MAAI,CAAC,WAAW,CAAC,YAAY;AAC3B,UAAM,IAAI,MAAM,sIAAsI;AAAA,EACxJ;AAEA,SAAO,EAAE,SAAS,WAAA;AACpB;AAMO,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/B,MAAM,UAAU,QAAkJ;AAChK,UAAMI,UAAS,oBAAA;AACf,UAAM,EAAE,SAAS,eAAe,sBAAsB,MAAM;AAE5D,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA;AAAA,UACA,eAAe,OAAO;AAAA,UACtB,SAAS,OAAO;AAAA,UAChB,OAAO,OAAO;AAAA,QAAA,CACf;AAAA,MAAA;AAAA,MAEHA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,QAAkJ;AAChK,UAAMA,UAAS,oBAAA;AACf,UAAM,EAAE,SAAS,eAAe,sBAAsB,MAAM;AAE5D,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA;AAAA,UACA,eAAe,OAAO;AAAA,UACtB,OAAO,OAAO;AAAA,QAAA,CACf;AAAA,MAAA;AAAA,MAEHA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,gBAAgB,QAA8J;AAClL,UAAMA,UAAS,oBAAA;AAEf,UAAM,aAAa,OAAO;AAE1B,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,2EAA2E;AAAA,IAC7F;AAEA,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA,iBAAiB,OAAO;AAAA,QAAA,CACzB;AAAA,MAAA;AAAA,MAEHA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoB,QAAwJ;AAChL,UAAMA,UAAS,oBAAA;AAEf,UAAM,aAAa,OAAO;AAE1B,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,2EAA2E;AAAA,IAC7F;AAEA,QAAI,OAAO,iBAAiB,SAAS,KAAK;AACxC,YAAM,IAAI,MAAM,gDAAgD;AAAA,IAClE;AAEA,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA,kBAAkB,OAAO;AAAA,QAAA,CAC1B;AAAA,MAAA;AAAA,MAEHA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAAa,QAA2J;AAC5K,UAAMA,UAAS,oBAAA;AACf,UAAM,EAAE,SAAS,eAAe,sBAAsB,MAAM;AAE5D,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA;AAAA,UACA,iBAAiB,OAAO;AAAA,UACxB,YAAY,OAAO;AAAA,QAAA,CACpB;AAAA,MAAA;AAAA,MAEHA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,YAAY,QAAwJ;AACxK,UAAMA,UAAS,oBAAA;AACf,UAAM,EAAE,SAAS,eAAe,sBAAsB,MAAM;AAE5D,WAAO;AAAA,MACL,GAAGA,QAAO,SAAS;AAAA,MACnB;AAAA,QACE,QAAQ;AAAA,QACR,SAAS,WAAA;AAAA,QACT,MAAM,KAAK,UAAU;AAAA,UACnB;AAAA,UACA;AAAA,UACA,iBAAiB,OAAO;AAAA,QAAA,CACzB;AAAA,MAAA;AAAA,MAEHA,QAAO,WAAW;AAAA,IAAA;AAAA,EAEtB;AACF;;;;;;;;;;;;;;;;;;;;;;;;"}