sunuid-sdk 1.0.33 → 1.0.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +171 -499
- package/dist/sunuid-sdk.esm.js +936 -367
- package/dist/sunuid-sdk.esm.js.map +1 -1
- package/dist/sunuid-sdk.js +936 -367
- package/dist/sunuid-sdk.js.map +1 -1
- package/dist/sunuid-sdk.min.js +3 -3
- package/dist/sunuid-sdk.min.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sunuid-sdk.min.js","sources":["../src/sunuid-sdk.js"],"sourcesContent":["/**\n * SunuID SDK - Package d'intégration pour partenaires\n * \n * @version 1.0.0\n * @author SunuID Team\n * @license MIT\n */\n\n(function(window) {\n 'use strict';\n\n // Configuration par défaut\n const DEFAULT_CONFIG = {\n apiUrl: window.SunuIDConfig?.apiUrl || 'https://api.sunuid.fayma.sn',\n clientId: null,\n secretId: null,\n type: 2, // Type par défaut (2 = authentification)\n partnerName: 'SunuID', // Nom du partenaire par défaut\n theme: 'light',\n language: 'fr',\n autoRefresh: true,\n refreshInterval: 30000, // 30 secondes\n onSuccess: null,\n onError: null,\n onStatusUpdate: null,\n onExpired: null,\n // Nouvelles options de sécurité\n enableSecurityLogs: true,\n validateInputs: true,\n maxRetries: 3,\n requestTimeout: 10000, // 10 secondes\n // Options d'initialisation sécurisée\n secureInit: false,\n secureInitUrl: (() => {\n if (window.SunuIDConfig?.apiUrl?.includes('api.sunuid.fayma.sn')) {\n return 'https://api.sunuid.fayma.sn/secure-init.php';\n }\n return window.SunuIDConfig?.apiUrl?.replace('/api', '') + '/secure-init.php' || 'https://api.sunuid.fayma.sn/secure-init.php';\n })(),\n token: null\n };\n\n /**\n * Classe principale SunuID\n */\n class SunuID {\n constructor(config = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.qrCode = null;\n this.refreshTimer = null;\n this.isInitialized = false;\n this.socket = null;\n \n // Initialisation asynchrone\n this.initPromise = this.init();\n }\n\n /**\n * Initialisation du SDK\n */\n async init() {\n try {\n // Initialisation sécurisée si activée\n if (this.config.secureInit) {\n await this.secureInit();\n } else {\n // Validation sécurisée des paramètres\n if (this.config.validateInputs) {\n this.validateSecurityParams();\n }\n }\n\n // Log de sécurité pour l'initialisation\n this.logSecurityEvent('SDK_INIT_START', {\n apiUrl: this.config.apiUrl,\n type: this.config.type,\n partnerName: this.config.partnerName,\n secureInit: this.config.secureInit\n });\n\n // Obscurcir les credentials dans les logs\n this.obfuscateCredentials();\n\n this.isInitialized = true;\n console.log('SunuID SDK initialisé avec succès');\n \n this.logSecurityEvent('SDK_INIT_SUCCESS');\n \n // Initialiser la connexion WebSocket\n this.initWebSocket();\n \n } catch (error) {\n this.logSecurityEvent('SDK_INIT_ERROR', { error: error.message });\n throw error;\n }\n }\n\n /**\n * Initialisation sécurisée via PHP\n */\n async secureInit() {\n try {\n this.logSecurityEvent('SECURE_INIT_START');\n \n const initData = {\n type: this.config.type,\n partnerName: this.config.partnerName,\n theme: this.config.theme\n };\n\n const response = await fetch(this.config.secureInitUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify(initData)\n });\n\n if (!response.ok) {\n throw new Error(`Erreur HTTP: ${response.status}`);\n }\n\n const result = await response.json();\n \n if (!result.success) {\n throw new Error(result.error || 'Erreur lors de l\\'initialisation sécurisée');\n }\n\n // Stocker le token et les données sécurisées\n this.config.token = result.data.token;\n this.config.apiUrl = result.data.api_url;\n \n // Décoder le token pour récupérer les credentials\n const decodedToken = this.decodeSecureToken(result.data.token);\n if (decodedToken) {\n this.config.clientId = decodedToken.client_id;\n this.config.secretId = decodedToken.secret_id;\n } else {\n throw new Error('Impossible de décoder le token sécurisé');\n }\n \n this.config.expiresIn = result.data.expires_in;\n this.config.maxRequests = result.data.max_requests;\n this.config.requestCount = 0;\n\n this.logSecurityEvent('SECURE_INIT_SUCCESS', {\n expiresIn: result.data.expires_in,\n maxRequests: result.data.max_requests\n });\n\n console.log('✅ Initialisation sécurisée réussie');\n \n } catch (error) {\n this.logSecurityEvent('SECURE_INIT_ERROR', { error: error.message });\n throw new Error(`Échec de l'initialisation sécurisée: ${error.message}`);\n }\n }\n\n /**\n * Décoder le token sécurisé\n */\n decodeSecureToken(token) {\n try {\n const parts = token.split('.');\n if (parts.length !== 2) {\n console.error('❌ Format de token invalide');\n return null;\n }\n \n const [payload, signature] = parts;\n \n // Décoder le payload (base64)\n const decodedPayload = atob(payload);\n const tokenData = JSON.parse(decodedPayload);\n \n // Vérifier l'expiration\n if (tokenData.exp && tokenData.exp < Date.now() / 1000) {\n console.error('❌ Token expiré');\n return null;\n }\n \n console.log('✅ Token décodé avec succès');\n return tokenData;\n \n } catch (error) {\n console.error('❌ Erreur décodage token:', error);\n return null;\n }\n }\n\n /**\n * Initialiser la connexion WebSocket\n */\n initWebSocket() {\n try {\n // Vérifier si Socket.IO est disponible\n if (typeof io === 'undefined') {\n console.warn('⚠️ Socket.IO non disponible, WebSocket sera initialisé plus tard');\n // Réessayer après un délai\n setTimeout(() => this.initWebSocket(), 1000);\n return;\n }\n \n // Obtenir l'IP du client (simulation)\n const ip = this.getClientIP();\n \n // Initialiser la connexion WebSocket si elle n'existe pas\n if (!this.socket) {\n this.socket = io('wss://samasocket.fayma.sn:9443', {\n query: {\n token: this.config.clientId,\n type: 'web',\n userId: this.config.clientId,\n username: ip\n }\n });\n\n // Gestion des événements WebSocket\n this.socket.on('connect', () => {\n console.log('🌐 WebSocket connecté avec succès');\n console.log('📊 Socket ID:', this.socket.id);\n });\n\n this.socket.on('disconnect', (reason) => {\n console.log('❌ WebSocket déconnecté:', reason);\n });\n\n this.socket.on('connect_error', (error) => {\n console.error('❌ Erreur connexion WebSocket:', error);\n });\n\n // Écouter les événements spécifiques\n this.socket.on('qr_status_update', (data) => {\n console.log('📱 Mise à jour statut QR reçue:', data);\n this.handleQRStatusUpdate(data);\n });\n\n this.socket.on('qr_scan_success', (data) => {\n console.log('✅ Scan QR réussi reçu:', data);\n this.handleQRScanSuccess(data);\n });\n\n this.socket.on('qr_expired', (data) => {\n console.log('⏰ QR expiré reçu:', data);\n this.handleQRExpired(data);\n });\n }\n } catch (error) {\n console.error('❌ Erreur initialisation WebSocket:', error);\n }\n }\n\n /**\n * Obtenir l'IP du client (simulation)\n */\n getClientIP() {\n // Simulation - en production, vous pourriez utiliser un service d'IP\n return '127.0.0.1';\n }\n\n /**\n * Obtenir le nom du type à partir du numéro\n */\n getTypeName(type) {\n switch(type) {\n case 1: return 'KYC';\n case 2: return 'AUTH';\n case 3: return 'SIGNATURE';\n default: return `TYPE-${type}`;\n }\n }\n\n /**\n * Validation sécurisée des paramètres\n */\n validateSecurityParams() {\n const errors = [];\n \n // Validation du clientId\n if (!this.config.clientId || typeof this.config.clientId !== 'string') {\n errors.push('clientId invalide ou manquant');\n } else if (this.config.clientId.length < 10) {\n errors.push('clientId trop court');\n }\n \n // Validation du secretId\n if (!this.config.secretId || typeof this.config.secretId !== 'string') {\n errors.push('secretId invalide ou manquant');\n } else if (this.config.secretId.length < 32) {\n errors.push('secretId trop court (minimum 32 caractères)');\n }\n \n // Validation de l'URL API\n if (!this.config.apiUrl || !this.isValidUrl(this.config.apiUrl)) {\n errors.push('apiUrl invalide');\n }\n \n // Validation du type\n if (![1, 2, 3].includes(this.config.type)) {\n errors.push('type invalide (doit être 1, 2 ou 3)');\n }\n \n if (errors.length > 0) {\n this.logSecurityEvent('VALIDATION_ERROR', { errors });\n throw new Error(`Paramètres de sécurité invalides: ${errors.join(', ')}`);\n }\n \n this.logSecurityEvent('VALIDATION_SUCCESS');\n }\n\n /**\n * Validation d'URL sécurisée\n */\n isValidUrl(string) {\n try {\n const url = new URL(string);\n return url.protocol === 'https:' || url.protocol === 'http:';\n } catch (_) {\n return false;\n }\n }\n\n /**\n * Logs de sécurité\n */\n logSecurityEvent(event, data = {}) {\n if (!this.config.enableSecurityLogs) return;\n \n const securityLog = {\n timestamp: new Date().toISOString(),\n event: event,\n data: data,\n userAgent: navigator.userAgent,\n url: window.location.href\n };\n \n console.warn('🔒 [SECURITY]', securityLog);\n \n // Stocker les logs de sécurité (optionnel)\n if (!window.SunuIDSecurityLogs) {\n window.SunuIDSecurityLogs = [];\n }\n window.SunuIDSecurityLogs.push(securityLog);\n }\n\n /**\n * Chiffrement simple des credentials (pour éviter l'exposition en clair)\n */\n obfuscateCredentials() {\n // Stocker les vraies valeurs pour les logs de sécurité\n this.config.originalClientId = this.config.clientId;\n this.config.originalSecretId = this.config.secretId;\n \n // Créer des versions obfusquées pour l'affichage uniquement\n if (this.config.clientId) {\n this.config.clientIdDisplay = this.config.clientId.replace(/(.{3}).*(.{3})/, '$1***$2');\n }\n if (this.config.secretId) {\n this.config.secretIdDisplay = this.config.secretId.replace(/(.{4}).*(.{4})/, '$1***$2');\n }\n }\n\n /**\n * Validation des entrées utilisateur\n */\n sanitizeInput(input) {\n if (typeof input !== 'string') return input;\n \n // Protection contre les injections XSS basiques\n return input\n .replace(/[<>]/g, '') // Supprimer les balises HTML\n .replace(/javascript:/gi, '') // Supprimer les protocoles dangereux\n .trim();\n }\n\n /**\n * Gérer la mise à jour du statut QR\n */\n handleQRStatusUpdate(data) {\n if (this.config.onStatusUpdate) {\n this.config.onStatusUpdate(data);\n }\n }\n\n /**\n * Gérer le succès du scan QR\n */\n handleQRScanSuccess(data) {\n if (this.config.onSuccess) {\n this.config.onSuccess(data);\n }\n }\n\n /**\n * Gérer l'expiration du QR\n */\n handleQRExpired(data) {\n if (this.config.onExpired) {\n this.config.onExpired(data);\n }\n }\n\n /**\n * Émettre un événement WebSocket\n */\n emitWebSocketEvent(event, data) {\n if (this.socket && this.socket.connected) {\n this.socket.emit(event, data);\n console.log(`📤 Événement WebSocket émis: ${event}`, data);\n } else if (typeof io === 'undefined') {\n console.warn('⚠️ Socket.IO non disponible, impossible d\\'émettre l\\'événement:', event);\n } else {\n console.warn('⚠️ WebSocket non connecté, impossible d\\'émettre l\\'événement:', event);\n }\n }\n\n /**\n * Obtenir le statut de la connexion WebSocket\n */\n getWebSocketStatus() {\n if (!this.socket) {\n return 'not_initialized';\n }\n return this.socket.connected ? 'connected' : 'disconnected';\n }\n\n /**\n * Forcer l'initialisation WebSocket (si Socket.IO devient disponible plus tard)\n */\n forceWebSocketInit() {\n if (typeof io !== 'undefined' && !this.socket) {\n console.log('🔄 Forçage de l\\'initialisation WebSocket...');\n this.initWebSocket();\n }\n }\n\n /**\n * Générer un QR code avec le type configuré\n */\n async generateQR(containerId, options = {}) {\n // Attendre l'initialisation si nécessaire\n if (this.initPromise) {\n await this.initPromise;\n this.initPromise = null;\n }\n \n if (!this.isInitialized) {\n throw new Error('SunuID: SDK non initialisé');\n }\n\n try {\n const response = await this.makeRequest('/qr-generate', {\n type: this.config.type, // Utilise le type configuré\n ...options\n });\n\n if (response.success) {\n // Construire l'URL complète de l'image QR avec la base URL pour les images\n const imageBaseUrl = 'https://sunuid.fayma.sn';\n const qrImageUrl = `${imageBaseUrl}${response.data.qrcode}`;\n this.currentQRUrl = qrImageUrl; // Stocker l'URL pour getQRCode()\n this.displayQRCode(containerId, qrImageUrl, this.config.type, options);\n \n // Générer le QR code personnalisé avec le type + code de l'API + socket ID\n if (this.pendingQRInfo && response.data.code) {\n // Attendre que le socket ID soit bien défini\n const waitForSocketId = () => {\n if (this.socket && this.socket.id && this.socket.id !== 'unknown') {\n const socketId = this.socket.id;\n const qrContent = `${this.config.type}-${response.data.code}-${socketId}`;\n \n // Utiliser le partnerName de la réponse API et le nom du type\n const partnerName = response.data.partnerName || this.config.partnerName || 'SunuID';\n const typeName = this.getTypeName(this.config.type);\n const qrLabel = `${typeName} - ${partnerName}`;\n \n this.generateCustomQRCode(qrContent, qrLabel, this.pendingQRInfo.options);\n this.pendingQRInfo = null; // Nettoyer\n } else {\n // Réessayer après un délai si le socket ID n'est pas encore disponible\n setTimeout(waitForSocketId, 100);\n }\n };\n \n waitForSocketId();\n }\n \n this.startAutoRefresh(containerId, this.config.type, options);\n \n // Émettre un événement WebSocket pour la génération du QR\n this.emitWebSocketEvent('qr_generated', {\n serviceId: response.data.service_id,\n type: this.config.type,\n qrCodeUrl: qrImageUrl,\n code: response.data.code,\n timestamp: Date.now()\n });\n \n return {\n ...response.data,\n qrCodeUrl: qrImageUrl,\n sessionId: response.data.service_id\n };\n } else {\n throw new Error(response.message || 'Erreur lors de la génération du QR code');\n }\n } catch (error) {\n console.error('Erreur API détectée:', error.message);\n console.error('Stack trace complet:', error.stack);\n console.error('Configuration SDK:', {\n apiUrl: this.config.apiUrl,\n type: this.config.type,\n secureInit: this.config.secureInit,\n clientId: this.config.clientId ? '***' + this.config.clientId.slice(-4) : 'null',\n secretId: this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null'\n });\n console.log('Affichage du message \"Service non disponible\" pour type ' + this.config.type);\n this.displayServiceUnavailable(containerId, this.config.type);\n throw new Error('Service non disponible');\n }\n }\n\n\n\n /**\n * Générer un QR code avec un type personnalisé\n */\n async generateCustomQR(containerId, type, options = {}) {\n // Attendre l'initialisation si nécessaire\n if (this.initPromise) {\n await this.initPromise;\n this.initPromise = null;\n }\n \n if (!this.isInitialized) {\n throw new Error('SunuID: SDK non initialisé');\n }\n\n try {\n const response = await this.makeRequest('/qr-generate', {\n type: type, // Type personnalisé (1, 2, 3, etc.)\n ...options\n });\n\n if (response.success) {\n // Construire l'URL complète de l'image QR avec la base URL pour les images\n const imageBaseUrl = 'https://sunuid.fayma.sn';\n const qrImageUrl = `${imageBaseUrl}${response.data.qrcode}`;\n this.displayQRCode(containerId, qrImageUrl, type, options);\n \n // Générer le QR code personnalisé avec le type + code de l'API + socket ID\n if (this.pendingQRInfo && response.data.code) {\n // Attendre que le socket ID soit bien défini\n const waitForSocketId = () => {\n if (this.socket && this.socket.id && this.socket.id !== 'unknown') {\n const socketId = this.socket.id;\n const qrContent = `${type}-${response.data.code}-${socketId}`;\n \n // Utiliser le partnerName de la réponse API et le nom du type\n const partnerName = response.data.partnerName || this.config.partnerName || 'SunuID';\n const typeName = this.getTypeName(type);\n const qrLabel = `${typeName} - ${partnerName}`;\n \n this.generateCustomQRCode(qrContent, qrLabel, this.pendingQRInfo.options);\n this.pendingQRInfo = null; // Nettoyer\n } else {\n // Réessayer après un délai si le socket ID n'est pas encore disponible\n setTimeout(waitForSocketId, 100);\n }\n };\n \n waitForSocketId();\n }\n \n this.startAutoRefresh(containerId, type, options);\n return {\n ...response.data,\n qrCodeUrl: qrImageUrl,\n sessionId: response.data.service_id\n };\n } else {\n throw new Error(response.message || 'Erreur lors de la génération du QR code');\n }\n } catch (error) {\n console.error('Erreur API détectée:', error.message);\n console.error('Stack trace complet:', error.stack);\n console.error('Configuration SDK (Custom):', {\n apiUrl: this.config.apiUrl,\n type: type,\n secureInit: this.config.secureInit,\n clientId: this.config.clientId ? '***' + this.config.clientId.slice(-4) : 'null',\n secretId: this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null'\n });\n console.log('Affichage du message \"Service non disponible\" pour type ' + type);\n this.displayServiceUnavailable(containerId, type);\n throw new Error('Service non disponible');\n }\n }\n\n // Alias pour maintenir la compatibilité\n async generateAuthQR(containerId, options = {}) {\n return this.generateQR(containerId, options);\n }\n\n async generateKYCQR(containerId, options = {}) {\n // Sauvegarder le type actuel\n const originalType = this.config.type;\n // Changer temporairement le type pour KYC\n this.config.type = 1;\n try {\n return await this.generateQR(containerId, options);\n } finally {\n // Restaurer le type original\n this.config.type = originalType;\n }\n }\n\n async generateSignatureQR(containerId, options = {}) {\n // Sauvegarder le type actuel\n const originalType = this.config.type;\n // Changer temporairement le type pour Signature\n this.config.type = 3;\n try {\n return await this.generateQR(containerId, options);\n } finally {\n // Restaurer le type original\n this.config.type = originalType;\n }\n }\n\n /**\n * Vérifier le statut d'un QR code\n */\n async checkQRStatus(sessionId) {\n if (!this.isInitialized) {\n throw new Error('SunuID: SDK non initialisé');\n }\n\n try {\n const response = await this.makeRequest('/qr-status', {\n serviceId: sessionId\n });\n\n if (response.success) {\n return response.data;\n } else {\n throw new Error(response.message || 'Erreur lors de la vérification du statut');\n }\n } catch (error) {\n this.handleError(error);\n throw error;\n }\n }\n\n /**\n * Afficher un QR code dans un conteneur\n */\n displayQRCode(containerId, qrUrl, type, options = {}) {\n const container = document.getElementById(containerId);\n if (!container) {\n throw new Error(`Conteneur avec l'ID \"${containerId}\" non trouvé`);\n }\n\n // Nettoyer le conteneur\n container.innerHTML = '';\n\n // Créer l'élément QR code\n const qrElement = document.createElement('div');\n qrElement.className = 'sunuid-qr-code';\n \n // Afficher un loader en attendant la réponse API et la connexion socket\n const typeName = this.getTypeName(type);\n qrElement.innerHTML = `\n <div class=\"sunuid-qr-header\">\n <h3>${type === 1 ? 'Vérification KYC' : type === 2 ? 'Authentification' : type === 3 ? 'Signature' : 'Service Type ' + type}</h3>\n </div>\n <div class=\"sunuid-qr-image\" id=\"sunuid-qr-container\">\n <div style=\"text-align: center; padding: 40px;\">\n <div class=\"sunuid-loader\">\n <div class=\"sunuid-spinner\"></div>\n <p style=\"margin-top: 20px; color: #666;\">Initialisation en cours...</p>\n <p style=\"font-size: 12px; color: #999; margin-top: 10px;\">Connexion API et WebSocket</p>\n <p style=\"font-size: 11px; color: #ccc; margin-top: 5px;\">Attente du Socket ID...</p>\n </div>\n </div>\n </div>\n <div class=\"sunuid-qr-instructions\" style=\"display: none;\">\n <p>Scannez ce QR code avec l'application ${this.config.partnerName} pour vous connecter</p>\n </div>\n <div class=\"sunuid-qr-status\" id=\"sunuid-status\" style=\"display: none;\">\n <p>En attente de scan...</p>\n </div>\n `;\n\n container.appendChild(qrElement);\n\n // Stocker les informations pour la génération ultérieure\n this.pendingQRInfo = {\n containerId,\n type,\n options\n };\n\n // Appliquer le thème\n this.applyTheme(options.theme || this.config.theme);\n }\n\n /**\n * Générer un QR code personnalisé avec PHP Endroid\n */\n async generateCustomQRCode(content, label, options = {}) {\n try {\n console.log('🎨 Début génération QR personnalisé avec PHP...');\n console.log('📄 Contenu:', content);\n console.log('🏷️ Label:', label);\n \n const qrContainer = document.getElementById('sunuid-qr-container');\n if (!qrContainer) {\n console.error('❌ QR container not found');\n this.displayFallbackImage();\n return;\n }\n \n console.log('✅ QR container trouvé');\n\n // Nettoyer le conteneur\n qrContainer.innerHTML = '<div style=\"text-align: center; padding: 20px;\"><p>Génération QR code avec PHP...</p></div>';\n\n // Appeler l'endpoint PHP\n console.log('🔄 Appel endpoint PHP...');\n // Construire l'URL du QR generator de manière plus robuste\n let qrGeneratorUrl;\n if (this.config.apiUrl.includes('api.sunuid.fayma.sn')) {\n qrGeneratorUrl = 'https://api.sunuid.fayma.sn/qr-generator.php';\n } else {\n qrGeneratorUrl = this.config.apiUrl.replace('/api', '') + '/qr-generator.php';\n }\n console.log('🔗 URL QR Generator:', qrGeneratorUrl);\n const response = await fetch(qrGeneratorUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify({\n content: content,\n label: label,\n size: 300,\n margin: 10\n })\n });\n \n console.log('📥 Réponse PHP reçue - Status:', response.status);\n \n if (!response.ok) {\n throw new Error(`Erreur HTTP: ${response.status}`);\n }\n \n const responseData = await response.json();\n \n if (!responseData.success) {\n throw new Error(`Erreur PHP: ${responseData.error}`);\n }\n \n console.log('✅ QR code généré par PHP avec succès');\n console.log('📊 Taille:', responseData.data.size + 'px');\n console.log('📊 Longueur base64:', responseData.data.length + ' caractères');\n\n // Stocker l'URL du QR code pour getQRCode()\n this.currentQRUrl = responseData.data.dataUrl;\n \n // Créer le conteneur avec le QR code PHP\n qrContainer.innerHTML = `\n <div class=\"sunuid-qr-ready\" style=\"text-align: center; padding: 20px;\">\n <img src=\"${responseData.data.dataUrl}\" alt=\"QR Code ${this.config.partnerName}\" style=\"max-width: 300px; border: 2px solid #ddd; border-radius: 10px;\">\n </div>\n `;\n \n // Afficher les instructions et le statut maintenant que le QR est prêt\n const instructionsElement = qrContainer.parentElement.querySelector('.sunuid-qr-instructions');\n const statusElement = qrContainer.parentElement.querySelector('.sunuid-qr-status');\n \n if (instructionsElement) {\n instructionsElement.style.display = 'block';\n instructionsElement.classList.add('sunuid-qr-ready');\n }\n if (statusElement) {\n statusElement.style.display = 'block';\n statusElement.classList.add('sunuid-qr-ready');\n }\n \n console.log('✅ QR code PHP affiché dans le conteneur');\n\n } catch (error) {\n console.error('❌ Erreur génération QR PHP:', error);\n console.error('Stack trace:', error.stack);\n \n // Détecter les erreurs CORS ou 404 pour activer le fallback côté client\n if (error.message.includes('Failed to fetch') || \n error.message.includes('CORS') || \n error.message.includes('404') ||\n error.message.includes('Not Found')) {\n console.warn('🚫 Erreur PHP détectée (CORS/404), tentative de génération QR côté client...');\n this.generateQRCodeClientSide(content, label, qrContainer);\n } else {\n this.displayFallbackImage();\n }\n }\n }\n\n /**\n * Générer un QR code côté client en cas d'erreur CORS\n */\n generateQRCodeClientSide(content, label, qrContainer) {\n try {\n console.log('🎨 Génération QR côté client...');\n \n // Vérifier si QRCode est disponible\n if (typeof QRCode === 'undefined') {\n console.error('❌ QRCode library non disponible');\n this.displayFallbackImage();\n return;\n }\n \n // Créer un canvas pour le QR code\n const canvas = document.createElement('canvas');\n canvas.width = 300;\n canvas.height = 320; // Plus d'espace pour le label\n const ctx = canvas.getContext('2d');\n \n // Remplir le fond en blanc\n ctx.fillStyle = '#FFFFFF';\n ctx.fillRect(0, 0, 300, 320);\n \n // Générer le QR code avec QRCode library\n QRCode.toCanvas(canvas, content, {\n width: 280,\n margin: 10,\n color: {\n dark: '#000000',\n light: '#FFFFFF'\n }\n }, (error) => {\n if (error) {\n console.error('❌ Erreur génération QR côté client:', error);\n this.displayFallbackImage();\n return;\n }\n \n // Ajouter le label en bas du QR code (sans afficher le contenu)\n ctx.fillStyle = '#333333';\n ctx.font = 'bold 14px Arial';\n ctx.textAlign = 'center';\n ctx.fillText(label, 150, 305);\n \n // Convertir en data URL\n const dataUrl = canvas.toDataURL('image/png');\n \n // Stocker l'URL du QR code pour getQRCode()\n this.currentQRUrl = dataUrl;\n \n // Afficher le QR code (sans le contenu)\n qrContainer.innerHTML = `\n <div class=\"sunuid-qr-ready\" style=\"text-align: center; padding: 20px;\">\n <img src=\"${dataUrl}\" alt=\"QR Code ${this.config.partnerName}\" style=\"max-width: 300px; border: 2px solid #ddd; border-radius: 10px;\">\n </div>\n `;\n \n // Afficher les instructions et le statut\n const instructionsElement = qrContainer.parentElement.querySelector('.sunuid-qr-instructions');\n const statusElement = qrContainer.parentElement.querySelector('.sunuid-qr-status');\n \n if (instructionsElement) {\n instructionsElement.style.display = 'block';\n instructionsElement.classList.add('sunuid-qr-ready');\n }\n if (statusElement) {\n statusElement.style.display = 'block';\n statusElement.classList.add('sunuid-qr-ready');\n }\n \n console.log('✅ QR code côté client généré avec succès');\n });\n \n } catch (error) {\n console.error('❌ Erreur génération QR côté client:', error);\n this.displayFallbackImage();\n }\n }\n\n /**\n * Ajouter le logo au centre du QR code\n */\n addLogoToCenter(ctx, x, y, width, height) {\n try {\n // Créer une image pour le logo\n const logo = new Image();\n logo.onload = () => {\n const logoSize = 40;\n const logoX = x + (width - logoSize) / 2;\n const logoY = y + (width - logoSize) / 2;\n\n // Dessiner un fond blanc pour le logo\n ctx.fillStyle = 'white';\n ctx.fillRect(logoX - 2, logoY - 2, logoSize + 4, logoSize + 4);\n\n // Dessiner le logo\n ctx.drawImage(logo, logoX, logoY, logoSize, logoSize);\n };\n logo.src = 'src/logoqr.png';\n } catch (error) {\n console.warn('Logo non disponible:', error);\n }\n }\n\n /**\n * Afficher l'image de fallback\n */\n displayFallbackImage() {\n console.log('⚠️ Affichage de l\\'image de fallback');\n const qrContainer = document.getElementById('sunuid-qr-container');\n if (qrContainer) {\n qrContainer.innerHTML = `\n <div style=\"text-align: center; padding: 20px; color: #666;\">\n <p>⚠️ Génération QR personnalisé non disponible</p>\n <p>Utilisation de l'image par défaut</p>\n <p><strong>Debug:</strong> QRCode disponible: ${typeof QRCode !== 'undefined'}</p>\n <p><strong>Debug:</strong> Container trouvé: ${qrContainer !== null}</p>\n </div>\n `;\n } else {\n console.error('❌ Container QR non trouvé pour fallback');\n }\n }\n\n /**\n * Afficher \"Service non disponible\"\n */\n displayServiceUnavailable(containerId, type) {\n console.log(`displayServiceUnavailable appelée pour ${containerId}, type: ${type}`);\n const container = document.getElementById(containerId);\n if (!container) {\n console.error(`Container ${containerId} non trouvé`);\n return;\n }\n\n container.innerHTML = `\n <div class=\"sunuid-service-unavailable\" style=\"\n text-align: center;\n padding: 40px 20px;\n background: #f8f9fa;\n border: 2px dashed #dee2e6;\n border-radius: 10px;\n color: #6c757d;\n font-family: Arial, sans-serif;\n \">\n <div style=\"font-size: 48px; margin-bottom: 20px;\">⚠️</div>\n <h3 style=\"margin: 0 0 10px 0; color: #495057;\">Service Non Disponible</h3>\n <p style=\"margin: 0; font-size: 14px;\">\n Le service d'authentification est temporairement indisponible.<br>\n Veuillez réessayer plus tard.\n </p>\n <div style=\"margin-top: 20px; font-size: 12px; color: #adb5bd;\">\n Type: ${String(type).toUpperCase()}\n </div>\n </div>\n `;\n }\n\n /**\n * Rafraîchir un QR code\n */\n async refreshQR(containerId, options = {}) {\n try {\n const result = await this.generateQR(containerId, options);\n return result;\n } catch (error) {\n console.error('Erreur lors du rafraîchissement:', error.message);\n this.displayServiceUnavailable(containerId, this.config.type);\n throw error;\n }\n }\n\n /**\n * Démarrer le rafraîchissement automatique\n */\n startAutoRefresh(containerId, type, options) {\n if (!this.config.autoRefresh) return;\n\n this.refreshTimer = setInterval(async () => {\n try {\n await this.refreshQR(containerId, type, options);\n } catch (error) {\n console.warn('Erreur lors du rafraîchissement automatique:', error);\n }\n }, this.config.refreshInterval);\n }\n\n /**\n * Démarrer le timer de compte à rebours\n */\n\n\n /**\n * Effectuer une requête API sécurisée\n */\n async makeRequest(endpoint, data) {\n // Validation de sécurité\n if (!this.isInitialized) {\n this.logSecurityEvent('REQUEST_BEFORE_INIT', { endpoint });\n throw new Error('SDK non initialisé');\n }\n\n // Vérifier les limites de requêtes pour l'initialisation sécurisée\n if (this.config.secureInit) {\n this.config.requestCount++;\n if (this.config.requestCount > this.config.maxRequests) {\n this.logSecurityEvent('API_REQUEST_LIMIT_EXCEEDED', { \n requestCount: this.config.requestCount,\n maxRequests: this.config.maxRequests \n });\n throw new Error('Limite de requêtes dépassée');\n }\n }\n\n // Sanitisation des données\n const sanitizedData = this.sanitizeRequestData(data);\n \n // Debug: Afficher les données envoyées\n console.log('🔍 Debug makeRequest - endpoint:', endpoint);\n console.log('🔍 Debug makeRequest - apiUrl:', this.config.apiUrl);\n console.log('🔍 Debug makeRequest - url:', `${this.config.apiUrl}${endpoint}`);\n console.log('🔍 Debug makeRequest - data:', JSON.stringify(sanitizedData, null, 2));\n console.log('🔍 Debug makeRequest - secureInit:', this.config.secureInit);\n console.log('🔍 Debug makeRequest - isInitialized:', this.isInitialized);\n \n // Utiliser l'endpoint depuis la configuration si disponible\n const endpointPath = window.SunuIDConfig?.endpoints?.[endpoint.replace('/', '')] || endpoint;\n const url = `${this.config.apiUrl}${endpointPath}`;\n \n // Debug: Afficher l'URL finale\n console.log('🔍 URL finale construite:', url);\n console.log('🔍 EndpointPath:', endpointPath);\n console.log('🔍 SunuIDConfig endpoints:', JSON.stringify(window.SunuIDConfig?.endpoints));\n \n // Log de sécurité pour la requête\n this.logSecurityEvent('API_REQUEST_START', {\n endpoint: endpointPath,\n url: url,\n dataKeys: Object.keys(sanitizedData),\n secureInit: this.config.secureInit\n });\n \n let retryCount = 0;\n const maxRetries = this.config.maxRetries;\n \n while (retryCount <= maxRetries) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.requestTimeout);\n \n // Headers minimaux (API SunuID n'accepte que les headers essentiels)\n const headers = {\n 'Content-Type': 'application/json'\n };\n\n // Note: En mode sécurisé, les credentials sont dans le body\n // Pas besoin d'ajouter de header spécial pour éviter les problèmes CORS\n // if (this.config.secureInit && this.config.token) {\n // headers['X-Secure-Token'] = this.config.token;\n // }\n \n const response = await fetch(url, {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(sanitizedData),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorData;\n try {\n errorData = JSON.parse(errorText);\n } catch (e) {\n errorData = { message: errorText };\n }\n \n this.logSecurityEvent('API_REQUEST_ERROR', {\n status: response.status,\n statusText: response.statusText,\n error: errorData.message\n });\n \n throw new Error(errorData.message || `Erreur HTTP: ${response.status}`);\n }\n\n const result = await response.json();\n \n this.logSecurityEvent('API_REQUEST_SUCCESS', {\n endpoint: endpointPath,\n responseKeys: Object.keys(result)\n });\n \n return result;\n \n } catch (error) {\n retryCount++;\n \n if (error.name === 'AbortError') {\n this.logSecurityEvent('API_REQUEST_TIMEOUT', { retryCount });\n if (retryCount > maxRetries) {\n throw new Error('Timeout de la requête API');\n }\n continue;\n }\n \n if (retryCount > maxRetries) {\n this.logSecurityEvent('API_REQUEST_MAX_RETRIES', { \n retryCount, \n error: error.message \n });\n throw error;\n }\n \n // Attendre avant de réessayer\n await new Promise(resolve => setTimeout(resolve, 1000 * retryCount));\n }\n }\n }\n\n /**\n * Sanitisation des données de requête\n */\n sanitizeRequestData(data) {\n const sanitized = {};\n \n for (const [key, value] of Object.entries(data)) {\n if (typeof value === 'string') {\n sanitized[key] = this.sanitizeInput(value);\n } else if (typeof value === 'object' && value !== null) {\n sanitized[key] = this.sanitizeRequestData(value);\n } else {\n sanitized[key] = value;\n }\n }\n \n // Ajouter les credentials dans le body (API SunuID les attend ici)\n // Utiliser les vraies valeurs (originales) si disponibles, sinon les valeurs directes\n sanitized.client_id = this.config.originalClientId || this.config.clientId;\n sanitized.secret_id = this.config.originalSecretId || this.config.secretId;\n \n // Debug: Vérifier les credentials\n console.log('🔍 Credentials dans sanitizeRequestData - clientId:', this.config.clientId);\n console.log('🔍 Credentials dans sanitizeRequestData - secretId:', this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null');\n console.log('🔍 Credentials dans sanitizeRequestData - sanitizedClientId:', sanitized.client_id);\n console.log('🔍 Credentials dans sanitizeRequestData - sanitizedSecretId:', sanitized.secret_id ? '***' + sanitized.secret_id.slice(-4) : 'null');\n console.log('🔍 Credentials dans sanitizeRequestData - data complet:', JSON.stringify(sanitized, null, 2));\n \n // Debug: Vérifier les credentials\n console.log('🔍 Credentials dans sanitizeRequestData - clientId:', this.config.clientId);\n console.log('🔍 Credentials dans sanitizeRequestData - secretId:', this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null');\n console.log('🔍 Credentials dans sanitizeRequestData - sanitizedClientId:', sanitized.client_id);\n console.log('🔍 Credentials dans sanitizeRequestData - sanitizedSecretId:', sanitized.secret_id ? '***' + sanitized.secret_id.slice(-4) : 'null');\n console.log('🔍 Credentials dans sanitizeRequestData - data complet:', JSON.stringify(sanitized, null, 2));\n \n return sanitized;\n }\n\n /**\n * Générer un ID de requête unique\n */\n generateRequestId() {\n return 'req_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n }\n\n /**\n * Appliquer le thème\n */\n applyTheme(theme) {\n const container = document.querySelector('.sunuid-qr-code');\n if (container) {\n container.className = `sunuid-qr-code sunuid-theme-${theme}`;\n }\n }\n\n /**\n * Gérer les erreurs\n */\n handleError(error) {\n console.error('SunuID SDK Error:', error);\n \n if (this.config.onError) {\n this.config.onError(error);\n }\n }\n\n /**\n * Obtenir l'URL du QR code généré\n */\n getQRCode() {\n // Retourner l'URL du QR code si disponible\n if (this.currentQRUrl) {\n return this.currentQRUrl;\n }\n \n // Sinon, retourner une URL par défaut ou null\n return null;\n }\n\n /**\n * Nettoyer les ressources\n */\n destroy() {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n }\n \n // Fermer la connexion WebSocket\n if (this.socket) {\n this.socket.disconnect();\n this.socket = null;\n console.log('🌐 WebSocket déconnecté');\n }\n \n this.isInitialized = false;\n this.logSecurityEvent('SDK_DESTROY');\n console.log('SunuID SDK détruit');\n }\n\n /**\n * Obtenir les logs de sécurité\n */\n getSecurityLogs() {\n return window.SunuIDSecurityLogs || [];\n }\n\n /**\n * Nettoyer les logs de sécurité\n */\n clearSecurityLogs() {\n window.SunuIDSecurityLogs = [];\n this.logSecurityEvent('SECURITY_LOGS_CLEARED');\n }\n }\n\n // Exposer la classe globalement\n window.SunuID = SunuID;\n window.sunuidInstance = null;\n\n // Fonction d'initialisation globale\n window.initSunuID = function(config) {\n try {\n window.sunuidInstance = new SunuID(config);\n return window.sunuidInstance;\n } catch (error) {\n console.error('Erreur lors de l\\'initialisation de SunuID:', error);\n throw error;\n }\n };\n\n})(window); "],"names":["window","_window$SunuIDConfig","_window$SunuIDConfig2","_window$SunuIDConfig3","DEFAULT_CONFIG","apiUrl","SunuIDConfig","clientId","secretId","type","partnerName","theme","language","autoRefresh","refreshInterval","onSuccess","onError","onStatusUpdate","onExpired","enableSecurityLogs","validateInputs","maxRetries","requestTimeout","secureInit","secureInitUrl","includes","replace","token","SunuID","config","arguments","length","undefined","_classCallCheck","this","_objectSpread","qrCode","refreshTimer","isInitialized","socket","initPromise","init","key","value","_init","_asyncToGenerator","_regenerator","m","_callee","_t","w","_context","p","n","validateSecurityParams","logSecurityEvent","obfuscateCredentials","console","log","initWebSocket","v","error","message","a","apply","_secureInit","_callee2","initData","response","result","decodedToken","_t2","_context2","fetch","method","headers","Accept","body","JSON","stringify","ok","Error","concat","status","json","success","data","api_url","decodeSecureToken","client_id","secret_id","expiresIn","expires_in","maxRequests","max_requests","requestCount","parts","split","_parts","_slicedToArray","payload","decodedPayload","atob","tokenData","parse","exp","Date","now","_this","io","warn","setTimeout","ip","getClientIP","query","userId","username","on","id","reason","handleQRStatusUpdate","handleQRScanSuccess","handleQRExpired","errors","push","isValidUrl","join","string","url","URL","protocol","_","event","securityLog","timestamp","toISOString","userAgent","navigator","location","href","SunuIDSecurityLogs","originalClientId","originalSecretId","clientIdDisplay","secretIdDisplay","input","trim","connected","emit","_generateQR","_callee3","containerId","options","qrImageUrl","_waitForSocketId","_t3","_this2","_args3","_context3","makeRequest","qrcode","currentQRUrl","displayQRCode","pendingQRInfo","code","waitForSocketId","socketId","qrContent","typeName","getTypeName","qrLabel","generateCustomQRCode","startAutoRefresh","emitWebSocketEvent","serviceId","service_id","qrCodeUrl","sessionId","stack","slice","displayServiceUnavailable","_x","_generateCustomQR","_callee4","_response","_waitForSocketId2","_t4","_this3","_args4","_context4","_x2","_x3","_generateAuthQR","_callee5","_args5","_context5","generateQR","_x4","_generateKYCQR","_callee6","originalType","_args6","_context6","f","_x5","_generateSignatureQR","_callee7","_args7","_context7","_x6","_checkQRStatus","_callee8","_response2","_t5","_context8","handleError","_x7","qrUrl","container","document","getElementById","innerHTML","qrElement","createElement","className","appendChild","applyTheme","_generateCustomQRCode","_callee9","content","label","_qrContainer","qrGeneratorUrl","_response3","responseData","instructionsElement","statusElement","_t6","_context9","qrContainer","displayFallbackImage","size","margin","dataUrl","parentElement","querySelector","style","display","classList","add","generateQRCodeClientSide","_x8","_x9","_this4","QRCode","canvas","width","height","ctx","getContext","fillStyle","fillRect","toCanvas","color","dark","light","font","textAlign","fillText","toDataURL","x","y","logo","Image","onload","logoSize","logoX","logoY","drawImage","src","String","toUpperCase","_refreshQR","_callee0","_t7","_args0","_context0","_x0","_this5","setInterval","_callee1","_t8","_context1","refreshQR","_makeRequest","_callee10","endpoint","_window$SunuIDConfig4","_window$SunuIDConfig5","sanitizedData","endpointPath","retryCount","_loop","_ret","_this6","_context11","sanitizeRequestData","endpoints","dataKeys","Object","keys","controller","timeoutId","_response4","errorText","errorData","_t9","_context10","AbortController","abort","signal","clearTimeout","text","e","statusText","responseKeys","name","Promise","resolve","d","_regeneratorValues","_x1","_x10","sanitized","_i","_Object$entries","entries","_Object$entries$_i","sanitizeInput","_typeof","Math","random","toString","substr","clearInterval","disconnect","sunuidInstance","initSunuID"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sunuid-sdk.min.js","sources":["../src/sunuid-sdk.js"],"sourcesContent":["/**\n * SunuID SDK - Package d'intégration pour partenaires\n * \n * @version 1.0.0\n * @author SunuID Team\n * @license MIT\n */\n\n(function(window) {\n 'use strict';\n\n // Configuration par défaut\n const DEFAULT_CONFIG = {\n apiUrl: window.SunuIDConfig?.apiUrl || 'https://api.sunuid.fayma.sn',\n clientId: null,\n secretId: null,\n type: 2, // Type par défaut (2 = authentification)\n partnerName: null, // Nom du partenaire récupéré depuis l'API\n theme: 'light',\n language: 'fr',\n autoRefresh: false, // Désactivé par défaut pour éviter les appels répétitifs\n refreshInterval: 30000, // 30 secondes\n onSuccess: null,\n onError: null,\n onStatusUpdate: null,\n onExpired: null,\n // Nouvelles options de sécurité\n enableSecurityLogs: true,\n validateInputs: true,\n maxRetries: 3,\n requestTimeout: 10000, // 10 secondes\n // Options d'initialisation sécurisée\n secureInit: false,\n secureInitUrl: (() => {\n if (window.SunuIDConfig?.apiUrl?.includes('api.sunuid.fayma.sn')) {\n return 'https://api.sunuid.fayma.sn/secure-init.php';\n }\n return window.SunuIDConfig?.apiUrl?.replace('/api', '') + '/secure-init.php' || 'https://api.sunuid.fayma.sn/secure-init.php';\n })(),\n token: null,\n // Configuration pour forcer l'utilisation du serveur distant\n forceRemoteServer: true,\n useLocalFallback: false\n };\n\n /**\n * Classe principale SunuID\n */\n class SunuID {\n constructor(config = {}) {\n this.config = { ...DEFAULT_CONFIG, ...config };\n this.qrCode = null;\n this.refreshTimer = null;\n this.isInitialized = false;\n this.socket = null;\n \n // Initialisation asynchrone\n this.initPromise = this.init();\n }\n\n /**\n * Initialisation du SDK\n */\n async init() {\n try {\n // Initialisation sécurisée si activée\n if (this.config.secureInit) {\n await this.secureInit();\n } else {\n // Validation sécurisée des paramètres\n if (this.config.validateInputs) {\n this.validateSecurityParams();\n }\n }\n\n // Log de sécurité pour l'initialisation\n this.logSecurityEvent('SDK_INIT_START', {\n apiUrl: this.config.apiUrl,\n type: this.config.type,\n secureInit: this.config.secureInit\n });\n\n // Récupérer les informations du partenaire depuis l'API\n await this.fetchPartnerInfo();\n\n // Obscurcir les credentials dans les logs\n this.obfuscateCredentials();\n\n this.isInitialized = true;\n console.log('SunuID SDK initialisé avec succès');\n console.log('📋 Configuration SDK:', {\n apiUrl: this.config.apiUrl,\n type: this.config.type,\n partnerName: this.config.partnerName,\n clientId: this.config.clientId ? '***' + this.config.clientId.slice(-4) : 'null',\n secretId: this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null',\n secureInit: this.config.secureInit,\n theme: this.config.theme\n });\n \n this.logSecurityEvent('SDK_INIT_SUCCESS');\n \n // Initialiser la connexion WebSocket\n this.initWebSocket();\n \n } catch (error) {\n this.logSecurityEvent('SDK_INIT_ERROR', { error: error.message });\n throw error;\n }\n }\n\n /**\n * Initialisation sécurisée via PHP\n */\n async secureInit() {\n try {\n this.logSecurityEvent('SECURE_INIT_START');\n \n const initData = {\n type: this.config.type,\n partnerName: this.config.partnerName,\n theme: this.config.theme\n };\n\n const response = await fetch(this.config.secureInitUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json'\n },\n body: JSON.stringify(initData)\n });\n\n if (!response.ok) {\n throw new Error(`Erreur HTTP: ${response.status}`);\n }\n\n const result = await response.json();\n \n console.log('📋 Réponse initialisation sécurisée:', result);\n \n if (!result.success) {\n throw new Error(result.error || 'Erreur lors de l\\'initialisation sécurisée');\n }\n\n // Stocker le token et les données sécurisées\n this.config.token = result.data.token;\n this.config.apiUrl = result.data.api_url;\n \n // Décoder le token pour récupérer les credentials\n const decodedToken = this.decodeSecureToken(result.data.token);\n if (decodedToken) {\n this.config.clientId = decodedToken.client_id;\n this.config.secretId = decodedToken.secret_id;\n } else {\n throw new Error('Impossible de décoder le token sécurisé');\n }\n \n this.config.expiresIn = result.data.expires_in;\n this.config.maxRequests = result.data.max_requests;\n this.config.requestCount = 0;\n\n this.logSecurityEvent('SECURE_INIT_SUCCESS', {\n expiresIn: result.data.expires_in,\n maxRequests: result.data.max_requests\n });\n\n console.log('✅ Initialisation sécurisée réussie');\n \n } catch (error) {\n this.logSecurityEvent('SECURE_INIT_ERROR', { error: error.message });\n throw new Error(`Échec de l'initialisation sécurisée: ${error.message}`);\n }\n }\n\n /**\n * Décoder le token sécurisé\n */\n decodeSecureToken(token) {\n try {\n const parts = token.split('.');\n if (parts.length !== 2) {\n console.error('❌ Format de token invalide');\n return null;\n }\n \n const [payload, signature] = parts;\n \n // Décoder le payload (base64)\n const decodedPayload = atob(payload);\n const tokenData = JSON.parse(decodedPayload);\n \n // Vérifier l'expiration\n if (tokenData.exp && tokenData.exp < Date.now() / 1000) {\n console.error('❌ Token expiré');\n return null;\n }\n \n console.log('✅ Token décodé avec succès');\n return tokenData;\n \n } catch (error) {\n console.error('❌ Erreur décodage token:', error);\n return null;\n }\n }\n\n /**\n * Initialiser la connexion WebSocket\n */\n initWebSocket() {\n try {\n // Vérifier si Socket.IO est disponible\n if (typeof io === 'undefined') {\n console.warn('⚠️ Socket.IO non disponible, WebSocket sera initialisé plus tard');\n // Réessayer après un délai\n setTimeout(() => this.initWebSocket(), 1000);\n return;\n }\n \n // Obtenir l'IP du client (simulation)\n const ip = this.getClientIP();\n \n // Initialiser la connexion WebSocket si elle n'existe pas\n if (!this.socket) {\n console.log('🌐 Initialisation Socket.IO...');\n \n this.socket = io('wss://samasocket.fayma.sn:9443', {\n query: {\n token: this.config.clientId,\n type: 'web',\n userId: this.config.clientId,\n username: ip\n },\n transports: ['websocket', 'polling']\n });\n\n // Gestion des événements WebSocket\n this.socket.on('connect', () => {\n console.log('🌐 WebSocket connecté avec succès');\n console.log('📊 Socket ID:', this.socket.id);\n this.socket.connected = true;\n });\n\n this.socket.on('disconnect', (reason) => {\n console.log('❌ WebSocket déconnecté:', reason);\n this.socket.connected = false;\n });\n\n this.socket.on('connect_error', (error) => {\n console.error('❌ Erreur connexion WebSocket:', error);\n this.socket.connected = false;\n });\n\n // Écouter les événements spécifiques\n this.socket.on('qr_status_update', (data) => {\n console.log('📱 Mise à jour statut QR reçue:', data);\n this.handleQRStatusUpdate(data);\n });\n\n this.socket.on('qr_scan_success', (data) => {\n console.log('✅ Scan QR réussi reçu:', data);\n this.handleQRScanSuccess(data);\n });\n\n this.socket.on('qr_expired', (data) => {\n console.log('⏰ QR expiré reçu:', data);\n this.handleQRExpired(data);\n });\n } else {\n console.log('🌐 WebSocket déjà connecté');\n }\n } catch (error) {\n console.error('❌ Erreur initialisation WebSocket:', error);\n }\n }\n\n /**\n * Obtenir l'IP du client (simulation)\n */\n getClientIP() {\n // Simulation - en production, vous pourriez utiliser un service d'IP\n return '127.0.0.1';\n }\n\n /**\n * Obtenir le nom du type à partir du numéro\n */\n getTypeName(type) {\n switch(type) {\n case 1: return 'KYC';\n case 2: return 'AUTH';\n case 3: return 'SIGNATURE';\n default: return `TYPE-${type}`;\n }\n }\n\n /**\n * Validation sécurisée des paramètres\n */\n validateSecurityParams() {\n const errors = [];\n \n // Validation du clientId\n if (!this.config.clientId || typeof this.config.clientId !== 'string') {\n errors.push('clientId invalide ou manquant');\n } else if (this.config.clientId.length < 10) {\n errors.push('clientId trop court');\n }\n \n // Validation du secretId\n if (!this.config.secretId || typeof this.config.secretId !== 'string') {\n errors.push('secretId invalide ou manquant');\n } else if (this.config.secretId.length < 32) {\n errors.push('secretId trop court (minimum 32 caractères)');\n }\n \n // Validation de l'URL API\n if (!this.config.apiUrl || !this.isValidUrl(this.config.apiUrl)) {\n errors.push('apiUrl invalide');\n }\n \n // Validation du type\n if (![1, 2, 3].includes(this.config.type)) {\n errors.push('type invalide (doit être 1, 2 ou 3)');\n }\n \n if (errors.length > 0) {\n this.logSecurityEvent('VALIDATION_ERROR', { errors });\n throw new Error(`Paramètres de sécurité invalides: ${errors.join(', ')}`);\n }\n \n this.logSecurityEvent('VALIDATION_SUCCESS');\n }\n\n /**\n * Validation d'URL sécurisée\n */\n isValidUrl(string) {\n try {\n const url = new URL(string);\n return url.protocol === 'https:' || url.protocol === 'http:';\n } catch (_) {\n return false;\n }\n }\n\n /**\n * Logs de sécurité\n */\n logSecurityEvent(event, data = {}) {\n if (!this.config.enableSecurityLogs) return;\n \n const securityLog = {\n timestamp: new Date().toISOString(),\n event: event,\n data: data,\n userAgent: navigator.userAgent,\n url: window.location.href\n };\n \n console.warn('🔒 [SECURITY]', securityLog);\n \n // Stocker les logs de sécurité (optionnel)\n if (!window.SunuIDSecurityLogs) {\n window.SunuIDSecurityLogs = [];\n }\n window.SunuIDSecurityLogs.push(securityLog);\n }\n\n /**\n * Chiffrement simple des credentials (pour éviter l'exposition en clair)\n */\n obfuscateCredentials() {\n // Stocker les vraies valeurs pour les logs de sécurité\n this.config.originalClientId = this.config.clientId;\n this.config.originalSecretId = this.config.secretId;\n \n // Créer des versions obfusquées pour l'affichage uniquement\n if (this.config.clientId) {\n this.config.clientIdDisplay = this.config.clientId.replace(/(.{3}).*(.{3})/, '$1***$2');\n }\n if (this.config.secretId) {\n this.config.secretIdDisplay = this.config.secretId.replace(/(.{4}).*(.{4})/, '$1***$2');\n }\n }\n\n /**\n * Validation des entrées utilisateur\n */\n sanitizeInput(input) {\n if (typeof input !== 'string') return input;\n \n // Protection contre les injections XSS basiques\n return input\n .replace(/[<>]/g, '') // Supprimer les balises HTML\n .replace(/javascript:/gi, '') // Supprimer les protocoles dangereux\n .trim();\n }\n\n /**\n * Gérer la mise à jour du statut QR\n */\n handleQRStatusUpdate(data) {\n if (this.config.onStatusUpdate) {\n this.config.onStatusUpdate(data);\n }\n }\n\n /**\n * Gérer le succès du scan QR\n */\n handleQRScanSuccess(data) {\n if (this.config.onSuccess) {\n this.config.onSuccess(data);\n }\n }\n\n /**\n * Gérer l'expiration du QR\n */\n handleQRExpired(data) {\n if (this.config.onExpired) {\n this.config.onExpired(data);\n }\n }\n\n /**\n * Émettre un événement WebSocket\n */\n emitWebSocketEvent(event, data) {\n if (this.socket && this.socket.connected) {\n this.socket.emit(event, data);\n console.log(`📤 Événement WebSocket émis: ${event}`, data);\n } else {\n console.warn('⚠️ WebSocket non connecté, impossible d\\'émettre l\\'événement:', event);\n }\n }\n\n /**\n * Obtenir le statut de la connexion WebSocket\n */\n getWebSocketStatus() {\n if (!this.socket) {\n return 'not_initialized';\n }\n return this.socket.connected ? 'connected' : 'disconnected';\n }\n\n /**\n * Forcer l'initialisation WebSocket (si Socket.IO devient disponible plus tard)\n */\n forceWebSocketInit() {\n if (typeof io !== 'undefined' && !this.socket) {\n console.log('🔄 Forçage de l\\'initialisation WebSocket...');\n this.initWebSocket();\n }\n }\n\n /**\n * Générer un QR code avec le type configuré\n */\n async generateQR(containerId = 'sunuid-qr-container', options = {}) {\n // Attendre l'initialisation si nécessaire\n if (this.initPromise) {\n await this.initPromise;\n this.initPromise = null;\n }\n \n if (!this.isInitialized) {\n throw new Error('SunuID: SDK non initialisé');\n }\n \n console.log('🎯 generateQR appelé avec containerId:', containerId);\n \n // Attendre que les connexions soient prêtes\n console.log('🔍 Attente connexions API et WebSocket...');\n try {\n const connectionStatus = await this.waitForConnections(5000); // 5 secondes max\n console.log('✅ Connexions prêtes:', connectionStatus);\n } catch (connectionError) {\n console.error('❌ Erreur connexions:', connectionError.message);\n throw new Error('Connexions non disponibles - Impossible de générer le QR code');\n }\n\n try {\n // Utiliser uniquement le socketID comme contenu du QR\n const socketId = this.socket ? this.socket.id : 'timeout-socket-id';\n const qrContent = socketId;\n \n console.log('📄 Contenu QR préparé:', qrContent);\n console.log('🔌 Socket ID:', socketId);\n \n // Générer le QR avec le contenu complet\n const partnerName = this.config.partnerName || 'Partner_unknown';\n const response = await this.makeRequest('/qr-generate', {\n type: this.config.type,\n content: qrContent, // Contenu personnalisé pour le QR\n label: `${this.getTypeName(this.config.type)} ${partnerName}`, // Label du QR avec nom du partenaire\n ...options\n });\n\n if (response.success) {\n // Construire l'URL complète du QR code\n let qrImageUrl = response.data.qrCodeUrl;\n \n // Si l'URL est relative, la rendre absolue\n if (qrImageUrl.startsWith('/')) {\n qrImageUrl = `${this.config.apiUrl}${qrImageUrl}`;\n }\n \n this.currentQRUrl = qrImageUrl;\n \n console.log('✅ QR code généré par API principale:', qrImageUrl);\n console.log('📄 Contenu QR final:', qrContent);\n console.log('🏷️ Label QR:', response.data.label);\n console.log('🆔 Session ID:', response.data.sessionId);\n \n // Afficher le QR code\n this.displayQRCode(containerId, qrImageUrl, this.config.type, options);\n \n this.startAutoRefresh(containerId, this.config.type, options);\n \n // Émettre un événement WebSocket pour la génération du QR\n this.emitWebSocketEvent('qr_generated', {\n type: this.config.type,\n qrCodeUrl: qrImageUrl,\n socketId: socketId,\n qrContent: qrContent,\n label: response.data.label,\n sessionId: response.data.sessionId,\n timestamp: Date.now()\n });\n \n return {\n ...response.data,\n qrCodeUrl: qrImageUrl,\n qrContent: qrContent,\n label: response.data.label,\n sessionId: response.data.sessionId\n };\n } else {\n throw new Error(response.message || 'Erreur lors de la génération du QR code');\n }\n } catch (error) {\n console.error('Erreur API détectée:', error.message);\n console.error('Stack trace complet:', error.stack);\n console.error('Configuration SDK:', {\n apiUrl: this.config.apiUrl,\n type: this.config.type,\n secureInit: this.config.secureInit,\n clientId: this.config.clientId ? '***' + this.config.clientId.slice(-4) : 'null',\n secretId: this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null'\n });\n \n // Fallback vers le service local seulement si activé\n if (this.config.useLocalFallback) {\n console.log('🔍 Vérification fallback local...');\n console.log('🔍 Hostname:', window.location.hostname);\n console.log('🔍 Protocol:', window.location.protocol);\n console.log('🔍 URL complète:', window.location.href);\n \n const isLocal = window.location.hostname === 'localhost' || \n window.location.hostname === '127.0.0.1' || \n window.location.protocol === 'file:';\n \n console.log('🔍 Est local:', isLocal);\n \n if (isLocal) {\n console.log('🔄 Tentative fallback vers service QR local...');\n console.log('❌ Fallback local non implémenté - utilisation serveur distant uniquement');\n } else {\n console.log('❌ Pas en local, pas de fallback');\n }\n } else {\n console.log('🔒 Fallback local désactivé, utilisation serveur distant uniquement');\n }\n \n console.log('Affichage du message \"Service non disponible\" pour type ' + this.config.type);\n this.displayServiceUnavailable(containerId, this.config.type);\n throw new Error('Service non disponible');\n }\n }\n\n\n\n /**\n * Générer un QR code avec un type personnalisé\n */\n async generateCustomQR(containerId, type, options = {}) {\n // Attendre l'initialisation si nécessaire\n if (this.initPromise) {\n await this.initPromise;\n this.initPromise = null;\n }\n \n if (!this.isInitialized) {\n throw new Error('SunuID: SDK non initialisé');\n }\n\n try {\n const response = await this.makeRequest('/qr-generate', {\n type: type, // Type personnalisé (1, 2, 3, etc.)\n ...options\n });\n\n if (response.success) {\n // Construire l'URL complète de l'image QR avec la base URL pour les images\n const imageBaseUrl = 'https://sunuid.fayma.sn';\n const qrImageUrl = `${imageBaseUrl}${response.data.qrcode}`;\n this.displayQRCode(containerId, qrImageUrl, type, options);\n \n // Le QR code est déjà généré par l'API principale\n console.log('✅ QR code personnalisé généré par API principale:', qrImageUrl);\n console.log('📄 Code de session:', response.data.code);\n console.log('🆔 Service ID:', response.data.service_id);\n \n this.startAutoRefresh(containerId, type, options);\n return {\n ...response.data,\n qrCodeUrl: qrImageUrl,\n sessionId: response.data.service_id\n };\n } else {\n throw new Error(response.message || 'Erreur lors de la génération du QR code');\n }\n } catch (error) {\n console.error('Erreur API détectée:', error.message);\n console.error('Stack trace complet:', error.stack);\n console.error('Configuration SDK (Custom):', {\n apiUrl: this.config.apiUrl,\n type: type,\n secureInit: this.config.secureInit,\n clientId: this.config.clientId ? '***' + this.config.clientId.slice(-4) : 'null',\n secretId: this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null'\n });\n console.log('Affichage du message \"Service non disponible\" pour type ' + type);\n this.displayServiceUnavailable(containerId, type);\n throw new Error('Service non disponible');\n }\n }\n\n // Alias pour maintenir la compatibilité\n async generateAuthQR(containerId, options = {}) {\n return this.generateQR(containerId, options);\n }\n\n async generateKYCQR(containerId, options = {}) {\n // Sauvegarder le type actuel\n const originalType = this.config.type;\n // Changer temporairement le type pour KYC\n this.config.type = 1;\n try {\n return await this.generateQR(containerId, options);\n } finally {\n // Restaurer le type original\n this.config.type = originalType;\n }\n }\n\n async generateSignatureQR(containerId, options = {}) {\n // Sauvegarder le type actuel\n const originalType = this.config.type;\n // Changer temporairement le type pour Signature\n this.config.type = 3;\n try {\n return await this.generateQR(containerId, options);\n } finally {\n // Restaurer le type original\n this.config.type = originalType;\n }\n }\n\n /**\n * Vérifier le statut d'un QR code\n */\n async checkQRStatus(sessionId) {\n if (!this.isInitialized) {\n throw new Error('SunuID: SDK non initialisé');\n }\n\n try {\n const response = await this.makeRequest('/qr-status', {\n serviceId: sessionId\n });\n\n if (response.success) {\n return response.data;\n } else {\n throw new Error(response.message || 'Erreur lors de la vérification du statut');\n }\n } catch (error) {\n this.handleError(error);\n throw error;\n }\n }\n\n /**\n * Générer un QR code avec un contenu spécifique\n */\n async generateQRWithContent(content, containerId, type, options = {}) {\n console.log('🎨 Génération QR avec contenu:', content);\n \n try {\n // Essayer d'abord le service QR local\n if (window.location.hostname === 'localhost' || \n window.location.hostname === '127.0.0.1' || \n window.location.protocol === 'file:') {\n \n console.log('🏠 Utilisation service QR local...');\n const localQRUrl = await this.generateQRLocal(content, containerId, type, options);\n if (localQRUrl) {\n return localQRUrl;\n }\n }\n \n // Fallback vers le service QR distant\n console.log('🌐 Utilisation service QR distant...');\n return await this.generateQRRemote(content, containerId, type, options);\n \n } catch (error) {\n console.error('❌ Erreur génération QR:', error);\n // Fallback vers affichage simple du contenu\n this.displayQRContent(containerId, content, type, options);\n return null;\n }\n }\n \n /**\n * Générer QR code avec service local\n */\n async generateQRLocal(content, containerId, type, options = {}) {\n try {\n const response = await fetch('http://localhost:8000/api/generate/text', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: `text=${encodeURIComponent(content)}&size=300`\n });\n \n if (response.ok) {\n const data = await response.json();\n const qrUrl = `data:image/png;base64,${data.qrcode}`;\n this.displayQRCode(containerId, qrUrl, type, options);\n return qrUrl;\n }\n } catch (error) {\n console.log('❌ Service QR local non disponible:', error.message);\n }\n return null;\n }\n \n /**\n * Générer QR code avec service distant\n */\n async generateQRRemote(content, containerId, type, options = {}) {\n try {\n const response = await fetch('https://api.sunuid.fayma.sn/qr-generate', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n text: content,\n size: 300,\n type: type\n })\n });\n \n if (response.ok) {\n const data = await response.json();\n const qrUrl = `data:image/png;base64,${data.qrcode}`;\n this.displayQRCode(containerId, qrUrl, type, options);\n return qrUrl;\n }\n } catch (error) {\n console.error('❌ Erreur service QR distant:', error);\n }\n \n // Fallback vers affichage du contenu\n this.displayQRContent(containerId, content, type, options);\n return null;\n }\n \n /**\n * Afficher le contenu QR en texte (fallback)\n */\n displayQRContent(containerId, content, type, options = {}) {\n const container = document.getElementById(containerId);\n if (!container) {\n throw new Error(`Conteneur avec l'ID \"${containerId}\" non trouvé`);\n }\n\n const typeName = this.getTypeName(type);\n container.innerHTML = `\n <div class=\"sunuid-qr-code\">\n <div class=\"sunuid-qr-header\">\n <h3>${typeName}</h3>\n </div>\n <div class=\"sunuid-qr-content\" style=\"text-align: center; padding: 20px; background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 5px; margin: 10px 0;\">\n <p><strong>Contenu QR Code:</strong></p>\n <p style=\"font-family: monospace; font-size: 14px; word-break: break-all;\">${content}</p>\n </div>\n <div class=\"sunuid-qr-instructions\">\n <p>Contenu QR généré avec le format: {type}-{code}-{socketid}</p>\n </div>\n </div>\n `;\n \n console.log('✅ Contenu QR affiché:', content);\n }\n \n /**\n * Afficher un QR code dans un conteneur\n */\n displayQRCode(containerId, qrUrl, type, options = {}) {\n const container = document.getElementById(containerId);\n if (!container) {\n throw new Error(`Conteneur avec l'ID \"${containerId}\" non trouvé`);\n }\n\n // Nettoyer le conteneur\n container.innerHTML = '';\n\n // Créer l'élément QR code\n const qrElement = document.createElement('div');\n qrElement.className = 'sunuid-qr-code';\n \n // Afficher l'image QR avec les informations\n const typeName = this.getTypeName(type);\n qrElement.innerHTML = `\n <div class=\"sunuid-qr-header\">\n <h3>${type === 1 ? 'Vérification KYC' : type === 2 ? 'Authentification' : type === 3 ? 'Signature' : 'Service Type ' + type}</h3>\n </div>\n <div class=\"sunuid-qr-image\">\n <img src=\"${qrUrl}\" alt=\"QR Code ${typeName}\" style=\"max-width: 300px; border: 1px solid #ddd; border-radius: 5px;\" />\n </div>\n \n `;\n\n container.appendChild(qrElement);\n\n // Appliquer le thème\n this.applyTheme(options.theme || this.config.theme);\n \n console.log('✅ QR code affiché:', qrUrl);\n }\n\n /**\n * Générer un QR code personnalisé avec PHP Endroid\n */\n async generateCustomQRCode(content, label, options = {}) {\n console.log('🎨 Début génération QR personnalisé...');\n console.log('📄 Contenu:', content);\n console.log('🏷️ Label:', label);\n \n // Chercher le conteneur QR\n let qrContainer = document.getElementById('sunuid-qr-container');\n if (!qrContainer) {\n qrContainer = document.getElementById('qr-container');\n }\n if (!qrContainer) {\n console.error('❌ QR container not found');\n return;\n }\n \n console.log('✅ QR container trouvé');\n\n // Nettoyer le conteneur\n qrContainer.innerHTML = '<div style=\"text-align: center; padding: 20px;\"><p>Génération QR code...</p></div>';\n\n try {\n // Utiliser directement l'API principale (plus fiable)\n console.log('🎨 Tentative génération via API principale...');\n await this.generateQRPHP(content, label, qrContainer);\n console.log('✅ QR code généré avec succès');\n \n } catch (error) {\n console.error('❌ Erreur génération API:', error);\n \n // Fallback final : image par défaut\n console.log('⚠️ Affichage image par défaut');\n this.displayDefaultQR(qrContainer, content, label);\n }\n }\n\n /**\n * Générer un QR code côté client (méthode principale)\n */\n async generateQRClientSide(content, label, qrContainer) {\n // Charger QRCode si nécessaire\n await this.ensureQRCodeLibrary();\n \n if (typeof QRCode === 'undefined') {\n throw new Error('QRCode library non disponible');\n }\n \n // Créer un canvas\n const canvas = document.createElement('canvas');\n canvas.width = 300;\n canvas.height = 320;\n const ctx = canvas.getContext('2d');\n \n // Fond blanc\n ctx.fillStyle = '#FFFFFF';\n ctx.fillRect(0, 0, 300, 320);\n \n // Générer le QR code\n return new Promise((resolve, reject) => {\n QRCode.toCanvas(canvas, content, {\n width: 280,\n margin: 10,\n color: {\n dark: '#000000',\n light: '#FFFFFF'\n }\n }, (error) => {\n if (error) {\n reject(error);\n return;\n }\n \n // Ajouter le label\n ctx.fillStyle = '#333333';\n ctx.font = 'bold 14px Arial';\n ctx.textAlign = 'center';\n ctx.fillText(label, 150, 305);\n \n // Convertir en data URL\n const dataUrl = canvas.toDataURL('image/png');\n \n // Stocker l'URL\n this.currentQRUrl = dataUrl;\n \n // Afficher le QR code\n qrContainer.innerHTML = `\n <div style=\"text-align: center; padding: 20px;\">\n <img src=\"${dataUrl}\" alt=\"QR Code\" style=\"max-width: 300px; border: 2px solid #ddd; border-radius: 10px;\">\n </div>\n `;\n \n // Afficher les instructions\n this.showQRInstructions(qrContainer);\n \n resolve();\n });\n });\n }\n\n /**\n * Générer un QR code via endpoint PHP (fallback)\n */\n async generateQRPHP(content, label, qrContainer) {\n // Construire l'URL - Utiliser l'API principale qui fonctionne\n let qrGeneratorUrl;\n if (this.config.forceRemoteServer) {\n qrGeneratorUrl = 'https://api.sunuid.fayma.sn/qr-generate';\n } else if (this.config.apiUrl.includes('api.sunuid.fayma.sn')) {\n qrGeneratorUrl = 'https://api.sunuid.fayma.sn/qr-generate';\n } else if (this.config.apiUrl.includes('localhost') || this.config.apiUrl.includes('127.0.0.1')) {\n qrGeneratorUrl = 'http://localhost:8000/api/generate/text';\n } else {\n qrGeneratorUrl = this.config.apiUrl + '/qr-generate';\n }\n \n console.log('🔗 URL QR Generator:', qrGeneratorUrl);\n \n // Adapter le format selon l'URL\n let requestBody;\n let contentType;\n \n if (qrGeneratorUrl.includes('localhost:8000')) {\n // Service local - format form-data\n contentType = 'application/x-www-form-urlencoded';\n requestBody = new URLSearchParams({\n text: content,\n size: 300,\n margin: 10,\n foreground_color: '000000',\n background_color: 'FFFFFF'\n });\n } else {\n // Service distant - format JSON avec les paramètres de l'API principale\n contentType = 'application/json';\n requestBody = JSON.stringify({\n type: this.config.type,\n client_id: this.config.clientId,\n secret_id: this.config.secretId,\n content: content,\n label: label\n });\n }\n \n const response = await fetch(qrGeneratorUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': contentType,\n 'Accept': 'application/json'\n },\n body: requestBody\n });\n \n if (!response.ok) {\n throw new Error(`Erreur HTTP: ${response.status}`);\n }\n \n const responseData = await response.json();\n \n if (!responseData.success) {\n throw new Error(`Erreur QR: ${responseData.error}`);\n }\n \n // Adapter selon le format de réponse\n let qrImageUrl;\n if (qrGeneratorUrl.includes('localhost:8000')) {\n // Service local\n qrImageUrl = responseData.data_uri;\n } else {\n // Service distant - utiliser le format de l'API principale\n const imageBaseUrl = 'https://sunuid.fayma.sn';\n qrImageUrl = `${imageBaseUrl}${responseData.data.qrcode}`;\n }\n \n // Stocker l'URL\n this.currentQRUrl = qrImageUrl;\n \n // Afficher le QR code\n qrContainer.innerHTML = `\n <div style=\"text-align: center; padding: 20px;\">\n <img src=\"${qrImageUrl}\" alt=\"QR Code\" style=\"max-width: 300px; border: 2px solid #ddd; border-radius: 10px;\">\n </div>\n `;\n \n // Afficher les instructions\n this.showQRInstructions(qrContainer);\n }\n\n /**\n * Afficher une image QR par défaut (fallback final)\n */\n displayDefaultQR(qrContainer, content, label) {\n qrContainer.innerHTML = `\n <div style=\"text-align: center; padding: 20px; color: #666;\">\n <div style=\"width: 300px; height: 300px; background: #f0f0f0; border: 2px solid #ddd; border-radius: 10px; display: flex; align-items: center; justify-content: center; margin: 0 auto;\">\n <div>\n <p style=\"font-size: 24px; margin: 0;\">📱</p>\n <p style=\"font-size: 14px; margin: 10px 0 0 0;\">QR Code</p>\n </div>\n </div>\n <p style=\"margin-top: 10px; font-size: 12px;\">${label}</p>\n <p style=\"font-size: 10px; color: #999; margin-top: 5px;\">Contenu: ${content}</p>\n </div>\n `;\n }\n\n /**\n * S'assurer que la bibliothèque QRCode est disponible\n */\n async ensureQRCodeLibrary() {\n if (typeof QRCode !== 'undefined') {\n console.log('✅ QRCode library déjà disponible');\n return true;\n }\n \n console.log('📦 Chargement QRCode library...');\n \n return new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = 'https://cdn.jsdelivr.net/npm/qrcode@1.5.3/lib/browser.min.js';\n script.onload = () => {\n setTimeout(() => {\n if (typeof QRCode !== 'undefined') {\n console.log('✅ QRCode library chargée');\n resolve(true);\n } else {\n console.error('❌ QRCode non disponible après chargement');\n reject(new Error('QRCode library non disponible après chargement'));\n }\n }, 200);\n };\n script.onerror = () => {\n console.error('❌ Erreur chargement QRCode library');\n reject(new Error('Erreur chargement QRCode library'));\n };\n document.head.appendChild(script);\n });\n }\n\n /**\n * Afficher les instructions pour le QR code\n */\n showQRInstructions(qrContainer) {\n const instructionsElement = qrContainer.parentElement.querySelector('.sunuid-qr-instructions');\n const statusElement = qrContainer.parentElement.querySelector('.sunuid-qr-status');\n \n if (instructionsElement) {\n instructionsElement.style.display = 'block';\n instructionsElement.classList.add('sunuid-qr-ready');\n }\n if (statusElement) {\n statusElement.style.display = 'block';\n statusElement.classList.add('sunuid-qr-ready');\n }\n }\n\n /**\n * Ajouter le logo au centre du QR code\n */\n addLogoToCenter(ctx, x, y, width, height) {\n try {\n // Créer une image pour le logo\n const logo = new Image();\n logo.onload = () => {\n const logoSize = 40;\n const logoX = x + (width - logoSize) / 2;\n const logoY = y + (width - logoSize) / 2;\n\n // Dessiner un fond blanc pour le logo\n ctx.fillStyle = 'white';\n ctx.fillRect(logoX - 2, logoY - 2, logoSize + 4, logoSize + 4);\n\n // Dessiner le logo\n ctx.drawImage(logo, logoX, logoY, logoSize, logoSize);\n };\n logo.src = 'src/logoqr.png';\n } catch (error) {\n console.warn('Logo non disponible:', error);\n }\n }\n\n /**\n * Afficher l'image de fallback\n */\n displayFallbackImage() {\n console.log('⚠️ Affichage de l\\'image de fallback');\n const qrContainer = document.getElementById('sunuid-qr-container');\n if (qrContainer) {\n qrContainer.innerHTML = `\n <div style=\"text-align: center; padding: 20px; color: #666;\">\n <p>⚠️ Génération QR personnalisé non disponible</p>\n <p>Utilisation de l'image par défaut</p>\n <p><strong>Debug:</strong> QRCode disponible: ${typeof QRCode !== 'undefined'}</p>\n <p><strong>Debug:</strong> Container trouvé: ${qrContainer !== null}</p>\n </div>\n `;\n }\n }\n\n /**\n * Afficher \"Service non disponible\"\n */\n displayServiceUnavailable(containerId, type) {\n console.log(`displayServiceUnavailable appelée pour ${containerId}, type: ${type}`);\n const container = document.getElementById(containerId);\n if (!container) {\n console.error(`Container ${containerId} non trouvé`);\n return;\n }\n\n container.innerHTML = `\n <div class=\"sunuid-service-unavailable\" style=\"\n text-align: center;\n padding: 40px 20px;\n background: #f8f9fa;\n border: 2px dashed #dee2e6;\n border-radius: 10px;\n color: #6c757d;\n font-family: Arial, sans-serif;\n \">\n <div style=\"font-size: 48px; margin-bottom: 20px;\">⚠️</div>\n <h3 style=\"margin: 0 0 10px 0; color: #495057;\">Service Non Disponible</h3>\n <p style=\"margin: 0; font-size: 14px;\">\n Le service d'authentification est temporairement indisponible.<br>\n Veuillez réessayer plus tard.\n </p>\n <div style=\"margin-top: 20px; font-size: 12px; color: #adb5bd;\">\n Type: ${String(type).toUpperCase()}\n </div>\n </div>\n `;\n }\n\n /**\n * Rafraîchir un QR code\n */\n async refreshQR(containerId, options = {}) {\n try {\n // Vérifier si on a déjà un QR code généré\n if (this.currentQRUrl) {\n console.log('🔄 Vérification du statut du QR code existant...');\n \n // Option 1: Vérifier le statut du QR code via l'API\n // (à implémenter si l'API le supporte)\n \n // Option 2: Régénérer le QR code seulement si nécessaire\n // Pour l'instant, on régénère pour s'assurer qu'il est à jour\n const result = await this.generateQR(containerId, options);\n return result;\n } else {\n console.log('🔄 Pas de QR code existant, génération d\\'un nouveau...');\n const result = await this.generateQR(containerId, options);\n return result;\n }\n } catch (error) {\n console.error('Erreur lors du rafraîchissement:', error.message);\n this.displayServiceUnavailable(containerId, this.config.type);\n throw error;\n }\n }\n\n /**\n * Démarrer le rafraîchissement automatique\n */\n startAutoRefresh(containerId, type, options) {\n if (!this.config.autoRefresh) return;\n\n // Arrêter le timer existant s'il y en a un\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n console.log('🔄 Timer de rafraîchissement précédent arrêté');\n }\n\n this.refreshTimer = setInterval(async () => {\n try {\n console.log('🔄 Rafraîchissement automatique du QR code...');\n await this.refreshQR(containerId, type, options);\n } catch (error) {\n console.warn('Erreur lors du rafraîchissement automatique:', error);\n }\n }, this.config.refreshInterval);\n \n console.log(`🔄 Timer de rafraîchissement démarré (${this.config.refreshInterval}ms)`);\n }\n\n /**\n * Démarrer le timer de compte à rebours\n */\n\n\n /**\n * Effectuer une requête API sécurisée\n */\n async makeRequest(endpoint, data) {\n // Validation de sécurité\n if (!this.isInitialized) {\n this.logSecurityEvent('REQUEST_BEFORE_INIT', { endpoint });\n throw new Error('SDK non initialisé');\n }\n\n // Vérifier les limites de requêtes pour l'initialisation sécurisée\n if (this.config.secureInit) {\n this.config.requestCount++;\n if (this.config.requestCount > this.config.maxRequests) {\n this.logSecurityEvent('API_REQUEST_LIMIT_EXCEEDED', { \n requestCount: this.config.requestCount,\n maxRequests: this.config.maxRequests \n });\n throw new Error('Limite de requêtes dépassée');\n }\n }\n\n // Sanitisation des données\n const sanitizedData = this.sanitizeRequestData(data);\n \n // Debug: Afficher les données envoyées\n console.log('🔍 Debug makeRequest - endpoint:', endpoint);\n console.log('🔍 Debug makeRequest - apiUrl:', this.config.apiUrl);\n console.log('🔍 Debug makeRequest - url:', `${this.config.apiUrl}${endpoint}`);\n console.log('🔍 Debug makeRequest - data:', JSON.stringify(sanitizedData, null, 2));\n console.log('🔍 Debug makeRequest - secureInit:', this.config.secureInit);\n console.log('🔍 Debug makeRequest - isInitialized:', this.isInitialized);\n \n // Utiliser l'endpoint depuis la configuration si disponible\n const endpointPath = window.SunuIDConfig?.endpoints?.[endpoint.replace('/', '')] || endpoint;\n const url = `${this.config.apiUrl}${endpointPath}`;\n \n // Debug: Afficher l'URL finale\n console.log('🔍 URL finale construite:', url);\n console.log('🔍 EndpointPath:', endpointPath);\n console.log('🔍 SunuIDConfig endpoints:', JSON.stringify(window.SunuIDConfig?.endpoints));\n \n // Log de sécurité pour la requête\n this.logSecurityEvent('API_REQUEST_START', {\n endpoint: endpointPath,\n url: url,\n dataKeys: Object.keys(sanitizedData),\n secureInit: this.config.secureInit\n });\n \n let retryCount = 0;\n const maxRetries = this.config.maxRetries;\n \n while (retryCount <= maxRetries) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.config.requestTimeout);\n \n // Headers minimaux (API SunuID n'accepte que les headers essentiels)\n const headers = {\n 'Content-Type': 'application/json'\n };\n\n // Note: En mode sécurisé, les credentials sont dans le body\n // Pas besoin d'ajouter de header spécial pour éviter les problèmes CORS\n // if (this.config.secureInit && this.config.token) {\n // headers['X-Secure-Token'] = this.config.token;\n // }\n \n const response = await fetch(url, {\n method: 'POST',\n headers: headers,\n body: JSON.stringify(sanitizedData),\n signal: controller.signal\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorData;\n try {\n errorData = JSON.parse(errorText);\n } catch (e) {\n errorData = { message: errorText };\n }\n \n this.logSecurityEvent('API_REQUEST_ERROR', {\n status: response.status,\n statusText: response.statusText,\n error: errorData.message\n });\n \n throw new Error(errorData.message || `Erreur HTTP: ${response.status}`);\n }\n\n const result = await response.json();\n \n this.logSecurityEvent('API_REQUEST_SUCCESS', {\n endpoint: endpointPath,\n responseKeys: Object.keys(result)\n });\n \n return result;\n \n } catch (error) {\n retryCount++;\n \n if (error.name === 'AbortError') {\n this.logSecurityEvent('API_REQUEST_TIMEOUT', { retryCount });\n if (retryCount > maxRetries) {\n throw new Error('Timeout de la requête API');\n }\n continue;\n }\n \n if (retryCount > maxRetries) {\n this.logSecurityEvent('API_REQUEST_MAX_RETRIES', { \n retryCount, \n error: error.message \n });\n throw error;\n }\n \n // Attendre avant de réessayer\n await new Promise(resolve => setTimeout(resolve, 1000 * retryCount));\n }\n }\n }\n\n /**\n * Sanitisation des données de requête\n */\n sanitizeRequestData(data) {\n const sanitized = {};\n \n for (const [key, value] of Object.entries(data)) {\n if (typeof value === 'string') {\n sanitized[key] = this.sanitizeInput(value);\n } else if (typeof value === 'object' && value !== null) {\n sanitized[key] = this.sanitizeRequestData(value);\n } else {\n sanitized[key] = value;\n }\n }\n \n // Ajouter les credentials dans le body (API SunuID les attend ici)\n // Utiliser les vraies valeurs (originales) si disponibles, sinon les valeurs directes\n sanitized.client_id = this.config.originalClientId || this.config.clientId;\n sanitized.secret_id = this.config.originalSecretId || this.config.secretId;\n \n // Debug: Vérifier les credentials\n console.log('🔍 Credentials dans sanitizeRequestData - clientId:', this.config.clientId);\n console.log('🔍 Credentials dans sanitizeRequestData - secretId:', this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null');\n console.log('🔍 Credentials dans sanitizeRequestData - sanitizedClientId:', sanitized.client_id);\n console.log('🔍 Credentials dans sanitizeRequestData - sanitizedSecretId:', sanitized.secret_id ? '***' + sanitized.secret_id.slice(-4) : 'null');\n console.log('🔍 Credentials dans sanitizeRequestData - data complet:', JSON.stringify(sanitized, null, 2));\n \n // Debug: Vérifier les credentials\n console.log('🔍 Credentials dans sanitizeRequestData - clientId:', this.config.clientId);\n console.log('🔍 Credentials dans sanitizeRequestData - secretId:', this.config.secretId ? '***' + this.config.secretId.slice(-4) : 'null');\n console.log('🔍 Credentials dans sanitizeRequestData - sanitizedClientId:', sanitized.client_id);\n console.log('🔍 Credentials dans sanitizeRequestData - sanitizedSecretId:', sanitized.secret_id ? '***' + sanitized.secret_id.slice(-4) : 'null');\n console.log('🔍 Credentials dans sanitizeRequestData - data complet:', JSON.stringify(sanitized, null, 2));\n \n return sanitized;\n }\n\n /**\n * Générer un ID de requête unique\n */\n generateRequestId() {\n return 'req_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);\n }\n\n /**\n * Générer un code de session unique\n */\n generateSessionCode() {\n const timestamp = Date.now();\n const random = Math.random().toString(36).substr(2, 9);\n const code = `${timestamp}_${random}`;\n return btoa(code); // Encoder en base64\n }\n\n /**\n * Récupérer les informations du partenaire depuis l'API\n */\n async fetchPartnerInfo() {\n try {\n const response = await this.makeRequest('/debug', {\n type: this.config.type,\n client_id: this.config.clientId,\n secret_id: this.config.secretId\n });\n\n console.log('📋 Réponse debug API:', response);\n\n if (response.success && response.authentication && response.authentication.auth_test) {\n const authTest = response.authentication.auth_test;\n this.config.partnerId = authTest.partner_id;\n \n // Récupérer le service_id depuis la réponse\n if (response.service_id) {\n this.config.serviceId = response.service_id;\n } else {\n // Fallback: utiliser le partner_id comme service_id\n this.config.serviceId = authTest.partner_id;\n }\n \n // Utiliser le partner_id pour déterminer le nom du partenaire\n // Pour l'instant, on utilise une logique simple basée sur l'ID\n if (authTest.partner_id === 21) {\n this.config.partnerName = 'Fayma';\n } else {\n this.config.partnerName = `Partner_${authTest.partner_id}`;\n }\n \n console.log('✅ Informations partenaire récupérées:', {\n partnerName: this.config.partnerName,\n partnerId: this.config.partnerId,\n serviceId: this.config.serviceId\n });\n } else {\n console.warn('⚠️ Impossible de récupérer les informations du partenaire, utilisation du partner_id');\n this.config.partnerName = `Partner_${this.config.partnerId || 'unknown'}`;\n }\n } catch (error) {\n console.warn('⚠️ Erreur lors de la récupération des informations du partenaire:', error.message);\n this.config.partnerName = 'Partner_unknown';\n }\n }\n\n /**\n * Appliquer le thème\n */\n applyTheme(theme) {\n const container = document.querySelector('.sunuid-qr-code');\n if (container) {\n container.className = `sunuid-qr-code sunuid-theme-${theme}`;\n }\n }\n\n /**\n * Gérer les erreurs\n */\n handleError(error) {\n console.error('SunuID SDK Error:', error);\n \n if (this.config.onError) {\n this.config.onError(error);\n }\n }\n\n /**\n * Vérifier le statut des connexions\n */\n async checkConnections() {\n const status = {\n api: false,\n websocket: false,\n ready: false\n };\n \n // Vérifier l'API en utilisant l'endpoint debug\n try {\n const testResponse = await fetch(this.config.apiUrl + '/debug', {\n method: 'GET',\n timeout: 3000\n });\n \n if (testResponse.ok) {\n const debugData = await testResponse.json();\n status.api = debugData.status === 'operational';\n console.log('🔍 API Status:', debugData.status);\n } else {\n status.api = false;\n }\n } catch (error) {\n console.log('🔍 Test API échoué:', error.message);\n status.api = false;\n }\n \n // Vérifier le WebSocket\n status.websocket = this.socket && this.socket.connected;\n \n // Connexions prêtes si API est accessible\n status.ready = status.api;\n \n return status;\n }\n \n /**\n * Attendre que les connexions soient prêtes\n */\n async waitForConnections(timeout = 5000) {\n const startTime = Date.now();\n \n while (Date.now() - startTime < timeout) {\n const status = await this.checkConnections();\n \n if (status.ready) {\n console.log('✅ Connexions prêtes');\n return status;\n }\n \n console.log('⏳ Attente connexions...', status);\n await new Promise(resolve => setTimeout(resolve, 1000)); // Vérification toutes les secondes\n }\n \n throw new Error('Timeout connexions - Impossible de générer le QR code');\n }\n \n /**\n * Obtenir l'URL du QR code généré\n */\n getQRCode() {\n // Retourner l'URL du QR code si disponible\n if (this.currentQRUrl) {\n return this.currentQRUrl;\n }\n \n // Sinon, retourner une URL par défaut ou null\n return null;\n }\n\n /**\n * Nettoyer les ressources\n */\n destroy() {\n this.stopAutoRefresh();\n \n // Fermer la connexion WebSocket\n if (this.socket) {\n this.socket.disconnect();\n this.socket = null;\n console.log('🌐 WebSocket déconnecté');\n }\n \n this.isInitialized = false;\n this.logSecurityEvent('SDK_DESTROY');\n console.log('SunuID SDK détruit');\n }\n\n /**\n * Arrêter le rafraîchissement automatique\n */\n stopAutoRefresh() {\n if (this.refreshTimer) {\n clearInterval(this.refreshTimer);\n this.refreshTimer = null;\n console.log('🔄 Timer de rafraîchissement arrêté');\n }\n }\n\n /**\n * Obtenir les logs de sécurité\n */\n getSecurityLogs() {\n return window.SunuIDSecurityLogs || [];\n }\n\n /**\n * Nettoyer les logs de sécurité\n */\n clearSecurityLogs() {\n window.SunuIDSecurityLogs = [];\n this.logSecurityEvent('SECURITY_LOGS_CLEARED');\n }\n }\n\n // Exposer la classe globalement\n window.SunuID = SunuID;\n window.sunuidInstance = null;\n\n // Fonction d'initialisation globale\n window.initSunuID = function(config) {\n try {\n window.sunuidInstance = new SunuID(config);\n return window.sunuidInstance;\n } catch (error) {\n console.error('Erreur lors de l\\'initialisation de SunuID:', error);\n throw error;\n }\n };\n\n})(window); "],"names":["window","_window$SunuIDConfig","_window$SunuIDConfig2","_window$SunuIDConfig3","DEFAULT_CONFIG","apiUrl","SunuIDConfig","clientId","secretId","type","partnerName","theme","language","autoRefresh","refreshInterval","onSuccess","onError","onStatusUpdate","onExpired","enableSecurityLogs","validateInputs","maxRetries","requestTimeout","secureInit","secureInitUrl","includes","replace","token","forceRemoteServer","useLocalFallback","SunuID","config","arguments","length","undefined","_classCallCheck","this","_objectSpread","qrCode","refreshTimer","isInitialized","socket","initPromise","init","key","value","_init","_asyncToGenerator","_regenerator","m","_callee","_t","w","_context","p","n","validateSecurityParams","logSecurityEvent","fetchPartnerInfo","obfuscateCredentials","console","log","slice","initWebSocket","v","error","message","a","apply","_secureInit","_callee2","initData","response","result","decodedToken","_t2","_context2","fetch","method","headers","Accept","body","JSON","stringify","ok","Error","concat","status","json","success","data","api_url","decodeSecureToken","client_id","secret_id","expiresIn","expires_in","maxRequests","max_requests","requestCount","parts","split","_parts","_slicedToArray","payload","decodedPayload","atob","tokenData","parse","exp","Date","now","_this","io","warn","setTimeout","ip","getClientIP","query","userId","username","transports","on","id","connected","reason","handleQRStatusUpdate","handleQRScanSuccess","handleQRExpired","errors","push","isValidUrl","join","string","url","URL","protocol","_","event","securityLog","timestamp","toISOString","userAgent","navigator","location","href","SunuIDSecurityLogs","originalClientId","originalSecretId","clientIdDisplay","secretIdDisplay","input","trim","emit","_generateQR","_callee3","containerId","options","connectionStatus","socketId","qrContent","qrImageUrl","isLocal","_t3","_t4","_args3","_context3","waitForConnections","makeRequest","content","label","getTypeName","qrCodeUrl","startsWith","currentQRUrl","sessionId","displayQRCode","startAutoRefresh","emitWebSocketEvent","stack","hostname","displayServiceUnavailable","_generateCustomQR","_callee4","_t5","_args4","_context4","qrcode","code","service_id","_x","_x2","_generateAuthQR","_callee5","_args5","_context5","generateQR","_x3","_generateKYCQR","_callee6","originalType","_args6","_context6","f","_x4","_generateSignatureQR","_callee7","_args7","_context7","_x5","_checkQRStatus","_callee8","_t6","_context8","serviceId","handleError","_x6","_generateQRWithContent","_callee9","localQRUrl","_t7","_args9","_context9","generateQRLocal","generateQRRemote","displayQRContent","_x7","_x8","_x9","_generateQRLocal","_callee0","qrUrl","_t8","_args0","_context0","encodeURIComponent","_x0","_x1","_x10","_generateQRRemote","_callee1","_t9","_args1","_context1","text","size","_x11","_x12","_x13","container","document","getElementById","typeName","innerHTML","qrElement","createElement","className","appendChild","applyTheme","_generateCustomQRCode","_callee10","qrContainer","_t0","_context10","generateQRPHP","displayDefaultQR","_x14","_x15","_generateQRClientSide","_callee11","canvas","ctx","_this2","_context11","ensureQRCodeLibrary","QRCode","width","height","getContext","fillStyle","fillRect","Promise","resolve","reject","toCanvas","margin","color","dark","light","font","textAlign","fillText","dataUrl","toDataURL","showQRInstructions","_x16","_x17","_x18","_generateQRPHP","_callee12","qrGeneratorUrl","requestBody","contentType","responseData","_context12","URLSearchParams","foreground_color","background_color","data_uri","_x19","_x20","_x21","_ensureQRCodeLibrary","_callee13","_context13","script","src","onload","onerror","head","instructionsElement","parentElement","querySelector","statusElement","style","display","classList","add","x","y","logo","Image","logoSize","logoX","logoY","drawImage","String","toUpperCase","_refreshQR","_callee14","_result","_t1","_args14","_context14","_x22","_this3","clearInterval","setInterval","_callee15","_t10","_context15","refreshQR","_makeRequest","_callee16","endpoint","_window$SunuIDConfig4","_window$SunuIDConfig5","sanitizedData","endpointPath","retryCount","_loop","_ret","_this4","_context17","sanitizeRequestData","endpoints","dataKeys","Object","keys","controller","timeoutId","errorText","errorData","_t11","_context16","AbortController","abort","signal","clearTimeout","e","statusText","responseKeys","name","d","_regeneratorValues","_x23","_x24","sanitized","_i","_Object$entries","entries","_Object$entries$_i","sanitizeInput","_typeof","Math","random","toString","substr","btoa","_fetchPartnerInfo","_callee17","authTest","_t12","_context18","authentication","auth_test","partnerId","partner_id","_checkConnections","_callee18","testResponse","debugData","_t13","_context19","api","websocket","ready","timeout","_waitForConnections","_callee19","startTime","_args20","_context20","checkConnections","stopAutoRefresh","disconnect","sunuidInstance","initSunuID"],"mappings":";;;;;;;;;quBAQA,SAAUA,EAAMC,GAIZ,IAqBoBC,EAAAC,EArBdC,EAAiB,CACnBC,QAA2BJ,QAAnBA,EAAAD,EAAOM,oBAAPL,IAAmBA,OAAnBA,EAAAA,EAAqBI,SAAU,8BACvCE,SAAU,KACVC,SAAU,KACVC,KAAM,EACNC,YAAa,KACbC,MAAO,QACPC,SAAU,KACVC,aAAa,EACbC,gBAAiB,IACjBC,UAAW,KACXC,QAAS,KACTC,eAAgB,KAChBC,UAAW,KAEXC,oBAAoB,EACpBC,gBAAgB,EAChBC,WAAY,EACZC,eAAgB,IAEhBC,YAAY,EACZC,cAC2BtB,QAAvBA,EAAIF,EAAOM,oBAAYJ,IAAAA,GAAQ,QAARA,EAAnBA,EAAqBG,cAArBH,IAA2BA,GAA3BA,EAA6BuB,SAAS,uBAC/B,+CAEetB,QAAnBA,EAAAH,EAAOM,oBAAYH,IAAAA,GAAQA,QAARA,EAAnBA,EAAqBE,cAArBF,IAA2BA,OAA3BA,EAAAA,EAA6BuB,QAAQ,OAAQ,KAAM,oBAAsB,8CAEpFC,MAAO,KAEPC,mBAAmB,EACnBC,kBAAkB,GAMhBC,EAAM,WAYR,SAXA,SAAAA,IAAyB,IAAbC,EAAMC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,+FAAEG,MAAAL,GACnBM,KAAKL,OAAMM,EAAAA,EAAQjC,CAAAA,EAAAA,GAAmB2B,GACtCK,KAAKE,OAAS,KACdF,KAAKG,aAAe,KACpBH,KAAKI,eAAgB,EACrBJ,KAAKK,OAAS,KAGdL,KAAKM,YAAcN,KAAKO,MAC5B,IAEA,CAAA,CAAAC,IAAA,OAAAC,OAAAC,EAAAC,EAAAC,IAAAC,EAGA,SAAAC,IAAA,IAAAC,EAAA,OAAAH,IAAAI,EAAA,SAAAC,GAAA,cAAAA,EAAAC,EAAAD,EAAAE,GAAA,KAAA,EAAA,GAAAF,EAAAC,EAAA,GAGYlB,KAAKL,OAAOR,WAAU,CAAA8B,EAAAE,EAAA,EAAA,KAAA,CAAA,OAAAF,EAAAE,EAAA,EAChBnB,KAAKb,aAAY,KAAA,EAAA8B,EAAAE,EAAA,EAAA,MAAA,KAAA,EAGnBnB,KAAKL,OAAOX,gBACZgB,KAAKoB,yBACR,KAAA,EAUL,OANApB,KAAKqB,iBAAiB,iBAAkB,CACpCpD,OAAQ+B,KAAKL,OAAO1B,OACpBI,KAAM2B,KAAKL,OAAOtB,KAClBc,WAAYa,KAAKL,OAAOR,aAG5B8B,EAAAE,EAAA,EACMnB,KAAKsB,mBAAkB,KAAA,EAG7BtB,KAAKuB,uBAELvB,KAAKI,eAAgB,EACrBoB,QAAQC,IAAI,qCACZD,QAAQC,IAAI,wBAAyB,CACjCxD,OAAQ+B,KAAKL,OAAO1B,OACpBI,KAAM2B,KAAKL,OAAOtB,KAClBC,YAAa0B,KAAKL,OAAOrB,YACzBH,SAAU6B,KAAKL,OAAOxB,SAAW,MAAQ6B,KAAKL,OAAOxB,SAASuD,OAAO,GAAK,OAC1EtD,SAAU4B,KAAKL,OAAOvB,SAAW,MAAQ4B,KAAKL,OAAOvB,SAASsD,OAAO,GAAK,OAC1EvC,WAAYa,KAAKL,OAAOR,WACxBZ,MAAOyB,KAAKL,OAAOpB,QAGvByB,KAAKqB,iBAAiB,oBAGtBrB,KAAK2B,gBAAgBV,EAAAE,EAAA,EAAA,MAAA,KAAA,EAG6C,MAH7CF,EAAAC,EAAA,EAAAH,EAAAE,EAAAW,EAGrB5B,KAAKqB,iBAAiB,iBAAkB,CAAEQ,MAAOd,EAAMe,UAAWf,EAAA,KAAA,EAAA,OAAAE,EAAAc,EAAA,GAAA,EAAAjB,EAAAd,KAAA,CAAA,CAAA,EAAA,IAGzE,IAAA,WA9CS,OAAAU,EAAAsB,MAAAhC,KAAAJ,UAAA,IAgDV,CAAAY,IAAA,aAAAC,OAAAwB,EAAAtB,EAAAC,IAAAC,EAGA,SAAAqB,IAAA,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAA,OAAA3B,IAAAI,EAAA,SAAAwB,GAAA,cAAAA,EAAAtB,EAAAsB,EAAArB,GAAA,KAAA,EAQS,OARTqB,EAAAtB,EAAA,EAEQlB,KAAKqB,iBAAiB,qBAEhBc,EAAW,CACb9D,KAAM2B,KAAKL,OAAOtB,KAClBC,YAAa0B,KAAKL,OAAOrB,YACzBC,MAAOyB,KAAKL,OAAOpB,OACtBiE,EAAArB,EAAA,EAEsBsB,MAAMzC,KAAKL,OAAOP,cAAe,CACpDsD,OAAQ,OACRC,QAAS,CACL,eAAgB,mBAChBC,OAAU,oBAEdC,KAAMC,KAAKC,UAAUZ,KACvB,KAAA,EAPY,IAARC,EAAQI,EAAAZ,GASAoB,GAAE,CAAAR,EAAArB,EAAA,EAAA,KAAA,CAAA,MACN,IAAI8B,MAAKC,gBAAAA,OAAiBd,EAASe,SAAS,KAAA,EAAA,OAAAX,EAAArB,EAAA,EAGjCiB,EAASgB,OAAM,KAAA,EAEwB,GAFtDf,EAAMG,EAAAZ,EAEZJ,QAAQC,IAAI,uCAAwCY,GAE/CA,EAAOgB,QAAO,CAAAb,EAAArB,EAAA,EAAA,KAAA,CAAA,MACT,IAAI8B,MAAMZ,EAAOR,OAAS,6CAA6C,KAAA,EAQnB,GAJ9D7B,KAAKL,OAAOJ,MAAQ8C,EAAOiB,KAAK/D,MAChCS,KAAKL,OAAO1B,OAASoE,EAAOiB,KAAKC,UAG3BjB,EAAetC,KAAKwD,kBAAkBnB,EAAOiB,KAAK/D,QACxC,CAAAiD,EAAArB,EAAA,EAAA,KAAA,CACZnB,KAAKL,OAAOxB,SAAWmE,EAAamB,UACpCzD,KAAKL,OAAOvB,SAAWkE,EAAaoB,UAAUlB,EAAArB,EAAA,EAAA,MAAA,KAAA,EAAA,MAExC,IAAI8B,MAAM,2CAA0C,KAAA,EAG9DjD,KAAKL,OAAOgE,UAAYtB,EAAOiB,KAAKM,WACpC5D,KAAKL,OAAOkE,YAAcxB,EAAOiB,KAAKQ,aACtC9D,KAAKL,OAAOoE,aAAe,EAE3B/D,KAAKqB,iBAAiB,sBAAuB,CACzCsC,UAAWtB,EAAOiB,KAAKM,WACvBC,YAAaxB,EAAOiB,KAAKQ,eAG7BtC,QAAQC,IAAI,sCAAsCe,EAAArB,EAAA,EAAA,MAAA,KAAA,EAGmB,MAHnBqB,EAAAtB,EAAA,EAAAqB,EAAAC,EAAAZ,EAGlD5B,KAAKqB,iBAAiB,oBAAqB,CAAEQ,MAAOU,EAAMT,UACpD,IAAImB,MAAKC,wCAAAA,OAAyCX,EAAMT,UAAU,KAAA,EAAA,OAAAU,EAAAT,EAAA,GAAA,EAAAG,EAAAlC,KAAA,CAAA,CAAA,EAAA,IAE/E,IAAA,WA3De,OAAAiC,EAAAD,MAAAhC,KAAAJ,UAAA,IA6DhB,CAAAY,IAAA,oBAAAC,MAGA,SAAkBlB,GACd,IACI,IAAMyE,EAAQzE,EAAM0E,MAAM,KAC1B,GAAqB,IAAjBD,EAAMnE,OAEN,OADA2B,QAAQK,MAAM,8BACP,KAGX,IAAAqC,EAAAC,EAA6BH,EAAK,GAA3BI,EAAOF,EAAA,GAGRG,GAHmBH,EAAA,GAGFI,KAAKF,IACtBG,EAAYzB,KAAK0B,MAAMH,GAG7B,OAAIE,EAAUE,KAAOF,EAAUE,IAAMC,KAAKC,MAAQ,KAC9CnD,QAAQK,MAAM,kBACP,OAGXL,QAAQC,IAAI,8BACL8C,EAEV,CAAC,MAAO1C,GAEL,OADAL,QAAQK,MAAM,2BAA4BA,GACnC,IACX,CACJ,GAEA,CAAArB,IAAA,gBAAAC,MAGA,WAAgB,IAAAmE,EAAA5E,KACZ,IAEI,GAAkB,oBAAP6E,GAIP,OAHArD,QAAQsD,KAAK,yEAEbC,WAAW,WAAA,OAAMH,EAAKjD,eAAe,EAAE,KAK3C,IAAMqD,EAAKhF,KAAKiF,cAGXjF,KAAKK,OA8CNmB,QAAQC,IAAI,+BA7CZD,QAAQC,IAAI,kCAEZzB,KAAKK,OAASwE,GAAG,iCAAkC,CAC/CK,MAAO,CACH3F,MAAOS,KAAKL,OAAOxB,SACnBE,KAAM,MACN8G,OAAQnF,KAAKL,OAAOxB,SACpBiH,SAAUJ,GAEdK,WAAY,CAAC,YAAa,aAI9BrF,KAAKK,OAAOiF,GAAG,UAAW,WACtB9D,QAAQC,IAAI,qCACZD,QAAQC,IAAI,gBAAiBmD,EAAKvE,OAAOkF,IACzCX,EAAKvE,OAAOmF,WAAY,CAC5B,GAEAxF,KAAKK,OAAOiF,GAAG,aAAc,SAACG,GAC1BjE,QAAQC,IAAI,0BAA2BgE,GACvCb,EAAKvE,OAAOmF,WAAY,CAC5B,GAEAxF,KAAKK,OAAOiF,GAAG,gBAAiB,SAACzD,GAC7BL,QAAQK,MAAM,gCAAiCA,GAC/C+C,EAAKvE,OAAOmF,WAAY,CAC5B,GAGAxF,KAAKK,OAAOiF,GAAG,mBAAoB,SAAChC,GAChC9B,QAAQC,IAAI,kCAAmC6B,GAC/CsB,EAAKc,qBAAqBpC,EAC9B,GAEAtD,KAAKK,OAAOiF,GAAG,kBAAmB,SAAChC,GAC/B9B,QAAQC,IAAI,yBAA0B6B,GACtCsB,EAAKe,oBAAoBrC,EAC7B,GAEAtD,KAAKK,OAAOiF,GAAG,aAAc,SAAChC,GAC1B9B,QAAQC,IAAI,oBAAqB6B,GACjCsB,EAAKgB,gBAAgBtC,EACzB,GAIP,CAAC,MAAOzB,GACLL,QAAQK,MAAM,qCAAsCA,EACxD,CACJ,GAEA,CAAArB,IAAA,cAAAC,MAGA,WAEI,MAAO,WACX,GAEA,CAAAD,IAAA,cAAAC,MAGA,SAAYpC,GACR,OAAOA,GACH,KAAK,EAAG,MAAO,MACf,KAAK,EAAG,MAAO,OACf,KAAK,EAAG,MAAO,YACf,QAAS,MAAA6E,QAAAA,OAAe7E,GAEhC,GAEA,CAAAmC,IAAA,yBAAAC,MAGA,WACI,IAAMoF,EAAS,GA0Bf,GAvBK7F,KAAKL,OAAOxB,UAA4C,iBAAzB6B,KAAKL,OAAOxB,SAErC6B,KAAKL,OAAOxB,SAAS0B,OAAS,IACrCgG,EAAOC,KAAK,uBAFZD,EAAOC,KAAK,iCAMX9F,KAAKL,OAAOvB,UAA4C,iBAAzB4B,KAAKL,OAAOvB,SAErC4B,KAAKL,OAAOvB,SAASyB,OAAS,IACrCgG,EAAOC,KAAK,+CAFZD,EAAOC,KAAK,iCAMX9F,KAAKL,OAAO1B,QAAW+B,KAAK+F,WAAW/F,KAAKL,OAAO1B,SACpD4H,EAAOC,KAAK,mBAIX,CAAC,EAAG,EAAG,GAAGzG,SAASW,KAAKL,OAAOtB,OAChCwH,EAAOC,KAAK,uCAGZD,EAAOhG,OAAS,EAEhB,MADAG,KAAKqB,iBAAiB,mBAAoB,CAAEwE,OAAAA,IACtC,IAAI5C,MAAKC,qCAAAA,OAAsC2C,EAAOG,KAAK,QAGrEhG,KAAKqB,iBAAiB,qBAC1B,GAEA,CAAAb,IAAA,aAAAC,MAGA,SAAWwF,GACP,IACI,IAAMC,EAAM,IAAIC,IAAIF,GACpB,MAAwB,WAAjBC,EAAIE,UAA0C,UAAjBF,EAAIE,QAC3C,CAAC,MAAOC,GACL,OAAO,CACX,CACJ,GAEA,CAAA7F,IAAA,mBAAAC,MAGA,SAAiB6F,GAAkB,IAAXhD,EAAI1D,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EAC3B,GAAKI,KAAKL,OAAOZ,mBAAjB,CAEA,IAAMwH,EAAc,CAChBC,WAAW,IAAI9B,MAAO+B,cACtBH,MAAOA,EACPhD,KAAMA,EACNoD,UAAWC,UAAUD,UACrBR,IAAKtI,EAAOgJ,SAASC,MAGzBrF,QAAQsD,KAAK,gBAAiByB,GAGzB3I,EAAOkJ,qBACRlJ,EAAOkJ,mBAAqB,IAEhClJ,EAAOkJ,mBAAmBhB,KAAKS,EAhBM,CAiBzC,GAEA,CAAA/F,IAAA,uBAAAC,MAGA,WAEIT,KAAKL,OAAOoH,iBAAmB/G,KAAKL,OAAOxB,SAC3C6B,KAAKL,OAAOqH,iBAAmBhH,KAAKL,OAAOvB,SAGvC4B,KAAKL,OAAOxB,WACZ6B,KAAKL,OAAOsH,gBAAkBjH,KAAKL,OAAOxB,SAASmB,QAAQ,iBAAkB,YAE7EU,KAAKL,OAAOvB,WACZ4B,KAAKL,OAAOuH,gBAAkBlH,KAAKL,OAAOvB,SAASkB,QAAQ,iBAAkB,WAErF,GAEA,CAAAkB,IAAA,gBAAAC,MAGA,SAAc0G,GACV,MAAqB,iBAAVA,EAA2BA,EAG/BA,EACF7H,QAAQ,QAAS,IACjBA,QAAQ,gBAAiB,IACzB8H,MACT,GAEA,CAAA5G,IAAA,uBAAAC,MAGA,SAAqB6C,GACbtD,KAAKL,OAAOd,gBACZmB,KAAKL,OAAOd,eAAeyE,EAEnC,GAEA,CAAA9C,IAAA,sBAAAC,MAGA,SAAoB6C,GACZtD,KAAKL,OAAOhB,WACZqB,KAAKL,OAAOhB,UAAU2E,EAE9B,GAEA,CAAA9C,IAAA,kBAAAC,MAGA,SAAgB6C,GACRtD,KAAKL,OAAOb,WACZkB,KAAKL,OAAOb,UAAUwE,EAE9B,GAEA,CAAA9C,IAAA,qBAAAC,MAGA,SAAmB6F,EAAOhD,GAClBtD,KAAKK,QAAUL,KAAKK,OAAOmF,WAC3BxF,KAAKK,OAAOgH,KAAKf,EAAOhD,GACxB9B,QAAQC,IAAGyB,gCAAAA,OAAiCoD,GAAShD,IAErD9B,QAAQsD,KAAK,+DAAkEwB,EAEvF,GAEA,CAAA9F,IAAA,qBAAAC,MAGA,WACI,OAAKT,KAAKK,OAGHL,KAAKK,OAAOmF,UAAY,YAAc,eAFlC,iBAGf,GAEA,CAAAhF,IAAA,qBAAAC,MAGA,WACsB,oBAAPoE,IAAuB7E,KAAKK,SACnCmB,QAAQC,IAAI,+CACZzB,KAAK2B,gBAEb,GAEA,CAAAnB,IAAA,aAAAC,OAAA6G,EAAA3G,EAAAC,IAAAC,EAGA,SAAA0G,IAAA,IAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAtJ,EAAA8D,EAAAyF,EAAAC,EAAAC,EAAAC,EAAAC,EAAArI,UAAA,OAAAgB,IAAAI,EAAA,SAAAkH,GAAA,cAAAA,EAAAhH,EAAAgH,EAAA/G,GAAA,KAAA,EAAkE,GAAjDqG,EAAWS,EAAApI,OAAA,QAAAC,IAAAmI,EAAA,GAAAA,EAAA,GAAG,sBAAuBR,EAAOQ,EAAApI,OAAAoI,QAAAnI,IAAAmI,EAAAnI,GAAAmI,EAAG,GAAA,CAAA,GAExDjI,KAAKM,YAAW,CAAA4H,EAAA/G,EAAA,EAAA,KAAA,CAAA,OAAA+G,EAAA/G,EAAA,EACVnB,KAAKM,YAAW,KAAA,EACtBN,KAAKM,YAAc,KAAK,KAAA,EAAA,GAGvBN,KAAKI,cAAa,CAAA8H,EAAA/G,EAAA,EAAA,KAAA,CAAA,MACb,IAAI8B,MAAM,8BAA6B,KAAA,EAMQ,OAHzDzB,QAAQC,IAAI,yCAA0C+F,GAGtDhG,QAAQC,IAAI,6CAA6CyG,EAAAhH,EAAA,EAAAgH,EAAA/G,EAAA,EAEtBnB,KAAKmI,mBAAmB,KAAK,KAAA,EAAtDT,EAAgBQ,EAAAtG,EACtBJ,QAAQC,IAAI,uBAAwBiG,GAAkBQ,EAAA/G,EAAA,EAAA,MAAA,KAAA,EAES,MAFT+G,EAAAhH,EAAA,EAAA6G,EAAAG,EAAAtG,EAEtDJ,QAAQK,MAAM,uBAAwBkG,EAAgBjG,SAChD,IAAImB,MAAM,iEAAgE,KAAA,EAYZ,OAZYiF,EAAAhH,EAAA,EAK1EyG,EAAW3H,KAAKK,OAASL,KAAKK,OAAOkF,GAAK,oBAC1CqC,EAAYD,EAElBnG,QAAQC,IAAI,yBAA0BmG,GACtCpG,QAAQC,IAAI,gBAAiBkG,GAGnBrJ,EAAc0B,KAAKL,OAAOrB,aAAe,kBAAiB4J,EAAA/G,EAAA,EACzCnB,KAAKoI,YAAY,eAAcnI,EAAA,CAClD5B,KAAM2B,KAAKL,OAAOtB,KAClBgK,QAAST,EACTU,SAAKpF,OAAKlD,KAAKuI,YAAYvI,KAAKL,OAAOtB,MAAK6E,KAAAA,OAAI5E,IAC7CmJ,IACL,KAAA,EALY,KAARrF,EAAQ8F,EAAAtG,GAOLyB,QAAO,CAAA6E,EAAA/G,EAAA,EAAA,KAAA,CA8Bb,OA5BC0G,EAAazF,EAASkB,KAAKkF,WAGhBC,WAAW,OACtBZ,EAAU3E,GAAAA,OAAMlD,KAAKL,OAAO1B,QAAMiF,OAAG2E,IAGzC7H,KAAK0I,aAAeb,EAEpBrG,QAAQC,IAAI,uCAAwCoG,GACpDrG,QAAQC,IAAI,uBAAwBmG,GACpCpG,QAAQC,IAAI,gBAAiBW,EAASkB,KAAKgF,OAC3C9G,QAAQC,IAAI,iBAAkBW,EAASkB,KAAKqF,WAG5C3I,KAAK4I,cAAcpB,EAAaK,EAAY7H,KAAKL,OAAOtB,KAAMoJ,GAE9DzH,KAAK6I,iBAAiBrB,EAAaxH,KAAKL,OAAOtB,KAAMoJ,GAGrDzH,KAAK8I,mBAAmB,eAAgB,CACpCzK,KAAM2B,KAAKL,OAAOtB,KAClBmK,UAAWX,EACXF,SAAUA,EACVC,UAAWA,EACXU,MAAOlG,EAASkB,KAAKgF,MACrBK,UAAWvG,EAASkB,KAAKqF,UACzBnC,UAAW9B,KAAKC,QACjBuD,EAAAnG,EAAA9B,EAAAA,EAAAA,EAAA,CAAA,EAGImC,EAASkB,MAAI,GAAA,CAChBkF,UAAWX,EACXD,UAAWA,EACXU,MAAOlG,EAASkB,KAAKgF,MACrBK,UAAWvG,EAASkB,KAAKqF,aAAS,KAAA,EAAA,MAGhC,IAAI1F,MAAMb,EAASN,SAAW,2CAA0C,KAAA,GAAAoG,EAAA/G,EAAA,GAAA,MAAA,KAAA,GAqCpB,MArCoB+G,EAAAhH,EAAA,GAAA8G,EAAAE,EAAAtG,EAGlFJ,QAAQK,MAAM,uBAAwBmG,EAAMlG,SAC5CN,QAAQK,MAAM,uBAAwBmG,EAAMe,OAC5CvH,QAAQK,MAAM,qBAAsB,CAChC5D,OAAQ+B,KAAKL,OAAO1B,OACpBI,KAAM2B,KAAKL,OAAOtB,KAClBc,WAAYa,KAAKL,OAAOR,WACxBhB,SAAU6B,KAAKL,OAAOxB,SAAW,MAAQ6B,KAAKL,OAAOxB,SAASuD,OAAO,GAAK,OAC1EtD,SAAU4B,KAAKL,OAAOvB,SAAW,MAAQ4B,KAAKL,OAAOvB,SAASsD,OAAO,GAAK,SAI1E1B,KAAKL,OAAOF,kBACZ+B,QAAQC,IAAI,qCACZD,QAAQC,IAAI,eAAgB7D,EAAOgJ,SAASoC,UAC5CxH,QAAQC,IAAI,eAAgB7D,EAAOgJ,SAASR,UAC5C5E,QAAQC,IAAI,mBAAoB7D,EAAOgJ,SAASC,MAE1CiB,EAAuC,cAA7BlK,EAAOgJ,SAASoC,UACY,cAA7BpL,EAAOgJ,SAASoC,UACa,UAA7BpL,EAAOgJ,SAASR,SAE/B5E,QAAQC,IAAI,gBAAiBqG,GAEzBA,GACAtG,QAAQC,IAAI,kDACZD,QAAQC,IAAI,6EAEZD,QAAQC,IAAI,oCAGhBD,QAAQC,IAAI,uEAGhBD,QAAQC,IAAI,2DAA6DzB,KAAKL,OAAOtB,MACrF2B,KAAKiJ,0BAA0BzB,EAAaxH,KAAKL,OAAOtB,MAClD,IAAI4E,MAAM,0BAAyB,KAAA,GAAA,OAAAiF,EAAAnG,EAAA,GAAA,EAAAwF,EAAAvH,KAAA,CAAA,CAAA,EAAA,IAAA,CAAA,EAAA,IAEhD,IAAA,WAxHe,OAAAsH,EAAAtF,MAAAhC,KAAAJ,UAAA,IA4HhB,CAAAY,IAAA,mBAAAC,OAAAyI,EAAAvI,EAAAC,IAAAC,EAGA,SAAAsI,EAAuB3B,EAAanJ,GAAI,IAAAoJ,EAAArF,EAAAyF,EAAAuB,EAAAC,EAAAzJ,UAAA,OAAAgB,IAAAI,EAAA,SAAAsI,GAAA,cAAAA,EAAApI,EAAAoI,EAAAnI,GAAA,KAAA,EAAc,GAAZsG,EAAO4B,EAAAxJ,OAAAwJ,QAAAvJ,IAAAuJ,EAAAvJ,GAAAuJ,EAAG,GAAA,CAAA,GAE5CrJ,KAAKM,YAAW,CAAAgJ,EAAAnI,EAAA,EAAA,KAAA,CAAA,OAAAmI,EAAAnI,EAAA,EACVnB,KAAKM,YAAW,KAAA,EACtBN,KAAKM,YAAc,KAAK,KAAA,EAAA,GAGvBN,KAAKI,cAAa,CAAAkJ,EAAAnI,EAAA,EAAA,KAAA,CAAA,MACb,IAAI8B,MAAM,8BAA6B,KAAA,EAAA,OAAAqG,EAAApI,EAAA,EAAAoI,EAAAnI,EAAA,EAItBnB,KAAKoI,YAAY,eAAcnI,EAAA,CAClD5B,KAAMA,GACHoJ,IACL,KAAA,EAHY,KAARrF,EAAQkH,EAAA1H,GAKDyB,QAAO,CAAAiG,EAAAnI,EAAA,EAAA,KAAA,CAWkC,OAR5C0G,EAAU,GAAA3E,OADK,2BACaA,OAAGd,EAASkB,KAAKiG,QACnDvJ,KAAK4I,cAAcpB,EAAaK,EAAYxJ,EAAMoJ,GAGlDjG,QAAQC,IAAI,oDAAqDoG,GACjErG,QAAQC,IAAI,sBAAuBW,EAASkB,KAAKkG,MACjDhI,QAAQC,IAAI,iBAAkBW,EAASkB,KAAKmG,YAE5CzJ,KAAK6I,iBAAiBrB,EAAanJ,EAAMoJ,GAAS6B,EAAAvH,EAAA9B,EAAAA,EAAAA,EAAA,CAAA,EAE3CmC,EAASkB,MAAI,GAAA,CAChBkF,UAAWX,EACXc,UAAWvG,EAASkB,KAAKmG,cAAU,KAAA,EAAA,MAGjC,IAAIxG,MAAMb,EAASN,SAAW,2CAA0C,KAAA,EAAAwH,EAAAnI,EAAA,EAAA,MAAA,KAAA,EAahC,MAbgCmI,EAAApI,EAAA,EAAAkI,EAAAE,EAAA1H,EAGlFJ,QAAQK,MAAM,uBAAwBuH,EAAMtH,SAC5CN,QAAQK,MAAM,uBAAwBuH,EAAML,OAC5CvH,QAAQK,MAAM,8BAA+B,CACzC5D,OAAQ+B,KAAKL,OAAO1B,OACpBI,KAAMA,EACNc,WAAYa,KAAKL,OAAOR,WACxBhB,SAAU6B,KAAKL,OAAOxB,SAAW,MAAQ6B,KAAKL,OAAOxB,SAASuD,OAAO,GAAK,OAC1EtD,SAAU4B,KAAKL,OAAOvB,SAAW,MAAQ4B,KAAKL,OAAOvB,SAASsD,OAAO,GAAK,SAE9EF,QAAQC,IAAI,2DAA6DpD,GACzE2B,KAAKiJ,0BAA0BzB,EAAanJ,GACtC,IAAI4E,MAAM,0BAAyB,KAAA,EAAA,OAAAqG,EAAAvH,EAAA,GAAA,EAAAoH,EAAAnJ,KAAA,CAAA,CAAA,EAAA,IAEhD,IAAA,SAnDqB0J,EAAAC,GAAA,OAAAT,EAAAlH,MAAAhC,KAAAJ,UAAA,IAqDtB,CAAAY,IAAA,iBAAAC,OAAAmJ,EAAAjJ,EAAAC,IAAAC,EACA,SAAAgJ,EAAqBrC,GAAW,IAAAC,EAAAqC,EAAAlK,UAAA,OAAAgB,IAAAI,EAAA,SAAA+I,GAAA,UAAA,IAAAA,EAAA5I,EAAc,OAAZsG,EAAOqC,EAAAjK,OAAAiK,QAAAhK,IAAAgK,EAAAhK,GAAAgK,EAAG,GAAA,CAAA,EAAEC,EAAAhI,EACnC,EAAA/B,KAAKgK,WAAWxC,EAAaC,GAAQ,EAAAoC,EAAA7J,KAC/C,IAAA,SAFmBiK,GAAA,OAAAL,EAAA5H,MAAAhC,KAAAJ,UAAA,IAAA,CAAAY,IAAA,gBAAAC,OAAAyJ,EAAAvJ,EAAAC,IAAAC,EAIpB,SAAAsJ,EAAoB3C,GAAW,IAAAC,EAAA2C,EAAAC,EAAAzK,UAAA,OAAAgB,IAAAI,EAAA,SAAAsJ,GAAA,cAAAA,EAAApJ,EAAAoJ,EAAAnJ,GAAA,KAAA,EAIN,OAJQsG,EAAO4C,EAAAxK,OAAAwK,QAAAvK,IAAAuK,EAAAvK,GAAAuK,EAAG,GAAA,CAAA,EAEjCD,EAAepK,KAAKL,OAAOtB,KAEjC2B,KAAKL,OAAOtB,KAAO,EAAEiM,EAAApJ,EAAA,EAAAoJ,EAAAnJ,EAAA,EAEJnB,KAAKgK,WAAWxC,EAAaC,GAAQ,KAAA,EAAA,OAAA6C,EAAAvI,EAAAuI,EAAAA,EAAA1I,GAAA,KAAA,EAGlB,OAHkB0I,EAAApJ,EAAA,EAGlDlB,KAAKL,OAAOtB,KAAO+L,EAAaE,EAAAC,EAAA,GAAA,KAAA,EAAA,OAAAD,EAAAvI,EAAA,GAAA,EAAAoI,EAAAnK,KAAA,CAAA,CAAA,EAAA,CAAA,EAAA,IAEvC,IAAA,SAXkBwK,GAAA,OAAAN,EAAAlI,MAAAhC,KAAAJ,UAAA,IAAA,CAAAY,IAAA,sBAAAC,OAAAgK,EAAA9J,EAAAC,IAAAC,EAanB,SAAA6J,EAA0BlD,GAAW,IAAAC,EAAA2C,EAAAO,EAAA/K,UAAA,OAAAgB,IAAAI,EAAA,SAAA4J,GAAA,cAAAA,EAAA1J,EAAA0J,EAAAzJ,GAAA,KAAA,EAIZ,OAJcsG,EAAOkD,EAAA9K,OAAA8K,QAAA7K,IAAA6K,EAAA7K,GAAA6K,EAAG,GAAA,CAAA,EAEvCP,EAAepK,KAAKL,OAAOtB,KAEjC2B,KAAKL,OAAOtB,KAAO,EAAEuM,EAAA1J,EAAA,EAAA0J,EAAAzJ,EAAA,EAEJnB,KAAKgK,WAAWxC,EAAaC,GAAQ,KAAA,EAAA,OAAAmD,EAAA7I,EAAA6I,EAAAA,EAAAhJ,GAAA,KAAA,EAGlB,OAHkBgJ,EAAA1J,EAAA,EAGlDlB,KAAKL,OAAOtB,KAAO+L,EAAaQ,EAAAL,EAAA,GAAA,KAAA,EAAA,OAAAK,EAAA7I,EAAA,GAAA,EAAA2I,EAAA1K,KAAA,CAAA,CAAA,EAAA,CAAA,EAAA,IAEvC,IAAA,SAXwB6K,GAAA,OAAAJ,EAAAzI,MAAAhC,KAAAJ,UAAA,IAazB,CAAAY,IAAA,gBAAAC,OAAAqK,EAAAnK,EAAAC,IAAAC,EAGA,SAAAkK,EAAoBpC,GAAS,IAAAvG,EAAA4I,EAAA,OAAApK,IAAAI,EAAA,SAAAiK,GAAA,cAAAA,EAAA/J,EAAA+J,EAAA9J,GAAA,KAAA,EAAA,GACpBnB,KAAKI,cAAa,CAAA6K,EAAA9J,EAAA,EAAA,KAAA,CAAA,MACb,IAAI8B,MAAM,8BAA6B,KAAA,EAAA,OAAAgI,EAAA/J,EAAA,EAAA+J,EAAA9J,EAAA,EAItBnB,KAAKoI,YAAY,aAAc,CAClD8C,UAAWvC,IACb,KAAA,EAFY,KAARvG,EAAQ6I,EAAArJ,GAIDyB,QAAO,CAAA4H,EAAA9J,EAAA,EAAA,KAAA,CAAA,OAAA8J,EAAAlJ,EACTK,EAAAA,EAASkB,MAAI,KAAA,EAAA,MAEd,IAAIL,MAAMb,EAASN,SAAW,4CAA2C,KAAA,EAAAmJ,EAAA9J,EAAA,EAAA,MAAA,KAAA,EAG3D,MAH2D8J,EAAA/J,EAAA,EAAA8J,EAAAC,EAAArJ,EAGnF5B,KAAKmL,YAAWH,GAAQA,EAAA,KAAA,EAAA,OAAAC,EAAAlJ,EAAA,GAAA,EAAAgJ,EAAA/K,KAAA,CAAA,CAAA,EAAA,IAG/B,IAAA,SAnBkBoL,GAAA,OAAAN,EAAA9I,MAAAhC,KAAAJ,UAAA,IAqBnB,CAAAY,IAAA,wBAAAC,OAAA4K,EAAA1K,EAAAC,IAAAC,EAGA,SAAAyK,EAA4BjD,EAASb,EAAanJ,GAAI,IAAAoJ,EAAA8D,EAAAC,EAAAC,EAAA7L,UAAA,OAAAgB,IAAAI,EAAA,SAAA0K,GAAA,cAAAA,EAAAxK,EAAAwK,EAAAvK,GAAA,KAAA,EACK,GADHsG,EAAOgE,EAAA5L,OAAA4L,QAAA3L,IAAA2L,EAAA3L,GAAA2L,EAAG,GAAA,CAAA,EAC9DjK,QAAQC,IAAI,iCAAkC4G,GAASqD,EAAAxK,EAAA,EAIlB,cAA7BtD,EAAOgJ,SAASoC,UACa,cAA7BpL,EAAOgJ,SAASoC,UACa,UAA7BpL,EAAOgJ,SAASR,SAAoB,CAAAsF,EAAAvK,EAAA,EAAA,KAAA,CAEc,OAAlDK,QAAQC,IAAI,sCAAsCiK,EAAAvK,EAAA,EACzBnB,KAAK2L,gBAAgBtD,EAASb,EAAanJ,EAAMoJ,GAAQ,KAAA,EAAlE,KAAV8D,EAAUG,EAAA9J,GACF,CAAA8J,EAAAvK,EAAA,EAAA,KAAA,CAAA,OAAAuK,EAAA3J,EAAA,EACHwJ,GAAU,KAAA,EAK2B,OAApD/J,QAAQC,IAAI,wCAAwCiK,EAAAvK,EAAA,EACvCnB,KAAK4L,iBAAiBvD,EAASb,EAAanJ,EAAMoJ,GAAQ,KAAA,EAAA,OAAAiE,EAAA3J,EAAA2J,EAAAA,EAAA9J,GAAA,KAAA,EAKZ,OALY8J,EAAAxK,EAAA,EAAAsK,EAAAE,EAAA9J,EAGvEJ,QAAQK,MAAM,0BAAyB2J,GAEvCxL,KAAK6L,iBAAiBrE,EAAaa,EAAShK,EAAMoJ,GAASiE,EAAA3J,EAAA,EACpD,MAAI,EAAAuJ,EAAAtL,KAAA,CAAA,CAAA,EAAA,IAElB,IAAA,SA1B0B8L,EAAAC,EAAAC,GAAA,OAAAX,EAAArJ,MAAAhC,KAAAJ,UAAA,IA4B3B,CAAAY,IAAA,kBAAAC,OAAAwL,EAAAtL,EAAAC,IAAAC,EAGA,SAAAqL,EAAsB7D,EAASb,EAAanJ,GAAI,IAAAoJ,EAAArF,EAAAkB,EAAA6I,EAAAC,EAAAC,EAAAzM,UAAA,OAAAgB,IAAAI,EAAA,SAAAsL,GAAA,cAAAA,EAAApL,EAAAoL,EAAAnL,GAAA,KAAA,EAAc,OAAZsG,EAAO4E,EAAAxM,OAAAwM,QAAAvM,IAAAuM,EAAAvM,GAAAuM,EAAG,GAAA,CAAA,EAAEC,EAAApL,EAAA,EAAAoL,EAAAnL,EAAA,EAE/BsB,MAAM,0CAA2C,CACpEC,OAAQ,OACRC,QAAS,CACL,eAAgB,qCAEpBE,aAAIK,OAAUqJ,mBAAmBlE,GAAQ,eAC3C,KAAA,EANY,KAARjG,EAAQkK,EAAA1K,GAQDoB,GAAE,CAAAsJ,EAAAnL,EAAA,EAAA,KAAA,CAAA,OAAAmL,EAAAnL,EAAA,EACQiB,EAASgB,OAAM,KAAA,EAEoB,OAFhDE,EAAIgJ,EAAA1K,EACJuK,EAAKjJ,yBAAAA,OAA4BI,EAAKiG,QAC5CvJ,KAAK4I,cAAcpB,EAAa2E,EAAO9N,EAAMoJ,GAAS6E,EAAAvK,EAAA,EAC/CoK,GAAK,KAAA,EAAAG,EAAAnL,EAAA,EAAA,MAAA,KAAA,EAAAmL,EAAApL,EAAA,EAAAkL,EAAAE,EAAA1K,EAGhBJ,QAAQC,IAAI,qCAAsC2K,EAAMtK,SAAS,KAAA,EAAA,OAAAwK,EAAAvK,EAAA,EAE9D,MAAI,EAAAmK,EAAAlM,KAAA,CAAA,CAAA,EAAA,IACd,IAAA,SApBoBwM,EAAAC,EAAAC,GAAA,OAAAT,EAAAjK,MAAAhC,KAAAJ,UAAA,IAsBrB,CAAAY,IAAA,mBAAAC,OAAAkM,EAAAhM,EAAAC,IAAAC,EAGA,SAAA+L,EAAuBvE,EAASb,EAAanJ,GAAI,IAAAoJ,EAAArF,EAAAkB,EAAA6I,EAAAU,EAAAC,EAAAlN,UAAA,OAAAgB,IAAAI,EAAA,SAAA+L,GAAA,cAAAA,EAAA7L,EAAA6L,EAAA5L,GAAA,KAAA,EAAc,OAAZsG,EAAOqF,EAAAjN,OAAAiN,QAAAhN,IAAAgN,EAAAhN,GAAAgN,EAAG,GAAA,CAAA,EAAEC,EAAA7L,EAAA,EAAA6L,EAAA5L,EAAA,EAEhCsB,MAAM,0CAA2C,CACpEC,OAAQ,OACRC,QAAS,CACL,eAAgB,oBAEpBE,KAAMC,KAAKC,UAAU,CACjBiK,KAAM3E,EACN4E,KAAM,IACN5O,KAAMA,MAEZ,KAAA,EAVY,KAAR+D,EAAQ2K,EAAAnL,GAYDoB,GAAE,CAAA+J,EAAA5L,EAAA,EAAA,KAAA,CAAA,OAAA4L,EAAA5L,EAAA,EACQiB,EAASgB,OAAM,KAAA,EAEoB,OAFhDE,EAAIyJ,EAAAnL,EACJuK,EAAKjJ,yBAAAA,OAA4BI,EAAKiG,QAC5CvJ,KAAK4I,cAAcpB,EAAa2E,EAAO9N,EAAMoJ,GAASsF,EAAAhL,EAAA,EAC/CoK,GAAK,KAAA,EAAAY,EAAA5L,EAAA,EAAA,MAAA,KAAA,EAAA4L,EAAA7L,EAAA,EAAA2L,EAAAE,EAAAnL,EAGhBJ,QAAQK,MAAM,+BAA8BgL,GAAS,KAAA,EAIE,OAA3D7M,KAAK6L,iBAAiBrE,EAAaa,EAAShK,EAAMoJ,GAASsF,EAAAhL,EAAA,EACpD,MAAI,EAAA6K,EAAA5M,KAAA,CAAA,CAAA,EAAA,IACd,IAAA,SA3BqBkN,EAAAC,EAAAC,GAAA,OAAAT,EAAA3K,MAAAhC,KAAAJ,UAAA,IA6BtB,CAAAY,IAAA,mBAAAC,MAGA,SAAiB+G,EAAaa,EAAShK,GACnC,IAAMgP,EAAYC,SAASC,eAAe/F,GAC1C,IAAK6F,EACD,MAAM,IAAIpK,MAAK,yBAAAC,OAAyBsE,mBAG5C,IAAMgG,EAAWxN,KAAKuI,YAAYlK,GAClCgP,EAAUI,UAAS,mIAAAvK,OAGDsK,EAAQtK,gYAAAA,OAI+DmF,EAMxF,2PAED7G,QAAQC,IAAI,wBAAyB4G,EACzC,GAEA,CAAA7H,IAAA,gBAAAC,MAGA,SAAc+G,EAAa2E,EAAO9N,GAAoB,IAAdoJ,EAAO7H,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,CAAA,EACxCyN,EAAYC,SAASC,eAAe/F,GAC1C,IAAK6F,EACD,MAAM,IAAIpK,MAAK,yBAAAC,OAAyBsE,mBAI5C6F,EAAUI,UAAY,GAGtB,IAAMC,EAAYJ,SAASK,cAAc,OACzCD,EAAUE,UAAY,iBAGtB,IAAMJ,EAAWxN,KAAKuI,YAAYlK,GAClCqP,EAAUD,UAASvK,6EAAAA,OAEI,IAAT7E,EAAa,mBAA8B,IAATA,EAAa,mBAA8B,IAATA,EAAa,YAAc,gBAAkBA,EAAI6E,gHAAAA,OAG/GiJ,EAAK,mBAAAjJ,OAAkBsK,EAG1C,qIAEDH,EAAUQ,YAAYH,GAGtB1N,KAAK8N,WAAWrG,EAAQlJ,OAASyB,KAAKL,OAAOpB,OAE7CiD,QAAQC,IAAI,qBAAsB0K,EACtC,GAEA,CAAA3L,IAAA,uBAAAC,OAAAsN,EAAApN,EAAAC,IAAAC,EAGA,SAAAmN,EAA2B3F,EAASC,GAAK,IAAA2F,EAAAC,EAAA,OAAAtN,IAAAI,EAAA,SAAAmN,GAAA,cAAAA,EAAAjN,EAAAiN,EAAAhN,GAAA,KAAA,EASpC,GARDK,QAAQC,IAAI,0CACZD,QAAQC,IAAI,cAAe4G,GAC3B7G,QAAQC,IAAI,aAAc6G,IAGtB2F,EAAcX,SAASC,eAAe,0BAEtCU,EAAcX,SAASC,eAAe,iBAErCU,EAAW,CAAAE,EAAAhN,EAAA,EAAA,KAAA,CAC8B,OAA1CK,QAAQK,MAAM,4BAA4BsM,EAAApM,EAAA,GAAA,KAAA,EAWoB,OAPlEP,QAAQC,IAAI,yBAGZwM,EAAYR,UAAY,qFAAqFU,EAAAjN,EAAA,EAIxGM,QAAQC,IAAI,iDAAiD0M,EAAAhN,EAAA,EACvDnB,KAAKoO,cAAc/F,EAASC,EAAO2F,GAAY,KAAA,EACrDzM,QAAQC,IAAI,gCAAgC0M,EAAAhN,EAAA,EAAA,MAAA,KAAA,EAAAgN,EAAAjN,EAAA,EAAAgN,EAAAC,EAAAvM,EAG5CJ,QAAQK,MAAM,2BAA0BqM,GAGxC1M,QAAQC,IAAI,iCACZzB,KAAKqO,iBAAiBJ,EAAa5F,EAASC,GAAO,KAAA,EAAA,OAAA6F,EAAApM,EAAA,GAAA,EAAAiM,EAAAhO,KAAA,CAAA,CAAA,EAAA,IAE3D,IAAA,SAjCyBsO,EAAAC,GAAA,OAAAR,EAAA/L,MAAAhC,KAAAJ,UAAA,IAmC1B,CAAAY,IAAA,uBAAAC,OAAA+N,EAAA7N,EAAAC,IAAAC,EAGA,SAAA4N,EAA2BpG,EAASC,EAAO2F,GAAW,IAAAS,EAAAC,EAAAC,EAAA5O,KAAA,OAAAY,IAAAI,EAAA,SAAA6N,GAAA,cAAAA,EAAA1N,GAAA,KAAA,EAAA,OAAA0N,EAAA1N,EAAA,EAE5CnB,KAAK8O,sBAAqB,KAAA,EAAA,GAEV,oBAAXC,OAAsB,CAAAF,EAAA1N,EAAA,EAAA,KAAA,CAAA,MACvB,IAAI8B,MAAM,iCAAgC,KAAA,EAapD,OATMyL,EAASpB,SAASK,cAAc,WAC/BqB,MAAQ,IACfN,EAAOO,OAAS,KACVN,EAAMD,EAAOQ,WAAW,OAG1BC,UAAY,UAChBR,EAAIS,SAAS,EAAG,EAAG,IAAK,KAExBP,EAAA9M,EACO,EAAA,IAAIsN,QAAQ,SAACC,EAASC,GACzBR,OAAOS,SAASd,EAAQrG,EAAS,CAC7B2G,MAAO,IACPS,OAAQ,GACRC,MAAO,CACHC,KAAM,UACNC,MAAO,YAEZ,SAAC/N,GACA,GAAIA,EACA0N,EAAO1N,OADX,CAMA8M,EAAIQ,UAAY,UAChBR,EAAIkB,KAAO,kBACXlB,EAAImB,UAAY,SAChBnB,EAAIoB,SAASzH,EAAO,IAAK,KAGzB,IAAM0H,EAAUtB,EAAOuB,UAAU,aAGjCrB,EAAKlG,aAAesH,EAGpB/B,EAAYR,UAAS,qHAAAvK,OAED8M,EAEnB,iJAGDpB,EAAKsB,mBAAmBjC,GAExBqB,GAxBA,CAyBJ,EACH,IAAC,EAAAb,EAAAzO,KACL,IAAA,SA1DyBmQ,EAAAC,EAAAC,GAAA,OAAA7B,EAAAxM,MAAAhC,KAAAJ,UAAA,IA4D1B,CAAAY,IAAA,gBAAAC,OAAA6P,EAAA3P,EAAAC,IAAAC,EAGA,SAAA0P,EAAoBlI,EAASC,EAAO2F,GAAW,IAAAuC,EAAAC,EAAAC,EAAAtO,EAAAuO,EAAA9I,EAAA,OAAAjH,IAAAI,EAAA,SAAA4P,GAAA,cAAAA,EAAAzP,GAAA,KAAA,EAuCzC,OAnCGqP,EADAxQ,KAAKL,OAAOH,mBAELQ,KAAKL,OAAO1B,OAAOoB,SAAS,uBADlB,0CAGVW,KAAKL,OAAO1B,OAAOoB,SAAS,cAAgBW,KAAKL,OAAO1B,OAAOoB,SAAS,aAC9D,0CAEAW,KAAKL,OAAO1B,OAAS,eAG3CuD,QAAQC,IAAI,uBAAwB+O,GAM/BA,EAAenR,SAAS,mBAExBqR,EAAc,oCACdD,EAAc,IAAII,gBAAgB,CAC9B7D,KAAM3E,EACN4E,KAAM,IACNwC,OAAQ,GACRqB,iBAAkB,SAClBC,iBAAkB,aAItBL,EAAc,mBACdD,EAAc3N,KAAKC,UAAU,CACzB1E,KAAM2B,KAAKL,OAAOtB,KAClBoF,UAAWzD,KAAKL,OAAOxB,SACvBuF,UAAW1D,KAAKL,OAAOvB,SACvBiK,QAASA,EACTC,MAAOA,KAEdsI,EAAAzP,EAAA,EAEsBsB,MAAM+N,EAAgB,CACzC9N,OAAQ,OACRC,QAAS,CACL,eAAgB+N,EAChB9N,OAAU,oBAEdC,KAAM4N,IACR,KAAA,EAPY,IAARrO,EAAQwO,EAAAhP,GASDoB,GAAE,CAAA4N,EAAAzP,EAAA,EAAA,KAAA,CAAA,MACN,IAAI8B,MAAKC,gBAAAA,OAAiBd,EAASe,SAAS,KAAA,EAAA,OAAAyN,EAAAzP,EAAA,EAG3BiB,EAASgB,OAAM,KAAA,EAAxB,IAAZuN,EAAYC,EAAAhP,GAEayB,QAAO,CAAAuN,EAAAzP,EAAA,EAAA,KAAA,CAAA,MAC3B,IAAI8B,MAAKC,cAAAA,OAAeyN,EAAa9O,QAAQ,KAAA,EAOnDgG,EAFA2I,EAAenR,SAAS,kBAEXsR,EAAaK,SAIhB9N,GAAAA,OADW,2BACOA,OAAGyN,EAAarN,KAAKiG,QAIrDvJ,KAAK0I,aAAeb,EAGpBoG,EAAYR,UAAS,uGAAAvK,OAED2E,EAEnB,mIAGF7H,KAAKkQ,mBAAmBjC,GAAa,KAAA,EAAA,OAAA2C,EAAA7O,EAAA,GAAA,EAAAwO,EAAAvQ,KACxC,IAAA,SAnFkBiR,EAAAC,EAAAC,GAAA,OAAAb,EAAAtO,MAAAhC,KAAAJ,UAAA,IAqFnB,CAAAY,IAAA,mBAAAC,MAGA,SAAiBwN,EAAa5F,EAASC,GACnC2F,EAAYR,UAAS,omBAAAvK,OAQmCoF,EAAKpF,iGAAAA,OACgBmF,EAE5E,6CACL,GAEA,CAAA7H,IAAA,sBAAAC,OAAA2Q,EAAAzQ,EAAAC,IAAAC,EAGA,SAAAwQ,IAAA,OAAAzQ,IAAAI,EAAA,SAAAsQ,GAAA,cAAAA,EAAAnQ,GAAA,KAAA,EAAA,GAC0B,oBAAX4N,OAAsB,CAAAuC,EAAAnQ,EAAA,EAAA,KAAA,CACmB,OAAhDK,QAAQC,IAAI,oCAAoC6P,EAAAvP,EAAA,GACzC,GAAI,KAAA,EAGgC,OAA/CP,QAAQC,IAAI,mCAAmC6P,EAAAvP,EAExC,EAAA,IAAIsN,QAAQ,SAACC,EAASC,GACzB,IAAMgC,EAASjE,SAASK,cAAc,UACtC4D,EAAOC,IAAM,+DACbD,EAAOE,OAAS,WACZ1M,WAAW,WACe,oBAAXgK,QACPvN,QAAQC,IAAI,4BACZ6N,GAAQ,KAER9N,QAAQK,MAAM,4CACd0N,EAAO,IAAItM,MAAM,mDAExB,EAAE,MAEPsO,EAAOG,QAAU,WACblQ,QAAQK,MAAM,sCACd0N,EAAO,IAAItM,MAAM,sCAErBqK,SAASqE,KAAK9D,YAAY0D,EAC7B,IAAC,EAAAF,EACL,IAAA,WA5BwB,OAAAD,EAAApP,MAAAhC,KAAAJ,UAAA,IA8BzB,CAAAY,IAAA,qBAAAC,MAGA,SAAmBwN,GACf,IAAM2D,EAAsB3D,EAAY4D,cAAcC,cAAc,2BAC9DC,EAAgB9D,EAAY4D,cAAcC,cAAc,qBAE1DF,IACAA,EAAoBI,MAAMC,QAAU,QACpCL,EAAoBM,UAAUC,IAAI,oBAElCJ,IACAA,EAAcC,MAAMC,QAAU,QAC9BF,EAAcG,UAAUC,IAAI,mBAEpC,GAEA,CAAA3R,IAAA,kBAAAC,MAGA,SAAgBkO,EAAKyD,EAAGC,EAAGrD,EAAOC,GAC9B,IAEI,IAAMqD,EAAO,IAAIC,MACjBD,EAAKb,OAAS,WACV,IAAMe,EAAW,GACXC,EAAQL,GAAKpD,EAAQwD,GAAY,EACjCE,EAAQL,GAAKrD,EAAQwD,GAAY,EAGvC7D,EAAIQ,UAAY,QAChBR,EAAIS,SAASqD,EAAQ,EAAGC,EAAQ,EAAGF,GAAcA,IAGjD7D,EAAIgE,UAAUL,EAAMG,EAAOC,EAAOF,EAAUA,IAEhDF,EAAKd,IAAM,gBACd,CAAC,MAAO3P,GACLL,QAAQsD,KAAK,uBAAwBjD,EACzC,CACJ,GAEA,CAAArB,IAAA,uBAAAC,MAGA,WACIe,QAAQC,IAAI,uCACZ,IAAMwM,EAAcX,SAASC,eAAe,uBACxCU,IACAA,EAAYR,UAASvK,8SAAAA,OAIqD,oBAAX6L,sFAAsB7L,OACd,OAAhB+K,EAEtD,sDAET,GAEA,CAAAzN,IAAA,4BAAAC,MAGA,SAA0B+G,EAAanJ,GACnCmD,QAAQC,IAAG,0CAAAyB,OAA2CsE,EAAW,YAAAtE,OAAW7E,IAC5E,IAAMgP,EAAYC,SAASC,eAAe/F,GACrC6F,EAKLA,EAAUI,UAASvK,45BAAAA,OAiBC0P,OAAOvU,GAAMwU,cAGhC,sEAxBGrR,QAAQK,MAAK,aAAAqB,OAAcsE,iBAyBnC,GAEA,CAAAhH,IAAA,YAAAC,OAAAqS,EAAAnS,EAAAC,IAAAC,EAGA,SAAAkS,EAAgBvL,GAAW,IAAAC,EAAApF,EAAA2Q,EAAAC,EAAAC,EAAAtT,UAAA,OAAAgB,IAAAI,EAAA,SAAAmS,GAAA,cAAAA,EAAAjS,EAAAiS,EAAAhS,GAAA,KAAA,EAAc,GAAZsG,EAAOyL,EAAArT,OAAAqT,QAAApT,IAAAoT,EAAApT,GAAAoT,EAAG,GAAA,CAAA,EAAEC,EAAAjS,EAAA,GAG7BlB,KAAK0I,aAAY,CAAAyK,EAAAhS,EAAA,EAAA,KAAA,CAOjB,OANAK,QAAQC,IAAI,oDAMZ0R,EAAAhS,EAAA,EACqBnB,KAAKgK,WAAWxC,EAAaC,GAAQ,KAAA,EAA9C,OAANpF,EAAM8Q,EAAAvR,EAAAuR,EAAApR,EAAA,EACLM,GAAM,KAAA,EAE0D,OAAvEb,QAAQC,IAAI,0DAA2D0R,EAAAhS,EAAA,EAClDnB,KAAKgK,WAAWxC,EAAaC,GAAQ,KAAA,EAA9C,OAANpF,EAAM8Q,EAAAvR,EAAAuR,EAAApR,EAAA,EACLM,GAAM,KAAA,EAAA8Q,EAAAhS,EAAA,EAAA,MAAA,KAAA,EAI6C,MAJ7CgS,EAAAjS,EAAA,EAAA+R,EAAAE,EAAAvR,EAGjBJ,QAAQK,MAAM,mCAAoCoR,EAAMnR,SACxD9B,KAAKiJ,0BAA0BzB,EAAaxH,KAAKL,OAAOtB,MAAM4U,EAAA,KAAA,EAAA,OAAAE,EAAApR,EAAA,GAAA,EAAAgR,EAAA/S,KAAA,CAAA,CAAA,EAAA,IAGrE,IAAA,SAvBcoT,GAAA,OAAAN,EAAA9Q,MAAAhC,KAAAJ,UAAA,IAyBf,CAAAY,IAAA,mBAAAC,MAGA,SAAiB+G,EAAanJ,EAAMoJ,GAAS,IAAA4L,EAAArT,KACpCA,KAAKL,OAAOlB,cAGbuB,KAAKG,eACLmT,cAActT,KAAKG,cACnBqB,QAAQC,IAAI,kDAGhBzB,KAAKG,aAAeoT,YAAW5S,EAAAC,IAAAC,EAAC,SAAA2S,IAAA,IAAAC,EAAA,OAAA7S,IAAAI,EAAA,SAAA0S,GAAA,cAAAA,EAAAxS,EAAAwS,EAAAvS,GAAA,KAAA,EAEqC,OAFrCuS,EAAAxS,EAAA,EAExBM,QAAQC,IAAI,iDAAiDiS,EAAAvS,EAAA,EACvDkS,EAAKM,UAAUnM,EAAanJ,EAAMoJ,GAAQ,KAAA,EAAAiM,EAAAvS,EAAA,EAAA,MAAA,KAAA,EAAAuS,EAAAxS,EAAA,EAAAuS,EAAAC,EAAA9R,EAEhDJ,QAAQsD,KAAK,+CAA8C2O,GAAS,KAAA,EAAA,OAAAC,EAAA3R,EAAA,GAAA,EAAAyR,EAAA,KAAA,CAAA,CAAA,EAAA,IAE3E,IAAExT,KAAKL,OAAOjB,iBAEf8C,QAAQC,IAAG,yCAAAyB,OAA0ClD,KAAKL,OAAOjB,gBAAe,QACpF,GAOA,CAAA8B,IAAA,cAAAC,OAAAmT,EAAAjT,EAAAC,IAAAC,EAGA,SAAAgT,EAAkBC,EAAUxQ,GAAI,IAAAyQ,EAAAC,EAAAC,EAAAC,EAAAhO,EAAAiO,EAAAlV,EAAAmV,EAAAC,EAAAC,EAAAtU,KAAA,OAAAY,IAAAI,EAAA,SAAAuT,GAAA,cAAAA,EAAApT,GAAA,KAAA,EAAA,GAEvBnB,KAAKI,cAAa,CAAAmU,EAAApT,EAAA,EAAA,KAAA,CACwC,MAA3DnB,KAAKqB,iBAAiB,sBAAuB,CAAEyS,SAAAA,IACzC,IAAI7Q,MAAM,sBAAqB,KAAA,EAAA,IAIrCjD,KAAKL,OAAOR,WAAU,CAAAoV,EAAApT,EAAA,EAAA,KAAA,CACK,GAA3BnB,KAAKL,OAAOoE,iBACR/D,KAAKL,OAAOoE,aAAe/D,KAAKL,OAAOkE,aAAW,CAAA0Q,EAAApT,EAAA,EAAA,KAAA,CAI/C,MAHHnB,KAAKqB,iBAAiB,6BAA8B,CAChD0C,aAAc/D,KAAKL,OAAOoE,aAC1BF,YAAa7D,KAAKL,OAAOkE,cAEvB,IAAIZ,MAAM,+BAA8B,KAAA,EAKhDgR,EAAgBjU,KAAKwU,oBAAoBlR,GAG/C9B,QAAQC,IAAI,mCAAoCqS,GAChDtS,QAAQC,IAAI,iCAAkCzB,KAAKL,OAAO1B,QAC1DuD,QAAQC,IAAI,8BAA6B,GAAAyB,OAAKlD,KAAKL,OAAO1B,QAAMiF,OAAG4Q,IACnEtS,QAAQC,IAAI,+BAAgCqB,KAAKC,UAAUkR,EAAe,KAAM,IAChFzS,QAAQC,IAAI,qCAAsCzB,KAAKL,OAAOR,YAC9DqC,QAAQC,IAAI,wCAAyCzB,KAAKI,eAGpD8T,GAAkC,QAAnBH,EAAAnW,EAAOM,oBAAY,IAAA6V,GAAWA,QAAXA,EAAnBA,EAAqBU,iBAArBV,IAA8BA,OAA9BA,EAAAA,EAAiCD,EAASxU,QAAQ,IAAK,OAAQwU,EAC9E5N,EAAGhD,GAAAA,OAAMlD,KAAKL,OAAO1B,QAAMiF,OAAGgR,GAGpC1S,QAAQC,IAAI,4BAA6ByE,GACzC1E,QAAQC,IAAI,mBAAoByS,GAChC1S,QAAQC,IAAI,6BAA8BqB,KAAKC,UAA6BiR,QAApBA,EAACpW,EAAOM,wBAAY8V,SAAnBA,EAAqBS,YAG9EzU,KAAKqB,iBAAiB,oBAAqB,CACvCyS,SAAUI,EACVhO,IAAKA,EACLwO,SAAUC,OAAOC,KAAKX,GACtB9U,WAAYa,KAAKL,OAAOR,aAGxBgV,EAAa,EACXlV,EAAae,KAAKL,OAAOV,WAAUmV,EAAAxT,IAAAC,WAAAuT,IAAA,IAAAS,EAAAC,EAAAnS,EAAAP,EAAA2S,EAAAC,EAAA3S,EAAA4S,EAAA,OAAArU,IAAAI,EAAA,SAAAkU,GAAA,cAAAA,EAAAhU,EAAAgU,EAAA/T,GAAA,KAAA,EAgBjC,OAhBiC+T,EAAAhU,EAAA,EAI3B2T,EAAa,IAAIM,gBACjBL,EAAY/P,WAAW,WAAA,OAAM8P,EAAWO,OAAO,EAAEd,EAAK3U,OAAOT,gBAG7DyD,EAAU,CACZ,eAAgB,oBAOpBuS,EAAA/T,EAAA,EAEuBsB,MAAMyD,EAAK,CAC9BxD,OAAQ,OACRC,QAASA,EACTE,KAAMC,KAAKC,UAAUkR,GACrBoB,OAAQR,EAAWQ,SACrB,KAAA,EAEsB,GAPlBjT,EAAQ8S,EAAAtT,EAOd0T,aAAaR,GAER1S,EAASY,GAAE,CAAAkS,EAAA/T,EAAA,EAAA,KAAA,CAAA,OAAA+T,EAAA/T,EAAA,EACYiB,EAAS4K,OAAM,KAAA,EAAjC+H,EAASG,EAAAtT,EAEf,IACIoT,EAAYlS,KAAK0B,MAAMuQ,EAC1B,CAAC,MAAOQ,GACLP,EAAY,CAAElT,QAASiT,EAC3B,CAMG,MAJHT,EAAKjT,iBAAiB,oBAAqB,CACvC8B,OAAQf,EAASe,OACjBqS,WAAYpT,EAASoT,WACrB3T,MAAOmT,EAAUlT,UAGf,IAAImB,MAAM+R,EAAUlT,SAAOoB,gBAAAA,OAAoBd,EAASe,SAAS,KAAA,EAAA,OAAA+R,EAAA/T,EAAA,EAGtDiB,EAASgB,OAAM,KAAA,EAKjC,OALGf,EAAM6S,EAAAtT,EAEZ0S,EAAKjT,iBAAiB,sBAAuB,CACzCyS,SAAUI,EACVuB,aAAcd,OAAOC,KAAKvS,KAC3B6S,EAAAnT,EAAA,EAAA,CAAAH,EAEIS,IAAM,KAAA,EAGA,GAHA6S,EAAAhU,EAAA,EAAA+T,EAAAC,EAAAtT,EAGbuS,IAEmB,eAAfc,EAAMS,KAAqB,CAAAR,EAAA/T,EAAA,EAAA,KAAA,CACkC,GAA7DmT,EAAKjT,iBAAiB,sBAAuB,CAAE8S,WAAAA,MAC3CA,EAAalV,GAAU,CAAAiW,EAAA/T,EAAA,EAAA,KAAA,CAAA,MACjB,IAAI8B,MAAM,6BAA4B,KAAA,EAAA,OAAAiS,EAAAnT,EAAA,EAAA,GAAA,KAAA,EAAA,KAKhDoS,EAAalV,GAAU,CAAAiW,EAAA/T,EAAA,EAAA,KAAA,CAIpB,MAHHmT,EAAKjT,iBAAiB,0BAA2B,CAC7C8S,WAAAA,EACAtS,MAAOoT,EAAMnT,UACdmT,EAAA,KAAA,EAAA,OAAAC,EAAA/T,EAAA,EAKD,IAAIkO,QAAQ,SAAAC,GAAO,OAAIvK,WAAWuK,EAAS,IAAO6E,KAAY,KAAA,EAAA,OAAAe,EAAAnT,EAAA,GAAA,EAAAqS,EAAA,KAAA,CAAA,CAAA,EAAA,IAAA,GAAA,KAAA,EAAA,KAxErED,GAAclV,GAAU,CAAAsV,EAAApT,EAAA,EAAA,KAAA,CAAA,OAAAoT,EAAAoB,EAAAC,EAAAxB,KAAA,GAAA,KAAA,EAAA,GAAA,KAAAC,EAAAE,EAAA3S,GAAA,CAAA2S,EAAApT,EAAA,EAAA,KAAA,CAAA,OAAAoT,EAAAxS,EAAA,EAAA,GAAA,KAAA,EAAA,IAAAsS,EAAA,CAAAE,EAAApT,EAAA,EAAA,KAAA,CAAA,OAAAoT,EAAAxS,EAAAsS,EAAAA,EAAAzS,GAAA,KAAA,EAAA2S,EAAApT,EAAA,EAAA,MAAA,KAAA,EAAA,OAAAoT,EAAAxS,EAAA,GAAA,EAAA8R,EAAA7T,KA2ElC,IAAA,SA7HgB6V,EAAAC,GAAA,OAAAlC,EAAA5R,MAAAhC,KAAAJ,UAAA,IA+HjB,CAAAY,IAAA,sBAAAC,MAGA,SAAoB6C,GAGhB,IAFA,IAAMyS,EAAY,CAAA,EAElBC,EAAAC,EAAAA,EAA2BtB,OAAOuB,QAAQ5S,GAAK0S,EAAAC,EAAApW,OAAAmW,IAAE,CAA5C,IAAAG,EAAAhS,EAAA8R,EAAAD,GAAA,GAAOxV,EAAG2V,EAAA,GAAE1V,EAAK0V,EAAA,GACG,iBAAV1V,EACPsV,EAAUvV,GAAOR,KAAKoW,cAAc3V,GACZ,WAAjB4V,EAAO5V,IAAgC,OAAVA,EACpCsV,EAAUvV,GAAOR,KAAKwU,oBAAoB/T,GAE1CsV,EAAUvV,GAAOC,CAEzB,CAqBA,OAjBAsV,EAAUtS,UAAYzD,KAAKL,OAAOoH,kBAAoB/G,KAAKL,OAAOxB,SAClE4X,EAAUrS,UAAY1D,KAAKL,OAAOqH,kBAAoBhH,KAAKL,OAAOvB,SAGlEoD,QAAQC,IAAI,sDAAuDzB,KAAKL,OAAOxB,UAC/EqD,QAAQC,IAAI,sDAAuDzB,KAAKL,OAAOvB,SAAW,MAAQ4B,KAAKL,OAAOvB,SAASsD,OAAO,GAAK,QACnIF,QAAQC,IAAI,+DAAgEsU,EAAUtS,WACtFjC,QAAQC,IAAI,+DAAgEsU,EAAUrS,UAAY,MAAQqS,EAAUrS,UAAUhC,OAAO,GAAK,QAC1IF,QAAQC,IAAI,0DAA2DqB,KAAKC,UAAUgT,EAAW,KAAM,IAGvGvU,QAAQC,IAAI,sDAAuDzB,KAAKL,OAAOxB,UAC/EqD,QAAQC,IAAI,sDAAuDzB,KAAKL,OAAOvB,SAAW,MAAQ4B,KAAKL,OAAOvB,SAASsD,OAAO,GAAK,QACnIF,QAAQC,IAAI,+DAAgEsU,EAAUtS,WACtFjC,QAAQC,IAAI,+DAAgEsU,EAAUrS,UAAY,MAAQqS,EAAUrS,UAAUhC,OAAO,GAAK,QAC1IF,QAAQC,IAAI,0DAA2DqB,KAAKC,UAAUgT,EAAW,KAAM,IAEhGA,CACX,GAEA,CAAAvV,IAAA,oBAAAC,MAGA,WACI,MAAO,OAASiE,KAAKC,MAAQ,IAAM2R,KAAKC,SAASC,SAAS,IAAIC,OAAO,EAAG,EAC5E,GAEA,CAAAjW,IAAA,sBAAAC,MAGA,WACI,IAAM+F,EAAY9B,KAAKC,MACjB4R,EAASD,KAAKC,SAASC,SAAS,IAAIC,OAAO,EAAG,GAC9CjN,KAAItG,OAAMsD,EAAStD,KAAAA,OAAIqT,GAC7B,OAAOG,KAAKlN,EAChB,GAEA,CAAAhJ,IAAA,mBAAAC,OAAAkW,EAAAhW,EAAAC,IAAAC,EAGA,SAAA+V,IAAA,IAAAxU,EAAAyU,EAAAC,EAAA,OAAAlW,IAAAI,EAAA,SAAA+V,GAAA,cAAAA,EAAA7V,EAAA6V,EAAA5V,GAAA,KAAA,EAAA,OAAA4V,EAAA7V,EAAA,EAAA6V,EAAA5V,EAAA,EAE+BnB,KAAKoI,YAAY,SAAU,CAC9C/J,KAAM2B,KAAKL,OAAOtB,KAClBoF,UAAWzD,KAAKL,OAAOxB,SACvBuF,UAAW1D,KAAKL,OAAOvB,WACzB,KAAA,EAJIgE,EAAQ2U,EAAAnV,EAMdJ,QAAQC,IAAI,wBAAyBW,GAEjCA,EAASiB,SAAWjB,EAAS4U,gBAAkB5U,EAAS4U,eAAeC,WACjEJ,EAAWzU,EAAS4U,eAAeC,UACzCjX,KAAKL,OAAOuX,UAAYL,EAASM,WAG7B/U,EAASqH,WACTzJ,KAAKL,OAAOuL,UAAY9I,EAASqH,WAGjCzJ,KAAKL,OAAOuL,UAAY2L,EAASM,WAKT,KAAxBN,EAASM,WACTnX,KAAKL,OAAOrB,YAAc,QAE1B0B,KAAKL,OAAOrB,YAAW,WAAA4E,OAAc2T,EAASM,YAGlD3V,QAAQC,IAAI,wCAAyC,CACjDnD,YAAa0B,KAAKL,OAAOrB,YACzB4Y,UAAWlX,KAAKL,OAAOuX,UACvBhM,UAAWlL,KAAKL,OAAOuL,cAG3B1J,QAAQsD,KAAK,wFACb9E,KAAKL,OAAOrB,uBAAW4E,OAAclD,KAAKL,OAAOuX,WAAa,YACjEH,EAAA5V,EAAA,EAAA,MAAA,KAAA,EAAA4V,EAAA7V,EAAA,EAAA4V,EAAAC,EAAAnV,EAEDJ,QAAQsD,KAAK,oEAAqEgS,EAAMhV,SACxF9B,KAAKL,OAAOrB,YAAc,kBAAkB,KAAA,EAAA,OAAAyY,EAAAhV,EAAA,GAAA,EAAA6U,EAAA5W,KAAA,CAAA,CAAA,EAAA,IAEnD,IAAA,WA3CqB,OAAA2W,EAAA3U,MAAAhC,KAAAJ,UAAA,IA6CtB,CAAAY,IAAA,aAAAC,MAGA,SAAWlC,GACP,IAAM8O,EAAYC,SAASwE,cAAc,mBACrCzE,IACAA,EAAUO,UAAS,+BAAA1K,OAAkC3E,GAE7D,GAEA,CAAAiC,IAAA,cAAAC,MAGA,SAAYoB,GACRL,QAAQK,MAAM,oBAAqBA,GAE/B7B,KAAKL,OAAOf,SACZoB,KAAKL,OAAOf,QAAQiD,EAE5B,GAEA,CAAArB,IAAA,mBAAAC,OAAA2W,EAAAzW,EAAAC,IAAAC,EAGA,SAAAwW,IAAA,IAAAlU,EAAAmU,EAAAC,EAAAC,EAAA,OAAA5W,IAAAI,EAAA,SAAAyW,GAAA,cAAAA,EAAAvW,EAAAuW,EAAAtW,GAAA,KAAA,EAOI,OANMgC,EAAS,CACXuU,KAAK,EACLC,WAAW,EACXC,OAAO,GAGXH,EAAAvW,EAAA,EAAAuW,EAAAtW,EAAA,EAE+BsB,MAAMzC,KAAKL,OAAO1B,OAAS,SAAU,CAC5DyE,OAAQ,MACRmV,QAAS,MACX,KAAA,EAHgB,KAAZP,EAAYG,EAAA7V,GAKDoB,GAAE,CAAAyU,EAAAtW,EAAA,EAAA,KAAA,CAAA,OAAAsW,EAAAtW,EAAA,EACSmW,EAAalU,OAAM,KAAA,EAArCmU,EAASE,EAAA7V,EACfuB,EAAOuU,IAA2B,gBAArBH,EAAUpU,OACvB3B,QAAQC,IAAI,iBAAkB8V,EAAUpU,QAAQsU,EAAAtW,EAAA,EAAA,MAAA,KAAA,EAEhDgC,EAAOuU,KAAM,EAAM,KAAA,EAAAD,EAAAtW,EAAA,EAAA,MAAA,KAAA,EAAAsW,EAAAvW,EAAA,EAAAsW,EAAAC,EAAA7V,EAGvBJ,QAAQC,IAAI,sBAAuB+V,EAAM1V,SACzCqB,EAAOuU,KAAM,EAAM,KAAA,EAOG,OAH1BvU,EAAOwU,UAAY3X,KAAKK,QAAUL,KAAKK,OAAOmF,UAG9CrC,EAAOyU,MAAQzU,EAAOuU,IAAID,EAAA1V,EAAA,EAEnBoB,GAAM,EAAAkU,EAAArX,KAAA,CAAA,CAAA,EAAA,IAChB,IAAA,WAjCqB,OAAAoX,EAAApV,MAAAhC,KAAAJ,UAAA,IAmCtB,CAAAY,IAAA,qBAAAC,OAAAqX,EAAAnX,EAAAC,IAAAC,EAGA,SAAAkX,IAAA,IAAAF,EAAAG,EAAA7U,EAAA8U,EAAArY,UAAA,OAAAgB,IAAAI,EAAA,SAAAkX,GAAA,cAAAA,EAAA/W,GAAA,KAAA,EAAyB0W,EAAOI,EAAApY,OAAA,QAAAC,IAAAmY,EAAA,GAAAA,EAAA,GAAG,IACzBD,EAAYtT,KAAKC,MAAK,KAAA,EAAA,KAErBD,KAAKC,MAAQqT,EAAYH,GAAO,CAAAK,EAAA/W,EAAA,EAAA,KAAA,CAAA,OAAA+W,EAAA/W,EAAA,EACdnB,KAAKmY,mBAAkB,KAAA,EAAhC,KAANhV,EAAM+U,EAAAtW,GAEDgW,MAAK,CAAAM,EAAA/W,EAAA,EAAA,KAAA,CACuB,OAAnCK,QAAQC,IAAI,uBAAuByW,EAAAnW,EAAA,EAC5BoB,GAAM,KAAA,EAG8B,OAA/C3B,QAAQC,IAAI,0BAA2B0B,GAAQ+U,EAAA/W,EAAA,EACzC,IAAIkO,QAAQ,SAAAC,GAAO,OAAIvK,WAAWuK,EAAS,OAAM,KAAA,EAAA4I,EAAA/W,EAAA,EAAA,MAAA,KAAA,EAAA,MAGrD,IAAI8B,MAAM,yDAAwD,KAAA,EAAA,OAAAiV,EAAAnW,EAAA,GAAA,EAAAgW,EAAA/X,KAC3E,IAAA,WAhBuB,OAAA8X,EAAA9V,MAAAhC,KAAAJ,UAAA,IAkBxB,CAAAY,IAAA,YAAAC,MAGA,WAEI,OAAIT,KAAK0I,aACE1I,KAAK0I,aAIT,IACX,GAEA,CAAAlI,IAAA,UAAAC,MAGA,WACIT,KAAKoY,kBAGDpY,KAAKK,SACLL,KAAKK,OAAOgY,aACZrY,KAAKK,OAAS,KACdmB,QAAQC,IAAI,4BAGhBzB,KAAKI,eAAgB,EACrBJ,KAAKqB,iBAAiB,eACtBG,QAAQC,IAAI,qBAChB,GAEA,CAAAjB,IAAA,kBAAAC,MAGA,WACQT,KAAKG,eACLmT,cAActT,KAAKG,cACnBH,KAAKG,aAAe,KACpBqB,QAAQC,IAAI,uCAEpB,GAEA,CAAAjB,IAAA,kBAAAC,MAGA,WACI,OAAO7C,EAAOkJ,oBAAsB,EACxC,GAEA,CAAAtG,IAAA,oBAAAC,MAGA,WACI7C,EAAOkJ,mBAAqB,GAC5B9G,KAAKqB,iBAAiB,wBAC1B,iGA5EAyW,EAtCAV,EArEAT,EAzLA/C,EAzDAd,EA/HA1B,EA1GAd,EA/DA9B,EAtCAT,EAhGApB,EAzBAV,EA/BAZ,EAxBAP,EA1BmBL,EAJCP,EADpBN,EAxDAV,EA/HA5B,EA5VArF,EAnDAvB,EAZQ,GA4hDZ9C,EAAO8B,OAASA,EAChB9B,EAAO0a,eAAiB,KAGxB1a,EAAO2a,WAAa,SAAS5Y,GACzB,IAEI,OADA/B,EAAO0a,eAAiB,IAAI5Y,EAAOC,GAC5B/B,EAAO0a,cACjB,CAAC,MAAOzW,GAEL,MADAL,QAAQK,MAAM,6CAA+CA,GACvDA,CACV,EAGP,CAllDD,CAklDGjE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sunuid-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.34",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "SDK JavaScript pour l'intégration des QR codes d'authentification et KYC SunuID",
|
|
6
6
|
"main": "dist/sunuid-sdk.js",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"lint": "eslint src/**/*.js",
|
|
20
20
|
"format": "prettier --write src/**/*.js",
|
|
21
21
|
"serve": "python3 -m http.server 8080",
|
|
22
|
-
"demo": "open
|
|
22
|
+
"demo": "open http://localhost:8080/examples/demo.html"
|
|
23
23
|
},
|
|
24
24
|
"keywords": [
|
|
25
25
|
"sunuid",
|