@signiphi/pdf-signer 0.2.0-beta.2 → 0.2.0-beta.21

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.
Files changed (197) hide show
  1. package/assets/viewer.html +1 -5
  2. package/dist/components/index.js +2746 -901
  3. package/dist/components/index.js.map +1 -1
  4. package/dist/components/index.mjs +2513 -669
  5. package/dist/components/index.mjs.map +1 -1
  6. package/dist/core/index.js +420 -20
  7. package/dist/core/index.js.map +1 -1
  8. package/dist/core/index.mjs +420 -20
  9. package/dist/core/index.mjs.map +1 -1
  10. package/dist/hooks/index.js +506 -211
  11. package/dist/hooks/index.js.map +1 -1
  12. package/dist/hooks/index.mjs +507 -212
  13. package/dist/hooks/index.mjs.map +1 -1
  14. package/dist/index.css +214 -191
  15. package/dist/index.css.map +1 -1
  16. package/dist/index.js +3019 -893
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.mjs +2762 -653
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/styles/index.css +202 -172
  21. package/dist/types/index.js.map +1 -1
  22. package/dist/types/index.mjs.map +1 -1
  23. package/dist/utils/index.js +792 -147
  24. package/dist/utils/index.js.map +1 -1
  25. package/dist/utils/index.mjs +777 -148
  26. package/dist/utils/index.mjs.map +1 -1
  27. package/package.json +2 -2
  28. package/scripts/copy-utils.js +14 -3
  29. package/src/styles/index.css +33 -3
  30. package/dist/__tests__/helpers/fixtures.d.ts +0 -43
  31. package/dist/__tests__/helpers/fixtures.d.ts.map +0 -1
  32. package/dist/__tests__/helpers/mocks.d.ts +0 -333
  33. package/dist/__tests__/helpers/mocks.d.ts.map +0 -1
  34. package/dist/__tests__/setup.d.ts +0 -6
  35. package/dist/__tests__/setup.d.ts.map +0 -1
  36. package/dist/components/AcknowledgementModal.d.ts +0 -21
  37. package/dist/components/AcknowledgementModal.d.ts.map +0 -1
  38. package/dist/components/AcknowledgementsSidebar.d.ts +0 -22
  39. package/dist/components/AcknowledgementsSidebar.d.ts.map +0 -1
  40. package/dist/components/AttachmentUpload.d.ts +0 -17
  41. package/dist/components/AttachmentUpload.d.ts.map +0 -1
  42. package/dist/components/EditableFieldsPanel.d.ts +0 -30
  43. package/dist/components/EditableFieldsPanel.d.ts.map +0 -1
  44. package/dist/components/ErrorBoundary.d.ts +0 -67
  45. package/dist/components/ErrorBoundary.d.ts.map +0 -1
  46. package/dist/components/FormFieldsView.d.ts +0 -46
  47. package/dist/components/FormFieldsView.d.ts.map +0 -1
  48. package/dist/components/InitialsModal.d.ts +0 -16
  49. package/dist/components/InitialsModal.d.ts.map +0 -1
  50. package/dist/components/PdfViewerStyled.d.ts +0 -16
  51. package/dist/components/PdfViewerStyled.d.ts.map +0 -1
  52. package/dist/components/PoweredBySigniphi.d.ts +0 -11
  53. package/dist/components/PoweredBySigniphi.d.ts.map +0 -1
  54. package/dist/components/RequiredFieldNavigation.d.ts +0 -18
  55. package/dist/components/RequiredFieldNavigation.d.ts.map +0 -1
  56. package/dist/components/SignatureCanvas.d.ts +0 -12
  57. package/dist/components/SignatureCanvas.d.ts.map +0 -1
  58. package/dist/components/SignatureInitialsBox.d.ts +0 -25
  59. package/dist/components/SignatureInitialsBox.d.ts.map +0 -1
  60. package/dist/components/SignatureModal.d.ts +0 -21
  61. package/dist/components/SignatureModal.d.ts.map +0 -1
  62. package/dist/components/SigningInstructions.d.ts +0 -12
  63. package/dist/components/SigningInstructions.d.ts.map +0 -1
  64. package/dist/components/SubmissionForm.d.ts +0 -52
  65. package/dist/components/SubmissionForm.d.ts.map +0 -1
  66. package/dist/components/UnacknowledgedFieldsModal.d.ts +0 -23
  67. package/dist/components/UnacknowledgedFieldsModal.d.ts.map +0 -1
  68. package/dist/components/ViewToggleToolbar.d.ts +0 -38
  69. package/dist/components/ViewToggleToolbar.d.ts.map +0 -1
  70. package/dist/components/form-fields/CheckboxRenderer.d.ts +0 -10
  71. package/dist/components/form-fields/CheckboxRenderer.d.ts.map +0 -1
  72. package/dist/components/form-fields/DateFieldRenderer.d.ts +0 -14
  73. package/dist/components/form-fields/DateFieldRenderer.d.ts.map +0 -1
  74. package/dist/components/form-fields/DropdownRenderer.d.ts +0 -14
  75. package/dist/components/form-fields/DropdownRenderer.d.ts.map +0 -1
  76. package/dist/components/form-fields/FormFieldRenderer.d.ts +0 -22
  77. package/dist/components/form-fields/FormFieldRenderer.d.ts.map +0 -1
  78. package/dist/components/form-fields/InitialsFieldRenderer.d.ts +0 -16
  79. package/dist/components/form-fields/InitialsFieldRenderer.d.ts.map +0 -1
  80. package/dist/components/form-fields/RadioGroupRenderer.d.ts +0 -10
  81. package/dist/components/form-fields/RadioGroupRenderer.d.ts.map +0 -1
  82. package/dist/components/form-fields/SignatureFieldRenderer.d.ts +0 -16
  83. package/dist/components/form-fields/SignatureFieldRenderer.d.ts.map +0 -1
  84. package/dist/components/form-fields/TextFieldRenderer.d.ts +0 -14
  85. package/dist/components/form-fields/TextFieldRenderer.d.ts.map +0 -1
  86. package/dist/components/form-fields/TextLabelRenderer.d.ts +0 -14
  87. package/dist/components/form-fields/TextLabelRenderer.d.ts.map +0 -1
  88. package/dist/components/form-fields/index.d.ts +0 -14
  89. package/dist/components/form-fields/index.d.ts.map +0 -1
  90. package/dist/components/index.d.ts +0 -17
  91. package/dist/components/index.d.ts.map +0 -1
  92. package/dist/core/PdfViewerCore.d.ts +0 -19
  93. package/dist/core/PdfViewerCore.d.ts.map +0 -1
  94. package/dist/core/SignatureCaptureCore.d.ts +0 -37
  95. package/dist/core/SignatureCaptureCore.d.ts.map +0 -1
  96. package/dist/core/index.d.ts +0 -3
  97. package/dist/core/index.d.ts.map +0 -1
  98. package/dist/hooks/index.d.ts +0 -9
  99. package/dist/hooks/index.d.ts.map +0 -1
  100. package/dist/hooks/useAcknowledgements.d.ts +0 -50
  101. package/dist/hooks/useAcknowledgements.d.ts.map +0 -1
  102. package/dist/hooks/useAttachments.d.ts +0 -25
  103. package/dist/hooks/useAttachments.d.ts.map +0 -1
  104. package/dist/hooks/useFieldFiltering.d.ts +0 -29
  105. package/dist/hooks/useFieldFiltering.d.ts.map +0 -1
  106. package/dist/hooks/useFormFields.d.ts +0 -23
  107. package/dist/hooks/useFormFields.d.ts.map +0 -1
  108. package/dist/hooks/useMultiSignerContext.d.ts +0 -25
  109. package/dist/hooks/useMultiSignerContext.d.ts.map +0 -1
  110. package/dist/hooks/usePdfViewer.d.ts +0 -52
  111. package/dist/hooks/usePdfViewer.d.ts.map +0 -1
  112. package/dist/hooks/useRequiredFieldNavigation.d.ts +0 -16
  113. package/dist/hooks/useRequiredFieldNavigation.d.ts.map +0 -1
  114. package/dist/hooks/useSignatureCapture.d.ts +0 -17
  115. package/dist/hooks/useSignatureCapture.d.ts.map +0 -1
  116. package/dist/hooks/useSignatures.d.ts +0 -29
  117. package/dist/hooks/useSignatures.d.ts.map +0 -1
  118. package/dist/index.d.ts +0 -17
  119. package/dist/index.d.ts.map +0 -1
  120. package/dist/integrations/index.d.ts +0 -6
  121. package/dist/integrations/index.d.ts.map +0 -1
  122. package/dist/integrations/next-config.d.ts +0 -46
  123. package/dist/integrations/next-config.d.ts.map +0 -1
  124. package/dist/integrations/vite-plugin.d.ts +0 -48
  125. package/dist/integrations/vite-plugin.d.ts.map +0 -1
  126. package/dist/lib/index.d.ts +0 -3
  127. package/dist/lib/index.d.ts.map +0 -1
  128. package/dist/lib/ui/accordion.d.ts +0 -8
  129. package/dist/lib/ui/accordion.d.ts.map +0 -1
  130. package/dist/lib/ui/alert.d.ts +0 -9
  131. package/dist/lib/ui/alert.d.ts.map +0 -1
  132. package/dist/lib/ui/button.d.ts +0 -12
  133. package/dist/lib/ui/button.d.ts.map +0 -1
  134. package/dist/lib/ui/calendar.d.ts +0 -10
  135. package/dist/lib/ui/calendar.d.ts.map +0 -1
  136. package/dist/lib/ui/card.d.ts +0 -9
  137. package/dist/lib/ui/card.d.ts.map +0 -1
  138. package/dist/lib/ui/checkbox.d.ts +0 -5
  139. package/dist/lib/ui/checkbox.d.ts.map +0 -1
  140. package/dist/lib/ui/dialog.d.ts +0 -20
  141. package/dist/lib/ui/dialog.d.ts.map +0 -1
  142. package/dist/lib/ui/index.d.ts +0 -13
  143. package/dist/lib/ui/index.d.ts.map +0 -1
  144. package/dist/lib/ui/input.d.ts +0 -6
  145. package/dist/lib/ui/input.d.ts.map +0 -1
  146. package/dist/lib/ui/label.d.ts +0 -6
  147. package/dist/lib/ui/label.d.ts.map +0 -1
  148. package/dist/lib/ui/popover.d.ts +0 -7
  149. package/dist/lib/ui/popover.d.ts.map +0 -1
  150. package/dist/lib/ui/radio-group.d.ts +0 -6
  151. package/dist/lib/ui/radio-group.d.ts.map +0 -1
  152. package/dist/lib/ui/select.d.ts +0 -14
  153. package/dist/lib/ui/select.d.ts.map +0 -1
  154. package/dist/lib/utils.d.ts +0 -7
  155. package/dist/lib/utils.d.ts.map +0 -1
  156. package/dist/types/index.d.ts +0 -278
  157. package/dist/types/index.d.ts.map +0 -1
  158. package/dist/utils/attachment-validators.d.ts +0 -118
  159. package/dist/utils/attachment-validators.d.ts.map +0 -1
  160. package/dist/utils/audit-trail.d.ts +0 -27
  161. package/dist/utils/audit-trail.d.ts.map +0 -1
  162. package/dist/utils/date-validation.d.ts +0 -30
  163. package/dist/utils/date-validation.d.ts.map +0 -1
  164. package/dist/utils/errors.d.ts +0 -106
  165. package/dist/utils/errors.d.ts.map +0 -1
  166. package/dist/utils/field-extraction.d.ts +0 -36
  167. package/dist/utils/field-extraction.d.ts.map +0 -1
  168. package/dist/utils/field-visibility.d.ts +0 -104
  169. package/dist/utils/field-visibility.d.ts.map +0 -1
  170. package/dist/utils/index.d.ts +0 -18
  171. package/dist/utils/index.d.ts.map +0 -1
  172. package/dist/utils/logger.d.ts +0 -16
  173. package/dist/utils/logger.d.ts.map +0 -1
  174. package/dist/utils/pdf-field-type-helpers.d.ts +0 -78
  175. package/dist/utils/pdf-field-type-helpers.d.ts.map +0 -1
  176. package/dist/utils/pdf-helpers.d.ts +0 -38
  177. package/dist/utils/pdf-helpers.d.ts.map +0 -1
  178. package/dist/utils/pdf-lib-loader.d.ts +0 -45
  179. package/dist/utils/pdf-lib-loader.d.ts.map +0 -1
  180. package/dist/utils/pdf-manipulation.d.ts +0 -93
  181. package/dist/utils/pdf-manipulation.d.ts.map +0 -1
  182. package/dist/utils/pdf-metadata.d.ts +0 -41
  183. package/dist/utils/pdf-metadata.d.ts.map +0 -1
  184. package/dist/utils/pdf-validators.d.ts +0 -149
  185. package/dist/utils/pdf-validators.d.ts.map +0 -1
  186. package/dist/utils/pdf-viewer-filter.d.ts +0 -35
  187. package/dist/utils/pdf-viewer-filter.d.ts.map +0 -1
  188. package/dist/utils/pdf-widget-helpers.d.ts +0 -98
  189. package/dist/utils/pdf-widget-helpers.d.ts.map +0 -1
  190. package/dist/utils/pdfjs-config.d.ts +0 -56
  191. package/dist/utils/pdfjs-config.d.ts.map +0 -1
  192. package/dist/utils/pdfjs-version-check.d.ts +0 -28
  193. package/dist/utils/pdfjs-version-check.d.ts.map +0 -1
  194. package/dist/utils/performance-monitor.d.ts +0 -172
  195. package/dist/utils/performance-monitor.d.ts.map +0 -1
  196. package/dist/utils/tracking.d.ts +0 -89
  197. package/dist/utils/tracking.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/pdfjs-config.ts","../../src/utils/pdfjs-version-check.ts","../../src/utils/logger.ts","../../src/core/PdfViewerCore.tsx","../../src/core/SignatureCaptureCore.tsx"],"names":["pdfjsLib2","forwardRef","useRef","useState","useEffect","useCallback","useImperativeHandle","jsx","Fragment"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * PDF.js Configuration Provider\r\n * Manages global configuration for PDF.js worker and viewer paths\r\n * \r\n * COMPATIBILITY NOTE: This module is designed to work with both Vite and Next.js/webpack.\r\n * The worker source URL is computed lazily to avoid issues with webpack's handling of import.meta.\r\n */\r\n\r\nimport type { PdfJsConfig } from '../types';\r\nimport * as pdfjsLib from 'pdfjs-dist';\r\n\r\n/**\r\n * CDN paths for PDF.js (exported for manual fallback configuration)\r\n * Note: CDN URLs may cause CORS issues in some environments\r\n * \r\n * @example\r\n * // Manually configure CDN (not recommended)\r\n * setPdfJsConfig({ \r\n * viewerBasePath: CDN_VIEWER,\r\n * workerSrc: CDN_WORKER \r\n * });\r\n */\r\nexport const CDN_WORKER = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@5.3.93/build/pdf.worker.mjs';\r\nexport const CDN_VIEWER = 'https://mozilla.github.io/pdf.js';\r\n\r\n/**\r\n * Internal flag to track if worker source has been computed\r\n */\r\nlet _workerSrcComputed = false;\r\nlet _cachedWorkerSrc: string | null = null;\r\n\r\n/**\r\n * Get the worker source URL (computed lazily to avoid webpack import.meta issues)\r\n * - In browser environments, the bundler resolves the URL from node_modules\r\n * - The worker is loaded from the user's bundle (no CORS issues)\r\n * \r\n * This function uses lazy evaluation to avoid triggering webpack's\r\n * \"Critical dependency: Accessing import.meta directly is unsupported\" warning\r\n * at module load time.\r\n */\r\nfunction getDefaultWorkerSrc(): string {\r\n // Return cached value if already computed\r\n if (_workerSrcComputed && _cachedWorkerSrc !== null) {\r\n return _cachedWorkerSrc;\r\n }\r\n\r\n // Default fallback\r\n let workerSrc = '/pdfjs/build/pdf.worker.mjs';\r\n\r\n // Only attempt import.meta resolution in browser environment\r\n if (typeof window !== 'undefined' && typeof URL !== 'undefined') {\r\n try {\r\n // Check if import.meta is available (ESM environment like Vite)\r\n // Use indirect access to avoid webpack static analysis issues\r\n const meta = (function() {\r\n try {\r\n // This pattern avoids webpack's direct import.meta detection\r\n return new Function('return import.meta')();\r\n } catch {\r\n return null;\r\n }\r\n })();\r\n\r\n if (meta && meta.url) {\r\n workerSrc = new URL('pdfjs-dist/build/pdf.worker.mjs', meta.url).href;\r\n }\r\n } catch {\r\n // Fallback for environments that don't support import.meta.url (Next.js/webpack)\r\n // Use the public path fallback\r\n }\r\n }\r\n\r\n // Cache the result\r\n _workerSrcComputed = true;\r\n _cachedWorkerSrc = workerSrc;\r\n\r\n return workerSrc;\r\n}\r\n\r\n/**\r\n * Default configuration for PDF.js\r\n * \r\n * By default, the package uses:\r\n * - Worker: Loaded from node_modules (bundled by your build tool)\r\n * - Viewer: Served from /pdfjs/ (automatically copied by postinstall)\r\n * \r\n * The postinstall script automatically copies viewer files to your public/pdfjs/ directory.\r\n * If setup fails, run: npx signiphi-setup\r\n * \r\n * NOTE: workerSrc is initialized to null and computed lazily on first access\r\n * to ensure compatibility with Next.js/webpack environments.\r\n */\r\nlet globalConfig: Required<PdfJsConfig> = {\r\n viewerBasePath: '/pdfjs',\r\n workerSrc: '', // Lazy-initialized below\r\n};\r\n\r\n// Flag to track if globalConfig.workerSrc has been initialized\r\nlet _configInitialized = false;\r\n\r\n/**\r\n * Ensure config is initialized (called lazily)\r\n */\r\nfunction ensureConfigInitialized(): void {\r\n if (!_configInitialized) {\r\n globalConfig.workerSrc = getDefaultWorkerSrc();\r\n _configInitialized = true;\r\n \r\n // Initialize PDF.js worker in browser environment\r\n if (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = globalConfig.workerSrc;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Set PDF.js configuration\r\n * @param config - Partial configuration to merge with defaults\r\n * \r\n * @example\r\n * // Use self-hosted PDF.js files\r\n * setPdfJsConfig({ viewerBasePath: '/pdfjs' });\r\n * \r\n * @example\r\n * // Use custom CDN\r\n * setPdfJsConfig({ \r\n * viewerBasePath: 'https://my-cdn.com/pdfjs',\r\n * workerSrc: 'https://my-cdn.com/pdfjs/build/pdf.worker.mjs'\r\n * });\r\n */\r\nexport function setPdfJsConfig(config: Partial<PdfJsConfig>): void {\r\n // Ensure default config is computed first\r\n ensureConfigInitialized();\r\n \r\n if (config.viewerBasePath !== undefined) {\r\n globalConfig.viewerBasePath = config.viewerBasePath;\r\n }\r\n \r\n if (config.workerSrc !== undefined) {\r\n globalConfig.workerSrc = config.workerSrc;\r\n } else if (config.viewerBasePath !== undefined) {\r\n // Auto-update workerSrc based on viewerBasePath\r\n globalConfig.workerSrc = `${config.viewerBasePath}/build/pdf.worker.mjs`;\r\n }\r\n\r\n // Update PDF.js worker if in browser environment\r\n if (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = globalConfig.workerSrc;\r\n }\r\n}\r\n\r\n/**\r\n * Get current PDF.js configuration\r\n * @returns Current configuration\r\n */\r\nexport function getPdfJsConfig(): Required<PdfJsConfig> {\r\n // Ensure config is initialized before returning\r\n ensureConfigInitialized();\r\n return { ...globalConfig };\r\n}\r\n\r\n/**\r\n * Reset configuration to defaults (local files)\r\n */\r\nexport function resetPdfJsConfig(): void {\r\n // Clear cached worker src to force recomputation\r\n _workerSrcComputed = false;\r\n _cachedWorkerSrc = null;\r\n _configInitialized = false;\r\n \r\n // Re-initialize with fresh defaults\r\n ensureConfigInitialized();\r\n}\r\n\r\n/**\r\n * Initialize PDF.js configuration\r\n * This is called automatically when the first PDF operation is attempted,\r\n * but can also be called manually to pre-initialize the configuration.\r\n * \r\n * Unlike previous versions, this does NOT run at module load time to\r\n * ensure compatibility with Next.js/webpack environments.\r\n */\r\nexport function initializePdfJs(): void {\r\n ensureConfigInitialized();\r\n}\r\n\r\n","/**\r\n * PDF.js Version Check Utility\r\n * Detects version mismatches between viewer and worker\r\n */\r\n\r\nimport * as pdfjsLib from 'pdfjs-dist';\r\n\r\nexport interface PdfJsVersionCheckResult {\r\n viewerExists: boolean;\r\n versionMatch: boolean;\r\n viewerVersion?: string;\r\n workerVersion: string;\r\n errorMessage?: string;\r\n}\r\n\r\n/**\r\n * Check if PDF.js viewer files exist and versions match\r\n * @param viewerBasePath - Base path for the viewer (e.g., '/pdfjs')\r\n * @returns Version check result\r\n */\r\nexport async function checkPdfJsVersion(\r\n viewerBasePath: string = '/pdfjs'\r\n): Promise<PdfJsVersionCheckResult> {\r\n const workerVersion = pdfjsLib.version;\r\n \r\n try {\r\n // Check if .version file exists\r\n const versionUrl = `${viewerBasePath}/.version`;\r\n const response = await fetch(versionUrl);\r\n \r\n if (!response.ok) {\r\n return {\r\n viewerExists: false,\r\n versionMatch: false,\r\n workerVersion,\r\n errorMessage: 'PDF.js viewer files not found. Run: npx signiphi-setup',\r\n };\r\n }\r\n \r\n const viewerVersion = (await response.text()).trim();\r\n const versionMatch = viewerVersion === workerVersion;\r\n \r\n if (!versionMatch) {\r\n return {\r\n viewerExists: true,\r\n versionMatch: false,\r\n viewerVersion,\r\n workerVersion,\r\n errorMessage: `Version mismatch: viewer=${viewerVersion}, worker=${workerVersion}. Run: npx signiphi-setup`,\r\n };\r\n }\r\n \r\n return {\r\n viewerExists: true,\r\n versionMatch: true,\r\n viewerVersion,\r\n workerVersion,\r\n };\r\n } catch (error) {\r\n return {\r\n viewerExists: false,\r\n versionMatch: false,\r\n workerVersion,\r\n errorMessage: 'Unable to check PDF.js version. Viewer files may not be installed.',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Log version check warnings to console\r\n * @param result - Version check result\r\n */\r\nexport function logVersionCheckWarning(result: PdfJsVersionCheckResult): void {\r\n if (!result.viewerExists) {\r\n console.warn(\r\n '⚠️ PDF.js viewer files not found.\\n' +\r\n 'The PDF viewer requires viewer files to be installed.\\n' +\r\n 'Run: npx signiphi-setup\\n' +\r\n 'Or reinstall the package: npm install @signiphi/pdf-signer'\r\n );\r\n } else if (!result.versionMatch) {\r\n console.warn(\r\n `⚠️ PDF.js version mismatch detected:\\n` +\r\n ` Viewer: ${result.viewerVersion}\\n` +\r\n ` Worker: ${result.workerVersion}\\n` +\r\n 'Run: npx signiphi-setup to sync versions'\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Check version and log warnings automatically\r\n * @param viewerBasePath - Base path for the viewer\r\n */\r\nexport async function checkAndLogPdfJsVersion(\r\n viewerBasePath: string = '/pdfjs'\r\n): Promise<PdfJsVersionCheckResult> {\r\n const result = await checkPdfJsVersion(viewerBasePath);\r\n \r\n if (!result.viewerExists || !result.versionMatch) {\r\n logVersionCheckWarning(result);\r\n }\r\n \r\n return result;\r\n}\r\n\r\n","/**\r\n * Logger Utility\r\n * Centralized logging system with environment-based log level control\r\n */\r\n\r\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error';\r\n\r\ninterface Logger {\r\n debug(message: string, ...args: unknown[]): void;\r\n info(message: string, ...args: unknown[]): void;\r\n warn(message: string, ...args: unknown[]): void;\r\n error(message: string, ...args: unknown[]): void;\r\n}\r\n\r\n/**\r\n * Determines if the current environment is production\r\n */\r\nfunction isProduction(): boolean {\r\n return typeof process !== 'undefined' && process.env.NODE_ENV === 'production';\r\n}\r\n\r\n/**\r\n * Creates a formatted log prefix\r\n */\r\nfunction createPrefix(level: LogLevel): string {\r\n return `[@signiphi/pdf-signer] [${level.toUpperCase()}]`;\r\n}\r\n\r\n/**\r\n * Creates the logger instance with environment-based behavior\r\n */\r\nfunction createLogger(): Logger {\r\n const isProd = isProduction();\r\n\r\n return {\r\n debug(message: string, ...args: unknown[]): void {\r\n if (!isProd) {\r\n console.log(createPrefix('debug'), message, ...args);\r\n }\r\n },\r\n\r\n info(message: string, ...args: unknown[]): void {\r\n if (!isProd) {\r\n console.log(createPrefix('info'), message, ...args);\r\n }\r\n },\r\n\r\n warn(message: string, ...args: unknown[]): void {\r\n if (!isProd) {\r\n console.warn(createPrefix('warn'), message, ...args);\r\n }\r\n },\r\n\r\n error(message: string, ...args: unknown[]): void {\r\n // Errors are shown in both development and production\r\n console.error(createPrefix('error'), message, ...args);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Singleton logger instance\r\n */\r\nexport const logger = createLogger();\r\n\r\n\r\n\r\n","import { useRef, useCallback, forwardRef, useImperativeHandle, useState, useEffect } from 'react';\nimport type { PdfViewerRef, PDFViewerApplication } from '../types';\nimport { getPdfJsConfig, initializePdfJs } from '../utils/pdfjs-config';\nimport { checkPdfJsVersion } from '../utils/pdfjs-version-check';\nimport { logger } from '../utils';\n\n/**\n * Props for the headless PDF viewer core component\n */\nexport interface PdfViewerCoreProps {\n onLoad?: () => void;\n onError?: (error: string) => void;\n pdfjsBasePath?: string; // Override default PDF.js path (defaults to CDN)\n children: (props: {\n iframeRef: React.RefObject<HTMLIFrameElement>;\n handleIframeLoad: () => void;\n }) => React.ReactNode;\n}\n\n/**\n * Headless PDF viewer core component\n * Provides PDF loading and form field extraction logic without any UI\n */\nexport const PdfViewerCore = forwardRef<PdfViewerRef, PdfViewerCoreProps>(\n ({ onLoad, onError, pdfjsBasePath, children }, ref) => {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const loadedPdfUrl = useRef<string | null>(null);\n const initializationPromise = useRef<Promise<void> | null>(null);\n const isLoadingRef = useRef<boolean>(false);\n const [versionChecked, setVersionChecked] = useState(false);\n const [setupError, setSetupError] = useState<string | null>(null);\n\n const getPDFViewerApplication = useCallback((): PDFViewerApplication | null => {\n try {\n const iframe = iframeRef.current;\n if (!iframe || !iframe.contentWindow) {\n return null;\n }\n\n const PDFViewerApplication = (\n iframe.contentWindow as Window & { PDFViewerApplication: PDFViewerApplication }\n ).PDFViewerApplication;\n if (!PDFViewerApplication) {\n return null;\n }\n\n return PDFViewerApplication;\n } catch (error) {\n logger.error('Error accessing PDFViewerApplication:', error);\n return null;\n }\n }, []);\n\n const waitForInitialization = useCallback(async () => {\n const PDFViewerApplication = getPDFViewerApplication();\n if (!PDFViewerApplication) {\n throw new Error('PDFViewerApplication not available');\n }\n\n // Wait for the viewer to be initialized\n if (PDFViewerApplication.initializedPromise) {\n await PDFViewerApplication.initializedPromise;\n }\n\n // Wait for the document to be loaded\n if (PDFViewerApplication.pdfLoadingTask) {\n await PDFViewerApplication.pdfLoadingTask.promise;\n }\n\n return PDFViewerApplication;\n }, [getPDFViewerApplication]);\n\n const loadPdf = useCallback(\n async (pdfUrl: string) => {\n const iframe = iframeRef.current;\n if (!iframe) {\n logger.error('PDF viewer iframe not available');\n return;\n }\n\n // Prevent loading the same PDF multiple times or loading while already loading\n if (isLoadingRef.current || loadedPdfUrl.current === pdfUrl) {\n return;\n }\n\n isLoadingRef.current = true;\n loadedPdfUrl.current = pdfUrl;\n\n try {\n // Initialize PDF.js configuration (lazy, only runs once)\n // This ensures the worker is configured before any PDF operations\n initializePdfJs();\n \n // Fetch the PDF data first to avoid CORS issues\n const response = await fetch(pdfUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch PDF: ${response.status}`);\n }\n\n const pdfBytes = await response.arrayBuffer();\n\n // Create a blob URL for the PDF data\n const blob = new Blob([pdfBytes], { type: 'application/pdf' });\n const blobUrl = URL.createObjectURL(blob);\n\n // Get PDF.js base path (use prop override or global config)\n const config = getPdfJsConfig();\n const basePath = pdfjsBasePath ?? config.viewerBasePath;\n\n // Load the PDF.js viewer with the blob URL\n const viewerUrl = `${basePath}/web/viewer.html?file=${encodeURIComponent(blobUrl)}`;\n iframe.src = viewerUrl;\n\n // Create a new initialization promise\n initializationPromise.current = new Promise((resolve, reject) => {\n const checkInitialization = () => {\n try {\n const PDFViewerApplication = getPDFViewerApplication();\n if (PDFViewerApplication && PDFViewerApplication.initializedPromise) {\n PDFViewerApplication.initializedPromise.then(() => {\n resolve();\n }).catch(reject);\n } else {\n // Retry after a short delay\n setTimeout(checkInitialization, 100);\n }\n } catch (error) {\n reject(error);\n }\n };\n\n // Start checking after iframe loads\n setTimeout(checkInitialization, 500);\n });\n } catch (error) {\n logger.error('Error fetching PDF:', error);\n isLoadingRef.current = false;\n onError?.(error instanceof Error ? error.message : 'Unknown error');\n }\n },\n [getPDFViewerApplication, onError, pdfjsBasePath]\n );\n\n const getFormFieldValues = useCallback(async (): Promise<Record<string, string>> => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n\n if (!PDFViewerApplication.pdfDocument) {\n return {};\n }\n\n const pdfDocument = PDFViewerApplication.pdfDocument;\n const values: Record<string, string> = {};\n\n // Use the PDF.js API to extract form field values\n if (pdfDocument.annotationStorage) {\n const annotationStorage = pdfDocument.annotationStorage;\n\n // Get field objects to understand form structure\n let fieldObjects: Record<string, unknown[]> = {};\n try {\n if (pdfDocument.getFieldObjects) {\n const result = await pdfDocument.getFieldObjects();\n fieldObjects = result || {};\n }\n } catch (error) {\n logger.warn('Error getting field objects:', error);\n }\n\n // Create mapping from field IDs to names and store field info with widgets\n type PDFField = {\n id?: string;\n type?: string;\n value?: unknown;\n exportValue?: string;\n buttonValue?: string;\n defaultValue?: unknown;\n name?: string;\n };\n \n type RadioButtonData = {\n id: string;\n data: unknown;\n widget?: PDFField;\n };\n\n const idToNameMap: Record<string, string> = {};\n const fieldInfo: Record<string, { type: string; widgets: PDFField[] }> = {};\n \n for (const [name, fields] of Object.entries(fieldObjects)) {\n const fieldArray = fields as PDFField[];\n \n // Store field type and ALL widgets (critical for radio buttons)\n fieldInfo[name] = {\n type: fieldArray[0]?.type || '',\n widgets: fieldArray\n };\n \n // Create ID to name mapping\n for (const field of fieldArray) {\n if (field.id) {\n idToNameMap[field.id] = name;\n }\n }\n }\n\n // Get annotation storage data\n let storedData: Record<string, unknown> = {};\n if (annotationStorage.serializable && annotationStorage.serializable.map) {\n const storageMap = annotationStorage.serializable.map;\n for (const [key, value] of storageMap.entries()) {\n storedData[key] = value;\n }\n } else if (typeof annotationStorage.getAll === 'function') {\n storedData = annotationStorage.getAll();\n }\n\n // Group radio button widgets by field name (Dockmaster approach)\n const radioGroups: Record<string, RadioButtonData[]> = {};\n \n // First pass: identify and group radio buttons from annotationStorage\n for (const [id, data] of Object.entries(storedData)) {\n const fieldName = idToNameMap[id];\n if (!fieldName) continue;\n \n const fieldType = fieldInfo[fieldName]?.type;\n \n // Check if this is a radio button field\n const isRadioButton = fieldType && (\n fieldType.toLowerCase().includes('radio') ||\n fieldType.toLowerCase().includes('radiobutton') ||\n fieldType === 'radiobutton'\n );\n \n // Fallback detection: if multiple widgets share the same field name, it's likely a radio group\n const widgetCount = fieldInfo[fieldName]?.widgets?.length || 0;\n const isLikelyRadioGroup = widgetCount > 1 && fieldName.toLowerCase().includes('radio');\n \n if (fieldName && (isRadioButton || isLikelyRadioGroup)) {\n if (!radioGroups[fieldName]) {\n radioGroups[fieldName] = [];\n }\n \n // Find the corresponding widget from fieldInfo\n const widget = fieldInfo[fieldName]?.widgets?.find((w: PDFField) => w.id === id);\n \n radioGroups[fieldName].push({ id, data, widget });\n logger.info(`[RADIO DETECT] Added widget ${id} to group ${fieldName}, data:`, data);\n }\n }\n \n logger.info(`[RADIO DETECT] Found ${Object.keys(radioGroups).length} radio groups:`, Object.keys(radioGroups));\n\n // Process radio groups to find selected options\n for (const [fieldName, radioButtons] of Object.entries(radioGroups)) {\n \n // Find the selected radio button (the one with value: true)\n const selectedRadio = radioButtons.find(rb => \n rb.data && typeof rb.data === 'object' && \n (rb.data as { value?: boolean }).value === true\n );\n \n if (selectedRadio) {\n // Sort radio buttons by their ID to get consistent ordering\n const sortedRadioButtons = [...radioButtons].sort((a, b) => {\n const aNum = parseInt(a.id.replace(/\\D/g, ''), 10) || 0;\n const bNum = parseInt(b.id.replace(/\\D/g, ''), 10) || 0;\n return aNum - bNum;\n });\n \n // Find the position of the selected widget\n const selectedIndex = sortedRadioButtons.findIndex(rb => rb.id === selectedRadio.id);\n \n // Store the widget position for later mapping to actual option values\n if (selectedIndex >= 0) {\n const exportValue = `__RADIO_OPTION_INDEX_${selectedIndex}__`;\n values[fieldName] = exportValue;\n logger.info(`[RADIO] Field ${fieldName}: selected index ${selectedIndex}, stored as ${exportValue}`);\n } else {\n values[fieldName] = 'true';\n logger.warn(`[RADIO] Field ${fieldName}: could not determine index, defaulting to 'true'`);\n }\n } else {\n logger.info(`[RADIO] Field ${fieldName}: no selection found in ${radioButtons.length} widgets`);\n }\n }\n\n // Extract values for non-radio fields from stored data\n for (const [id, data] of Object.entries(storedData)) {\n const fieldName = idToNameMap[id];\n \n // Skip if already processed as radio button\n if (fieldName && values[fieldName]) {\n continue;\n }\n \n if (fieldName) {\n let extractedValue: string | undefined;\n\n if (data && typeof data === 'object') {\n const dataObj = data as Record<string, unknown>;\n if ('value' in dataObj) {\n extractedValue = String(dataObj.value);\n } else if ('formValue' in dataObj) {\n extractedValue = String(dataObj.formValue);\n } else if ('textContent' in dataObj) {\n extractedValue = String(dataObj.textContent);\n }\n } else if (data !== undefined && data !== null) {\n extractedValue = String(data);\n }\n\n if (extractedValue !== undefined && extractedValue !== '') {\n values[fieldName] = extractedValue;\n }\n }\n }\n\n // Get default values for fields not in storage\n for (const [name, fields] of Object.entries(fieldObjects)) {\n if (!values[name]) {\n const fieldArray = fields as PDFField[];\n const field = fieldArray[0];\n \n if (field && field.value !== undefined && field.value !== null) {\n const fieldValue = String(field.value);\n const fieldType = fieldInfo[name]?.type;\n \n // For radio buttons, convert to index pattern using fieldInfo widgets\n const isRadioButton = fieldType && (\n fieldType.toLowerCase().includes('radio') ||\n fieldType === 'radiobutton'\n );\n \n if (isRadioButton && fieldValue !== 'true' && fieldValue !== 'false') {\n // Use widgets from fieldInfo (not field.items which may be missing after filtering)\n const widgets = fieldInfo[name]?.widgets || [];\n \n if (widgets.length > 0) {\n // Sort widgets by ID to get consistent ordering\n const sortedWidgets = [...widgets].sort((a, b) => {\n const aNum = parseInt((a.id || '').replace(/\\D/g, ''), 10) || 0;\n const bNum = parseInt((b.id || '').replace(/\\D/g, ''), 10) || 0;\n return aNum - bNum;\n });\n \n // Find which widget matches the default value\n const selectedIndex = sortedWidgets.findIndex(widget => \n widget.exportValue === fieldValue || widget.buttonValue === fieldValue\n );\n \n if (selectedIndex >= 0) {\n values[name] = `__RADIO_OPTION_INDEX_${selectedIndex}__`;\n } else {\n }\n }\n } else {\n // Non-radio fields: use the value as-is\n values[name] = fieldValue;\n }\n }\n }\n }\n }\n\n return values;\n } catch (error) {\n logger.error('Error extracting form field values:', error);\n return {};\n }\n }, [waitForInitialization]);\n\n const setFormFieldValues = useCallback(async (values: Record<string, string>): Promise<void> => {\n const iframe = iframeRef.current;\n if (!iframe || !iframe.contentWindow) {\n logger.warn('Cannot set field values: iframe not available');\n return;\n }\n\n try {\n // Wait for PDF.js to be ready\n await waitForInitialization();\n\n // Small delay to ensure fields are rendered in the DOM\n await new Promise(resolve => setTimeout(resolve, 200));\n\n const iframeDoc = iframe.contentWindow.document;\n \n // Set values for each field by accessing DOM directly\n for (const [fieldName, value] of Object.entries(values)) {\n try {\n // Try to decode the field name (PDF.js might use decoded names in DOM)\n // Extract the base name before __LABEL__, __SIGNER__, or __PLACEHOLDER__\n let decodedFieldName = fieldName;\n if (fieldName.includes('__LABEL__')) {\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__LABEL__'));\n } else if (fieldName.includes('__SIGNER__')) {\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__SIGNER__'));\n } else if (fieldName.includes('__PLACEHOLDER__')) {\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__PLACEHOLDER__'));\n }\n \n // Try multiple selectors to find the field\n // PDF.js might use either the encoded or decoded name\n let elements = iframeDoc.querySelectorAll(\n `[data-element-id=\"${fieldName}\"], [name=\"${fieldName}\"], [data-element-id=\"${decodedFieldName}\"], [name=\"${decodedFieldName}\"]`\n );\n \n if (elements.length === 0) {\n logger.warn(`Field element not found for: ${fieldName}`);\n continue;\n }\n \n // Handle radio buttons (multiple elements with same name)\n const firstElement = elements[0] as any;\n const isRadioGroup = elements.length > 1 && \n (firstElement.tagName || '').toLowerCase() === 'input' && \n (firstElement.type || '') === 'radio';\n \n if (isRadioGroup) {\n // Radio button group\n if (value.includes('__RADIO_OPTION_INDEX_')) {\n const match = value.match(/__RADIO_OPTION_INDEX_(\\d+)__/);\n if (match && match[1]) {\n const selectedIndex = parseInt(match[1], 10);\n if (selectedIndex < elements.length) {\n // First, uncheck all radio buttons in the group\n for (let i = 0; i < elements.length; i++) {\n const radioEl = elements[i] as any;\n if (radioEl.checked) {\n radioEl.checked = false;\n }\n }\n \n // Then check the selected one\n const radioElement = elements[selectedIndex] as any;\n radioElement.checked = true;\n \n // Dispatch events to notify PDF.js\n radioElement.dispatchEvent(new Event('change', { bubbles: true }));\n radioElement.dispatchEvent(new Event('input', { bubbles: true }));\n radioElement.dispatchEvent(new Event('click', { bubbles: true }));\n } else {\n logger.warn(`Radio button index ${selectedIndex} out of range for ${fieldName}`);\n }\n }\n }\n } else {\n // Single element (text, checkbox, dropdown, date, etc.)\n const element = elements[0] as any; // Use any to access properties from iframe context\n const tagName = (element.tagName || '').toLowerCase();\n \n // Check tagName instead of instanceof (iframe has different constructor context)\n if (tagName === 'input') {\n const inputType = element.type || 'text';\n if (inputType === 'checkbox') {\n const boolValue = value === 'true' || value === 'Yes' || value === 'On';\n element.checked = boolValue;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('click', { bubbles: true }));\n } else if (inputType === 'radio') {\n // Single radio button\n element.checked = value === 'true' || value === element.value;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('click', { bubbles: true }));\n } else {\n // Text, date, etc.\n element.value = value;\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n }\n } else if (tagName === 'select') {\n // Dropdown\n element.value = value;\n element.dispatchEvent(new Event('change', { bubbles: true }));\n element.dispatchEvent(new Event('input', { bubbles: true }));\n } else if (tagName === 'textarea') {\n // Textarea\n element.value = value;\n element.dispatchEvent(new Event('input', { bubbles: true }));\n element.dispatchEvent(new Event('change', { bubbles: true }));\n } else {\n logger.warn(`Unknown element type for field ${fieldName}: ${tagName}`);\n }\n }\n } catch (fieldError) {\n logger.error(`Error setting value for field ${fieldName}:`, fieldError);\n }\n }\n\n } catch (error) {\n logger.error('Error setting form field values:', error);\n }\n }, [waitForInitialization]);\n\n const getAllFieldNames = useCallback(async (): Promise<string[]> => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n\n if (!PDFViewerApplication.pdfDocument) {\n return [];\n }\n\n const pdfDocument = PDFViewerApplication.pdfDocument;\n\n let fieldObjects: Record<string, unknown[]> = {};\n try {\n if (pdfDocument.getFieldObjects) {\n const result = await pdfDocument.getFieldObjects();\n fieldObjects = result || {};\n }\n } catch (error) {\n return [];\n }\n\n return Object.keys(fieldObjects);\n } catch (error) {\n logger.error('Error getting all field names:', error);\n return [];\n }\n }, [waitForInitialization]);\n\n const saveDocument = useCallback(async (): Promise<Uint8Array | null> => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n\n if (!PDFViewerApplication.pdfDocument) {\n return null;\n }\n\n const pdfDocument = PDFViewerApplication.pdfDocument;\n\n if (typeof pdfDocument.saveDocument === 'function') {\n const savedBytes = await pdfDocument.saveDocument();\n return new Uint8Array(savedBytes);\n } else if (pdfDocument.getData) {\n const originalData = await pdfDocument.getData();\n return new Uint8Array(originalData);\n }\n\n return null;\n } catch (error) {\n logger.error('Error saving PDF document:', error);\n return null;\n }\n }, [waitForInitialization]);\n\n const injectPlaceholders = useCallback((fields: Array<{ id: string; name: string; placeholder?: string }>) => {\n const iframe = iframeRef.current;\n if (!iframe || !iframe.contentWindow) {\n return;\n }\n\n // Wait for PDF.js to render the form fields\n setTimeout(() => {\n try {\n const iframeDoc = iframe.contentWindow!.document;\n \n // Create a map of field names to placeholders for O(1) lookup\n const placeholderMap = new Map<string, string>();\n fields.forEach(field => {\n if (field.placeholder) {\n placeholderMap.set(field.name, field.placeholder);\n placeholderMap.set(field.id, field.placeholder);\n }\n });\n\n // Query all input fields in the iframe\n const inputs = iframeDoc.querySelectorAll('input[data-element-id], input[name]');\n \n \n inputs.forEach((input) => {\n const htmlInput = input as HTMLInputElement;\n const fieldId = htmlInput.getAttribute('data-element-id') || htmlInput.name;\n \n if (fieldId) {\n const placeholder = placeholderMap.get(fieldId);\n if (placeholder) {\n htmlInput.placeholder = placeholder;\n }\n }\n });\n } catch (error) {\n logger.error('Error injecting placeholders:', error);\n }\n }, 1000); // Wait 1 second for PDF.js to render\n }, []);\n\n const zoomIn = useCallback(async () => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.increaseScale === 'function') {\n PDFViewerApplication.pdfViewer.increaseScale();\n }\n } catch (error) {\n logger.error('Error zooming in:', error);\n }\n }, [waitForInitialization]);\n\n const zoomOut = useCallback(async () => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.decreaseScale === 'function') {\n PDFViewerApplication.pdfViewer.decreaseScale();\n }\n } catch (error) {\n logger.error('Error zooming out:', error);\n }\n }, [waitForInitialization]);\n\n const nextPage = useCallback(async () => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.nextPage === 'function') {\n PDFViewerApplication.pdfViewer.nextPage();\n }\n } catch (error) {\n logger.error('Error going to next page:', error);\n }\n }, [waitForInitialization]);\n\n const previousPage = useCallback(async () => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.previousPage === 'function') {\n PDFViewerApplication.pdfViewer.previousPage();\n }\n } catch (error) {\n logger.error('Error going to previous page:', error);\n }\n }, [waitForInitialization]);\n\n const getCurrentPage = useCallback(async (): Promise<number | null> => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.currentPageNumber === 'number') {\n return PDFViewerApplication.pdfViewer.currentPageNumber;\n }\n return null;\n } catch (error) {\n // Silently return null if PDF viewer isn't ready yet (expected during initialization)\n // Only log if it's an unexpected error\n const errorMsg = error instanceof Error ? error.message : String(error);\n if (!errorMsg.includes('not available') && !errorMsg.includes('not yet initialized')) {\n logger.error('Error getting current page:', error);\n }\n return null;\n }\n }, [waitForInitialization]);\n\n const getTotalPages = useCallback(async (): Promise<number | null> => {\n try {\n const PDFViewerApplication = await waitForInitialization();\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.pagesCount === 'number') {\n return PDFViewerApplication.pdfViewer.pagesCount;\n }\n return null;\n } catch (error) {\n // Silently return null if PDF viewer isn't ready yet (expected during initialization)\n // Only log if it's an unexpected error\n const errorMsg = error instanceof Error ? error.message : String(error);\n if (!errorMsg.includes('not available') && !errorMsg.includes('not yet initialized')) {\n logger.error('Error getting total pages:', error);\n }\n return null;\n }\n }, [waitForInitialization]);\n\n /**\n * Attaches click interceptors to PDF form fields\n * Allows blocking interaction if custom validation fails\n * @param onFieldClick - Callback that receives field name and returns true to allow interaction, false to block\n */\n const attachFieldClickInterceptors = useCallback((\n onFieldClick: (fieldName: string) => boolean\n ) => {\n const iframe = iframeRef.current;\n if (!iframe?.contentDocument) {\n logger.warn('Cannot attach field interceptors: iframe not ready');\n return;\n }\n\n try {\n // Use event delegation instead of attaching to individual elements\n // This survives PDF.js re-renders\n const doc = iframe.contentDocument;\n\n // Inject CSS styles for click highlighting (if not already present)\n const clickHighlightStyleId = 'signiphi-click-highlight-style';\n if (!doc.getElementById(clickHighlightStyleId)) {\n const style = doc.createElement('style');\n style.id = clickHighlightStyleId;\n style.textContent = `\n .clicked-field-annotation {\n outline: 2px solid #3b82f6 !important;\n outline-offset: 1px !important;\n box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.15) !important;\n border-radius: 3px !important;\n z-index: 999 !important;\n position: relative !important;\n }\n .clicked-field {\n outline: none !important;\n border-color: #3b82f6 !important;\n background-color: rgba(59, 130, 246, 0.05) !important;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1) !important;\n }\n `;\n doc.head.appendChild(style);\n logger.info('[CLICK HIGHLIGHT] Injected CSS styles');\n }\n\n // Remove existing delegated listener if any\n if ((doc as any)._signiphiDelegatedHandler) {\n ['pointerdown', 'focusin', 'click', 'mousedown'].forEach(event => {\n doc.removeEventListener(event, (doc as any)._signiphiDelegatedHandler, true);\n });\n }\n\n // Create delegated handler\n const delegatedHandler = (e: Event) => {\n const target = e.target as HTMLElement;\n\n // Log ALL clicks in PDF for debugging\n logger.info(`[PDF CLICK] Element clicked:`, {\n tag: target.tagName,\n className: target.className,\n id: target.id,\n name: target.getAttribute('name'),\n eventType: e.type\n });\n\n // Check if target is a form field OR button (signature fields might be buttons)\n if (!['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON'].includes(target.tagName)) {\n logger.info(`[PDF CLICK] Not a form field (${target.tagName}), checking for child/parent...`);\n\n // First check if this is a PDF.js widget annotation wrapper (SECTION with class containing \"Annotation\")\n let formElement: Element | null = null;\n if (target.tagName === 'SECTION' && target.className.includes('Annotation')) {\n // Look for input/select/textarea/button INSIDE this section\n formElement = target.querySelector('input, select, textarea, button');\n if (formElement) {\n logger.info(`[PDF CLICK] Found child form field in annotation:`, formElement.tagName);\n }\n }\n\n // If not found, try parent elements\n if (!formElement) {\n formElement = target.closest('input, select, textarea, button');\n if (formElement) {\n logger.info(`[PDF CLICK] Found parent form field:`, formElement.tagName);\n }\n }\n\n if (formElement) {\n // Recurse with the actual form element\n const newEvent = new Event(e.type, { bubbles: true, cancelable: true });\n Object.defineProperty(newEvent, 'target', { value: formElement, enumerable: true });\n delegatedHandler(newEvent);\n if (newEvent.defaultPrevented) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n }\n }\n return;\n }\n\n // Get field name\n const fieldName = target.getAttribute('name')\n || target.getAttribute('data-element-id')\n || target.getAttribute('id');\n\n if (!fieldName) {\n logger.info('[PDF CLICK] No field name found');\n return; // No identifier, ignore\n }\n\n logger.info(`Field click intercepted: ${fieldName}`, e.type);\n\n // Call callback first to determine if we should block\n const shouldProceed = onFieldClick(fieldName);\n logger.info(`Field ${fieldName} shouldProceed: ${shouldProceed}`);\n\n // Only process pointerdown and mousedown events for highlighting and blocking\n // Let focusin and click events pass through for normal field behavior\n if (e.type !== 'pointerdown' && e.type !== 'mousedown') {\n // For focusin and click, only block if field is not allowed\n if (!shouldProceed) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n logger.info(`Blocked ${e.type} event for field: ${fieldName}`);\n }\n return; // Don't apply highlights on these events\n }\n\n // Apply click highlighting on the FIRST blocking event (when modal will open)\n if (!shouldProceed && e.type === 'pointerdown') {\n // Remove previous click highlights from all fields\n const previousClickHighlights = doc.querySelectorAll('.clicked-field');\n previousClickHighlights.forEach(el => el.classList.remove('clicked-field'));\n const previousAnnotationClickHighlights = doc.querySelectorAll('.clicked-field-annotation');\n previousAnnotationClickHighlights.forEach(el => el.classList.remove('clicked-field-annotation'));\n\n // Add click highlight to current field\n target.classList.add('clicked-field');\n\n // Also highlight the parent widget annotation if it exists\n const widgetAnnotation = target.closest('.widgetAnnotation, .textWidgetAnnotation, .choiceWidgetAnnotation, .buttonWidgetAnnotation');\n if (widgetAnnotation) {\n widgetAnnotation.classList.add('clicked-field-annotation');\n }\n\n logger.info(`[CLICK HIGHLIGHT] Applied to blocked field: ${fieldName}`, {\n hasAnnotation: !!widgetAnnotation,\n elementTag: target.tagName,\n eventType: e.type\n });\n\n // Block the interaction\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n logger.info(`Blocked interaction with field: ${fieldName}`);\n } \n // Apply on mousedown for allowed fields (normal interaction)\n else if (shouldProceed && e.type === 'mousedown') {\n // Remove previous click highlights from all fields\n const previousClickHighlights = doc.querySelectorAll('.clicked-field');\n previousClickHighlights.forEach(el => el.classList.remove('clicked-field'));\n const previousAnnotationClickHighlights = doc.querySelectorAll('.clicked-field-annotation');\n previousAnnotationClickHighlights.forEach(el => el.classList.remove('clicked-field-annotation'));\n\n // Add click highlight to current field\n target.classList.add('clicked-field');\n\n // Also highlight the parent widget annotation if it exists\n const widgetAnnotation = target.closest('.widgetAnnotation, .textWidgetAnnotation, .choiceWidgetAnnotation, .buttonWidgetAnnotation');\n if (widgetAnnotation) {\n widgetAnnotation.classList.add('clicked-field-annotation');\n }\n\n logger.info(`[CLICK HIGHLIGHT] Applied to allowed field: ${fieldName}`, {\n hasAnnotation: !!widgetAnnotation,\n elementTag: target.tagName,\n eventType: e.type\n });\n \n // DO NOT prevent default for allowed fields - let them focus and accept input\n }\n // Handle blocked pointerdown that's not the first one (shouldn't happen, but be safe)\n else if (!shouldProceed) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n logger.info(`Blocked ${e.type} event for field: ${fieldName}`);\n }\n };\n\n // Store reference for cleanup\n (doc as any)._signiphiDelegatedHandler = delegatedHandler;\n\n // Attach delegated listener to document\n ['pointerdown', 'focusin', 'click', 'mousedown'].forEach(event => {\n doc.addEventListener(event, delegatedHandler, {\n capture: true,\n passive: false\n });\n });\n\n // Log how many fields we found (for diagnostics)\n let formElements = doc.querySelectorAll(\n 'input[data-element-id], select[data-element-id], textarea[data-element-id]'\n );\n if (formElements.length === 0) {\n formElements = doc.querySelectorAll('input[id], select[id], textarea[id]');\n }\n\n logger.info(`Attached delegated interceptor. Found ${formElements.length} form fields in PDF`);\n\n // Just log field names for diagnostics\n formElements.forEach((element) => {\n const fieldName = element.getAttribute('name')\n || element.getAttribute('data-element-id')\n || element.getAttribute('id');\n\n if (fieldName) {\n logger.info(`Found field: ${fieldName} (name: ${element.getAttribute('name')}, id: ${element.getAttribute('id')})`);\n }\n });\n } catch (error) {\n logger.error('Error attaching field click interceptors:', error);\n }\n }, []);\n\n /**\n * Add visual indicator to a PDF form field\n * Shows user the field's acknowledgement/completion state\n * @param fieldName - The field name (e.g., 'signature_field_main')\n * @param indicatorType - Type of indicator: 'completed' (green checkmark), 'pending-ack' (amber badge), or 'info' (subtle info icon)\n * @param allowedFieldIds - Comma-separated list of fieldIds (UUIDs) that should show indicators\n */\n /**\n * Add a visual indicator badge to a field's annotation section\n * \n * Field Indicator System - Three-state visual feedback for acknowledgement status:\n * - 'info' (gray 'i', 20x20px): Field has acknowledgements but is unfilled\n * - 'pending-ack' (amber '!', 24x24px): Field is filled but needs acknowledgement \n * - 'completed' (green '✓', 24x24px): Field is filled AND fully acknowledged\n * \n * Indicators are positioned in the top-right corner of the field annotation.\n * Only fields with acknowledgements will display indicators.\n * \n * @param fieldName - Name of the field to add indicator to\n * @param indicatorType - Type of indicator badge to display\n * @param allowedFieldIds - Optional comma-separated list of fieldIds (UUIDs) to filter which fields get indicators\n */\n const addFieldIndicator = useCallback(async (\n fieldName: string, \n indicatorType: 'completed' | 'pending-ack' | 'info' = 'completed',\n allowedFieldIds?: string\n ) => {\n try {\n const iframe = iframeRef.current;\n if (!iframe?.contentDocument) {\n logger.warn('Cannot add field indicator: iframe not ready');\n return;\n }\n\n const doc = iframe.contentDocument;\n\n // Parse allowed fieldIds (UUIDs)\n const allowedIds = allowedFieldIds ? allowedFieldIds.split(',').map(id => id.trim()).filter(id => id) : null;\n\n logger.info(`Adding indicators for ${fieldName}, allowedFieldIds:`, allowedIds);\n\n // If no allowed IDs provided or empty, don't add any indicators\n if (allowedIds !== null && allowedIds.length === 0) {\n logger.info(`No fields allowed for indicators (${fieldName}), skipping`);\n return;\n }\n\n // Get PDF metadata to map fieldIds to PDF field names\n const pdfApp = getPDFViewerApplication();\n let fieldIdToPdfNameMap: Record<string, string> = {};\n\n if (pdfApp?.pdfDocument?.getData && allowedIds) {\n try {\n const pdfDoc = pdfApp.pdfDocument;\n\n // Get PDF bytes\n const pdfBytesRaw = await pdfDoc.getData!();\n logger.info('Got PDF bytes, type:', typeof pdfBytesRaw, 'isArrayBuffer:', pdfBytesRaw instanceof ArrayBuffer, 'isUint8Array:', pdfBytesRaw instanceof Uint8Array);\n logger.info('PDF bytes constructor:', pdfBytesRaw?.constructor?.name);\n logger.info('PDF bytes has buffer?:', !!(pdfBytesRaw as any)?.buffer);\n\n // Ensure we have a Uint8Array for pdf-lib\n let pdfBytes: Uint8Array;\n const rawData = pdfBytesRaw as any;\n\n if (pdfBytesRaw instanceof Uint8Array) {\n pdfBytes = pdfBytesRaw;\n } else if (rawData instanceof ArrayBuffer) {\n pdfBytes = new Uint8Array(rawData);\n } else if (rawData?.buffer instanceof ArrayBuffer) {\n // It's a typed array view (like Uint8Array from a different realm/iframe)\n pdfBytes = new Uint8Array(rawData.buffer, rawData.byteOffset || 0, rawData.byteLength || rawData.length);\n } else {\n logger.warn('Unexpected PDF bytes type, attempting direct conversion');\n pdfBytes = new Uint8Array(rawData);\n }\n\n logger.info('Converted to Uint8Array, length:', pdfBytes.length);\n\n // Use pdf-lib to read metadata\n const { PDFDocument, PDFName } = await import('pdf-lib');\n const pdfLibDoc = await PDFDocument.load(pdfBytes);\n logger.info('Successfully loaded PDF with pdf-lib');\n\n // Get the Info dictionary\n const infoRef = pdfLibDoc.context.trailerInfo.Info;\n if (infoRef) {\n const infoObj = pdfLibDoc.context.lookup(infoRef) as any;\n\n // Try to get SigniphiMetadata\n const metadataObj = infoObj?.get(PDFName.of('SigniphiMetadata'));\n\n if (metadataObj) {\n const signiphiMetadataStr = metadataObj.toString();\n\n // Parse the metadata (it's stored as a PDF string in format (JSON))\n let jsonStr = signiphiMetadataStr;\n const parenMatch = signiphiMetadataStr.match(/^\\((.*)\\)$/);\n if (parenMatch && parenMatch[1]) {\n jsonStr = parenMatch[1];\n }\n\n const signiphiMetadata = JSON.parse(jsonStr);\n logger.info('Parsed Signiphi metadata:', signiphiMetadata);\n\n // Create fieldId → PDF field name mapping\n if (signiphiMetadata.fields) {\n Object.entries(signiphiMetadata.fields).forEach(([pdfFieldName, fieldData]: [string, any]) => {\n if (fieldData.fieldId) {\n fieldIdToPdfNameMap[fieldData.fieldId] = pdfFieldName;\n }\n });\n }\n\n logger.info('FieldId to PDF name mapping:', fieldIdToPdfNameMap);\n }\n }\n } catch (metadataError) {\n logger.warn('Could not read PDF metadata for field mapping:', metadataError);\n }\n }\n\n // Special handling for signature_field_main and initials_field_main\n // These are synthetic fields - we need to find ALL actual signature/initials fields\n let targetElements: Element[] = [];\n\n if (fieldName === 'signature_field_main') {\n // Find ALL signature fields in the PDF\n const allInputs = doc.querySelectorAll('input[name], input[data-element-id]');\n\n // Get allowed PDF field names from the mapping\n const allowedPdfNames = allowedIds\n ? allowedIds.map(fieldId => fieldIdToPdfNameMap[fieldId]).filter(Boolean)\n : null;\n\n logger.info(`Allowed PDF field names for signature indicators:`, allowedPdfNames);\n\n allInputs.forEach(input => {\n const name = input.getAttribute('name') || input.getAttribute('data-element-id') || '';\n if (name.toLowerCase().includes('signature') && !name.toLowerCase().includes('initials')) {\n // If we have a filter, only include fields in the allowed list\n if (allowedPdfNames === null) {\n targetElements.push(input);\n } else {\n // Check if the DOM field name starts with any allowed metadata name\n // (DOM names have suffixes like \"_signature\" added during encoding)\n const isAllowed = allowedPdfNames.some(allowedName => allowedName && name.startsWith(allowedName));\n if (isAllowed) {\n targetElements.push(input);\n }\n }\n }\n });\n logger.info(`Found ${targetElements.length} signature fields for indicator (filtered by acknowledgements)`);\n } else if (fieldName === 'initials_field_main') {\n // Find ALL initials fields in the PDF\n const allInputs = doc.querySelectorAll('input[name], input[data-element-id]');\n\n // Get allowed PDF field names from the mapping\n const allowedPdfNames = allowedIds\n ? allowedIds.map(fieldId => fieldIdToPdfNameMap[fieldId]).filter(Boolean)\n : null;\n\n logger.info(`Allowed PDF field names for initials indicators:`, allowedPdfNames);\n\n allInputs.forEach(input => {\n const name = input.getAttribute('name') || input.getAttribute('data-element-id') || '';\n if (name.toLowerCase().includes('initials')) {\n // If we have a filter, only include fields in the allowed list\n if (allowedPdfNames === null) {\n targetElements.push(input);\n } else {\n // Check if the DOM field name starts with any allowed metadata name\n // (DOM names have suffixes like \"_initials\" added during encoding)\n const isAllowed = allowedPdfNames.some(allowedName => allowedName && name.startsWith(allowedName));\n if (isAllowed) {\n targetElements.push(input);\n }\n }\n }\n });\n logger.info(`Found ${targetElements.length} initials fields for indicator (filtered by acknowledgements)`);\n } else {\n // Regular field - try to find by exact name\n const formElement = doc.querySelector(\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"], ` +\n `select[name=\"${fieldName}\"], select[data-element-id=\"${fieldName}\"], ` +\n `textarea[name=\"${fieldName}\"], textarea[data-element-id=\"${fieldName}\"]`\n );\n if (formElement) {\n targetElements.push(formElement);\n }\n }\n\n if (targetElements.length === 0) {\n logger.warn(`Cannot add indicator: no fields found for \"${fieldName}\"`);\n return;\n }\n\n // Add indicator to each target element (showMode is 'all')\n let indicatorsAdded = 0;\n\n targetElements.forEach(formElement => {\n\n // Find the parent annotation section\n const annotationSection = formElement.closest('section');\n if (!annotationSection) {\n return;\n }\n\n // Remove existing indicator if any (to allow updating indicator type)\n const existingIndicator = annotationSection.querySelector('.signiphi-field-indicator');\n if (existingIndicator) {\n existingIndicator.remove();\n }\n\n // Create indicator based on type\n const indicator = doc.createElement('div');\n indicator.className = 'signiphi-field-indicator';\n \n // Add ARIA attributes for accessibility\n indicator.setAttribute('role', 'status');\n indicator.setAttribute('aria-live', 'polite');\n \n if (indicatorType === 'completed') {\n // Green checkmark (existing style)\n indicator.innerHTML = `\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#10b981\" stroke=\"white\" stroke-width=\"2\"/>\n <path d=\"M7 12l4 4 6-8\" stroke=\"white\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </svg>\n `;\n indicator.setAttribute('title', 'Acknowledgement complete');\n indicator.setAttribute('aria-label', 'Acknowledgement status: Complete');\n } else if (indicatorType === 'pending-ack') {\n // Amber badge with exclamation mark\n indicator.innerHTML = `\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#f59e0b\" stroke=\"white\" stroke-width=\"2\"/>\n <text x=\"12\" y=\"17\" font-size=\"16\" font-weight=\"bold\" fill=\"white\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\">!</text>\n </svg>\n `;\n indicator.setAttribute('title', 'Acknowledgement required');\n indicator.setAttribute('aria-label', 'Acknowledgement status: Pending acknowledgement');\n } else if (indicatorType === 'info') {\n // Subtle info icon for unfilled fields with acknowledgements\n indicator.innerHTML = `\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"10\" cy=\"10\" r=\"9\" fill=\"#94a3b8\" stroke=\"white\" stroke-width=\"1.5\"/>\n <text x=\"10\" y=\"14\" font-size=\"12\" font-weight=\"bold\" fill=\"white\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\">i</text>\n </svg>\n `;\n indicator.setAttribute('title', 'Has acknowledgement requirements');\n indicator.setAttribute('aria-label', 'Acknowledgement status: Has acknowledgement requirements');\n }\n\n // Style the indicator - positioned in top-right corner\n // Info indicators are slightly smaller to be more subtle\n const isInfoIndicator = indicatorType === 'info';\n Object.assign(indicator.style, {\n position: 'absolute',\n top: '-8px',\n right: '-8px',\n width: isInfoIndicator ? '20px' : '24px',\n height: isInfoIndicator ? '20px' : '24px',\n display: 'block',\n zIndex: '1000',\n pointerEvents: 'none',\n opacity: '0',\n transition: 'opacity 0.3s ease-in-out',\n margin: '0',\n padding: '0',\n lineHeight: '0',\n fontSize: '0',\n });\n\n // Ensure SVG doesn't cause layout shifts\n const svg = indicator.querySelector('svg');\n if (svg) {\n (svg as SVGElement).style.display = 'block';\n (svg as SVGElement).style.width = '24px';\n (svg as SVGElement).style.height = '24px';\n }\n\n // Add to annotation section (ensure no layout shift)\n const currentPosition = window.getComputedStyle(annotationSection).position;\n if (currentPosition === 'static') {\n annotationSection.style.position = 'relative';\n }\n annotationSection.appendChild(indicator);\n\n // Fade in animation\n requestAnimationFrame(() => {\n indicator.style.opacity = '1';\n });\n\n indicatorsAdded++;\n });\n\n logger.info(`Added ${indicatorsAdded} ${indicatorType} indicator(s) for field: ${fieldName}`);\n } catch (error) {\n logger.error('Error adding field indicator:', error);\n }\n }, []);\n\n /**\n * Remove visual indicator from a PDF form field\n */\n const removeFieldIndicator = useCallback((fieldName: string) => {\n try {\n const iframe = iframeRef.current;\n if (!iframe?.contentDocument) return;\n\n const doc = iframe.contentDocument;\n\n const formElement = doc.querySelector(\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"], ` +\n `select[name=\"${fieldName}\"], select[data-element-id=\"${fieldName}\"], ` +\n `textarea[name=\"${fieldName}\"], textarea[data-element-id=\"${fieldName}\"]`\n );\n\n if (!formElement) return;\n\n const annotationSection = formElement.closest('section');\n if (!annotationSection) return;\n\n const indicator = annotationSection.querySelector('.signiphi-field-indicator');\n if (indicator) {\n indicator.remove();\n logger.info(`Removed indicator from field: ${fieldName}`);\n }\n } catch (error) {\n logger.error('Error removing field indicator:', error);\n }\n }, []);\n\n // Check PDF.js version on mount\n useEffect(() => {\n if (!versionChecked) {\n const config = getPdfJsConfig();\n const basePath = pdfjsBasePath ?? config.viewerBasePath;\n \n checkPdfJsVersion(basePath).then((result) => {\n setVersionChecked(true);\n \n if (!result.viewerExists) {\n const errorMsg = `⚠️ PDF.js files not found\\n\\nThe PDF viewer requires PDF.js files to be installed.\\nThis should happen automatically, but you can run:\\n\\n npx signiphi-setup\\n\\nOr reinstall the package:\\n\\n npm install @signiphi/pdf-signer`;\n setSetupError(errorMsg);\n logger.error(errorMsg);\n } else if (!result.versionMatch) {\n logger.warn(\n `⚠️ PDF.js version mismatch:\\n` +\n ` Viewer: ${result.viewerVersion}\\n` +\n ` Worker: ${result.workerVersion}\\n` +\n `Run: npx signiphi-setup to sync versions`\n );\n }\n }).catch((error) => {\n logger.error('Failed to check PDF.js version:', error);\n setVersionChecked(true);\n });\n }\n }, [pdfjsBasePath, versionChecked]);\n\n const handleIframeLoad = useCallback(() => {\n const iframe = iframeRef.current;\n if (!iframe || !iframe.contentWindow) {\n return;\n }\n\n try {\n // Check if iframe failed to load (404 error for viewer.html)\n if (iframe.contentDocument) {\n const title = iframe.contentDocument.title;\n const body = iframe.contentDocument.body;\n \n // Detect common error patterns (404, file not found)\n if (\n title?.includes('404') || \n title?.includes('Not Found') ||\n body?.textContent?.includes('404') ||\n body?.textContent?.includes('Cannot GET')\n ) {\n const errorMsg = setupError || `⚠️ PDF.js viewer not found\\n\\nThe viewer.html file could not be loaded from the configured path.\\nRun: npx signiphi-setup\\n\\nOr check your configuration.`;\n logger.error(errorMsg);\n isLoadingRef.current = false;\n onError?.(errorMsg);\n return;\n }\n }\n\n setTimeout(async () => {\n try {\n if (initializationPromise.current) {\n await initializationPromise.current;\n isLoadingRef.current = false;\n onLoad?.();\n } else {\n const PDFViewerApplication = getPDFViewerApplication();\n if (PDFViewerApplication) {\n isLoadingRef.current = false;\n onLoad?.();\n } else {\n throw new Error('PDFViewerApplication not found after iframe load');\n }\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error loading PDF viewer';\n logger.error('Error in PDF.js initialization:', error);\n isLoadingRef.current = false;\n onError?.(errorMessage);\n }\n }, 1000);\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : 'Unknown error in iframe load handler';\n logger.error('Error in iframe load handler:', error);\n isLoadingRef.current = false;\n onError?.(errorMessage);\n }\n }, [getPDFViewerApplication, onLoad, onError, setupError]);\n\n // Expose methods via ref\n useImperativeHandle(\n ref,\n () => ({\n loadPdf,\n getFormFieldValues,\n setFormFieldValues,\n getAllFieldNames,\n saveDocument,\n getPDFViewerApplication,\n injectPlaceholders,\n zoomIn,\n zoomOut,\n nextPage,\n previousPage,\n getCurrentPage,\n getTotalPages,\n attachFieldClickInterceptors,\n addFieldIndicator,\n removeFieldIndicator,\n }),\n [loadPdf, getFormFieldValues, setFormFieldValues, getAllFieldNames, saveDocument, getPDFViewerApplication, injectPlaceholders, zoomIn, zoomOut, nextPage, previousPage, getCurrentPage, getTotalPages, attachFieldClickInterceptors, addFieldIndicator, removeFieldIndicator]\n );\n\n return <>{children({ iframeRef, handleIframeLoad })}</>;\n }\n);\n\nPdfViewerCore.displayName = 'PdfViewerCore';\n\n","import {\r\n useRef,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n forwardRef,\r\n useImperativeHandle,\r\n} from 'react';\r\nimport type { SignatureCanvasRef } from '../types';\r\n\r\n/**\r\n * Props for the headless signature capture core component\r\n */\r\nexport interface SignatureCaptureCoreProps {\r\n width?: number;\r\n height?: number;\r\n onSignature?: (dataUrl: string) => void;\r\n children: (props: {\r\n canvasRef: React.RefObject<HTMLCanvasElement>;\r\n containerRef: React.RefObject<HTMLDivElement>;\r\n isEmpty: boolean;\r\n canvasSize: { width: number; height: number };\r\n handlers: {\r\n onMouseDown: (e: React.MouseEvent) => void;\r\n onMouseMove: (e: React.MouseEvent) => void;\r\n onMouseUp: () => void;\r\n onMouseLeave: () => void;\r\n onTouchStart: (e: React.TouchEvent) => void;\r\n onTouchMove: (e: React.TouchEvent) => void;\r\n onTouchEnd: () => void;\r\n };\r\n actions: {\r\n clear: () => void;\r\n save: () => void;\r\n };\r\n }) => React.ReactNode;\r\n}\r\n\r\n/**\r\n * Headless signature capture core component\r\n * Provides canvas drawing logic without any UI\r\n */\r\nexport const SignatureCaptureCore = forwardRef<SignatureCanvasRef, SignatureCaptureCoreProps>(\r\n ({ width = 400, height = 200, onSignature, children }, ref) => {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const [isDrawing, setIsDrawing] = useState(false);\r\n const [isEmpty, setIsEmpty] = useState(true);\r\n const [lastPoint, setLastPoint] = useState<{ x: number; y: number } | null>(null);\r\n const [canvasSize, setCanvasSize] = useState({ width, height });\r\n\r\n // Handle responsive canvas sizing\r\n useEffect(() => {\r\n const updateCanvasSize = () => {\r\n if (containerRef.current) {\r\n const containerWidth = containerRef.current.offsetWidth;\r\n const maxWidth = Math.max(containerWidth - 16, width);\r\n const aspectRatio = width / height;\r\n const newHeight = maxWidth / aspectRatio;\r\n\r\n setCanvasSize({\r\n width: maxWidth,\r\n height: newHeight,\r\n });\r\n }\r\n };\r\n\r\n setTimeout(updateCanvasSize, 100);\r\n window.addEventListener('resize', updateCanvasSize);\r\n return () => window.removeEventListener('resize', updateCanvasSize);\r\n }, [width, height]);\r\n\r\n const getCanvasContext = useCallback(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return null;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return null;\r\n\r\n return { canvas, ctx };\r\n }, []);\r\n\r\n const setupCanvas = useCallback(() => {\r\n const result = getCanvasContext();\r\n if (!result) return;\r\n\r\n const { canvas, ctx } = result;\r\n\r\n // Set canvas size\r\n canvas.width = canvasSize.width;\r\n canvas.height = canvasSize.height;\r\n\r\n // Configure drawing context\r\n ctx.strokeStyle = '#000000';\r\n ctx.lineWidth = window.innerWidth < 768 ? 3 : 2;\r\n ctx.lineCap = 'round';\r\n ctx.lineJoin = 'round';\r\n ctx.imageSmoothingEnabled = true;\r\n\r\n // Clear canvas with transparent background\r\n ctx.clearRect(0, 0, canvasSize.width, canvasSize.height);\r\n }, [canvasSize, getCanvasContext]);\r\n\r\n const clear = useCallback(() => {\r\n const result = getCanvasContext();\r\n if (!result) return;\r\n\r\n const { ctx } = result;\r\n ctx.clearRect(0, 0, canvasSize.width, canvasSize.height);\r\n queueMicrotask(() => setIsEmpty(true));\r\n }, [canvasSize, getCanvasContext]);\r\n\r\n const getSignatureDataUrl = useCallback(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas || isEmpty) return null;\r\n\r\n return canvas.toDataURL('image/png');\r\n }, [isEmpty]);\r\n\r\n const getRelativePosition = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return null;\r\n\r\n const rect = canvas.getBoundingClientRect();\r\n const scaleX = canvas.width / rect.width;\r\n const scaleY = canvas.height / rect.height;\r\n\r\n let clientX: number, clientY: number;\r\n\r\n if ('touches' in e) {\r\n const touch = e.touches[0] || e.changedTouches[0];\r\n if (!touch) return null;\r\n clientX = touch.clientX;\r\n clientY = touch.clientY;\r\n } else {\r\n clientX = e.clientX;\r\n clientY = e.clientY;\r\n }\r\n\r\n return {\r\n x: (clientX - rect.left) * scaleX,\r\n y: (clientY - rect.top) * scaleY,\r\n };\r\n },\r\n []\r\n );\r\n\r\n const drawLine = useCallback(\r\n (from: { x: number; y: number }, to: { x: number; y: number }) => {\r\n const result = getCanvasContext();\r\n if (!result) return;\r\n\r\n const { ctx } = result;\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(from.x, from.y);\r\n ctx.lineTo(to.x, to.y);\r\n ctx.stroke();\r\n\r\n queueMicrotask(() => setIsEmpty(false));\r\n },\r\n [getCanvasContext]\r\n );\r\n\r\n const startDrawing = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n e.preventDefault();\r\n const point = getRelativePosition(e);\r\n if (!point) return;\r\n\r\n setIsDrawing(true);\r\n setLastPoint(point);\r\n },\r\n [getRelativePosition]\r\n );\r\n\r\n const draw = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n if (!isDrawing || !lastPoint) return;\r\n\r\n e.preventDefault();\r\n const point = getRelativePosition(e);\r\n if (!point) return;\r\n\r\n drawLine(lastPoint, point);\r\n setLastPoint(point);\r\n },\r\n [isDrawing, lastPoint, getRelativePosition, drawLine]\r\n );\r\n\r\n const stopDrawing = useCallback(() => {\r\n setIsDrawing(false);\r\n setLastPoint(null);\r\n }, []);\r\n\r\n const handleSave = useCallback(() => {\r\n if (isEmpty) return;\r\n\r\n const dataUrl = getSignatureDataUrl();\r\n if (dataUrl && onSignature) {\r\n onSignature(dataUrl);\r\n }\r\n }, [isEmpty, getSignatureDataUrl, onSignature]);\r\n\r\n // Initialize canvas\r\n useEffect(() => {\r\n setupCanvas();\r\n }, [setupCanvas]);\r\n\r\n // Mouse event handlers\r\n const handleMouseDown = useCallback(\r\n (e: React.MouseEvent) => {\r\n startDrawing(e);\r\n },\r\n [startDrawing]\r\n );\r\n\r\n const handleMouseMove = useCallback(\r\n (e: React.MouseEvent) => {\r\n draw(e);\r\n },\r\n [draw]\r\n );\r\n\r\n const handleMouseUp = useCallback(() => {\r\n stopDrawing();\r\n }, [stopDrawing]);\r\n\r\n const handleMouseLeave = useCallback(() => {\r\n stopDrawing();\r\n }, [stopDrawing]);\r\n\r\n // Touch event handlers\r\n const handleTouchStart = useCallback(\r\n (e: React.TouchEvent) => {\r\n startDrawing(e);\r\n },\r\n [startDrawing]\r\n );\r\n\r\n const handleTouchMove = useCallback(\r\n (e: React.TouchEvent) => {\r\n draw(e);\r\n },\r\n [draw]\r\n );\r\n\r\n const handleTouchEnd = useCallback(() => {\r\n stopDrawing();\r\n }, [stopDrawing]);\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n clear,\r\n getSignatureDataUrl,\r\n isEmpty: () => isEmpty,\r\n }),\r\n [clear, getSignatureDataUrl, isEmpty]\r\n );\r\n\r\n return (\r\n <>\r\n {children({\r\n canvasRef,\r\n containerRef,\r\n isEmpty,\r\n canvasSize,\r\n handlers: {\r\n onMouseDown: handleMouseDown,\r\n onMouseMove: handleMouseMove,\r\n onMouseUp: handleMouseUp,\r\n onMouseLeave: handleMouseLeave,\r\n onTouchStart: handleTouchStart,\r\n onTouchMove: handleTouchMove,\r\n onTouchEnd: handleTouchEnd,\r\n },\r\n actions: {\r\n clear,\r\n save: handleSave,\r\n },\r\n })}\r\n </>\r\n );\r\n }\r\n);\r\n\r\nSignatureCaptureCore.displayName = 'SignatureCaptureCore';\r\n\r\n"]}
1
+ {"version":3,"sources":["../../src/utils/pdfjs-config.ts","../../src/utils/pdfjs-version-check.ts","../../src/utils/logger.ts","../../src/core/PdfViewerCore.tsx","../../src/core/SignatureCaptureCore.tsx"],"names":["pdfjsLib2","forwardRef","useRef","useState","useEffect","useCallback","useImperativeHandle","jsx","Fragment"],"mappings":";;;;;AA4BA,IAAI,kBAAA,GAAqB,KAAA;AACzB,IAAI,gBAAA,GAAkC,IAAA;AAWtC,SAAS,mBAAA,GAA8B;AAErC,EAAA,IAAI,kBAAA,IAAsB,qBAAqB,IAAA,EAAM;AACnD,IAAA,OAAO,gBAAA;AAAA,EACT;AAGA,EAAA,IAAI,SAAA,GAAY,6BAAA;AAGhB,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,QAAQ,WAAA,EAAa;AAC/D,IAAA,IAAI;AAGF,MAAA,MAAM,QAAQ,WAAW;AACvB,QAAA,IAAI;AAEF,UAAA,OAAO,IAAI,QAAA,CAAS,oBAAoB,CAAA,EAAE;AAAA,QAC5C,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF,CAAA,GAAG;AAEH,MAAA,IAAI,IAAA,IAAQ,KAAK,GAAA,EAAK;AACpB,QAAA,SAAA,GAAY,IAAI,GAAA,CAAI,iCAAA,EAAmC,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA;AAAA,MACnE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAGR;AAAA,EACF;AAGA,EAAA,kBAAA,GAAqB,IAAA;AACrB,EAAA,gBAAA,GAAmB,SAAA;AAEnB,EAAA,OAAO,SAAA;AACT;AAeA,IAAI,YAAA,GAAsC;AAAA,EACxC,cAAA,EAAgB,QAAA;AAAA,EAChB,SAAA,EAAW;AAAA;AACb,CAAA;AAGA,IAAI,kBAAA,GAAqB,KAAA;AAKzB,SAAS,uBAAA,GAAgC;AACvC,EAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,IAAA,YAAA,CAAa,YAAY,mBAAA,EAAoB;AAC7C,IAAA,kBAAA,GAAqB,IAAA;AAGrB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAS,QAAA,CAAA,mBAAA,CAAoB,YAAY,YAAA,CAAa,SAAA;AAAA,IACxD;AAAA,EACF;AACF;AA0CO,SAAS,cAAA,GAAwC;AAEtD,EAAA,uBAAA,EAAwB;AACxB,EAAA,OAAO,EAAE,GAAG,YAAA,EAAa;AAC3B;AAuBO,SAAS,eAAA,GAAwB;AACtC,EAAA,uBAAA,EAAwB;AAC1B;ACpKA,eAAsB,iBAAA,CACpB,iBAAyB,QAAA,EACS;AAClC,EAAA,MAAM,aAAA,GAAyBA,QAAA,CAAA,OAAA;AAE/B,EAAA,IAAI;AAEF,IAAA,MAAM,UAAA,GAAa,GAAG,cAAc,CAAA,YAAA,CAAA;AACpC,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,UAAU,CAAA;AAEvC,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAO;AAAA,QACL,YAAA,EAAc,KAAA;AAAA,QACd,YAAA,EAAc,KAAA;AAAA,QACd,aAAA;AAAA,QACA,YAAA,EAAc;AAAA,OAChB;AAAA,IACF;AAEA,IAAA,MAAM,aAAA,GAAA,CAAiB,MAAM,QAAA,CAAS,IAAA,IAAQ,IAAA,EAAK;AACnD,IAAA,MAAM,eAAe,aAAA,KAAkB,aAAA;AAEvC,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO;AAAA,QACL,YAAA,EAAc,IAAA;AAAA,QACd,YAAA,EAAc,KAAA;AAAA,QACd,aAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA,EAAc,CAAA,yBAAA,EAA4B,aAAa,CAAA,SAAA,EAAY,aAAa,CAAA,yBAAA;AAAA,OAClF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,IAAA;AAAA,MACd,YAAA,EAAc,IAAA;AAAA,MACd,aAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,YAAA,EAAc,KAAA;AAAA,MACd,YAAA,EAAc,KAAA;AAAA,MACd,aAAA;AAAA,MACA,YAAA,EAAc;AAAA,KAChB;AAAA,EACF;AACF;;;ACjDA,SAAS,YAAA,GAAwB;AAC/B,EAAA,OAAO,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,IAAI,QAAA,KAAa,YAAA;AACpE;AAKA,SAAS,aAAa,KAAA,EAAyB;AAC7C,EAAA,OAAO,CAAA,wBAAA,EAA2B,KAAA,CAAM,WAAA,EAAa,CAAA,CAAA,CAAA;AACvD;AAKA,SAAS,YAAA,GAAuB;AAC9B,EAAA,MAAM,SAAS,YAAA,EAAa;AAE5B,EAAA,OAAO;AAAA,IACL,KAAA,CAAM,YAAoB,IAAA,EAAuB;AAC/C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAA,CAAQ,IAAI,YAAA,CAAa,OAAO,CAAA,EAAG,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,MACrD;AAAA,IACF,CAAA;AAAA,IAEA,IAAA,CAAK,YAAoB,IAAA,EAAuB;AAC9C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAA,CAAQ,IAAI,YAAA,CAAa,MAAM,CAAA,EAAG,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,MACpD;AAAA,IACF,CAAA;AAAA,IAEA,IAAA,CAAK,YAAoB,IAAA,EAAuB;AAC9C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAA,CAAQ,KAAK,YAAA,CAAa,MAAM,CAAA,EAAG,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,MACrD;AAAA,IACF,CAAA;AAAA,IAEA,KAAA,CAAM,YAAoB,IAAA,EAAuB;AAE/C,MAAA,OAAA,CAAQ,MAAM,YAAA,CAAa,OAAO,CAAA,EAAG,OAAA,EAAS,GAAG,IAAI,CAAA;AAAA,IACvD;AAAA,GACF;AACF;AAKO,IAAM,SAAS,YAAA,EAAa;ACvC5B,IAAM,aAAA,GAAgB,UAAA;AAAA,EAC3B,CAAC,EAAE,MAAA,EAAQ,SAAS,aAAA,EAAe,QAAA,IAAY,GAAA,KAAQ;AACrD,IAAA,MAAM,SAAA,GAAY,OAA0B,IAAI,CAAA;AAChD,IAAA,MAAM,YAAA,GAAe,OAAsB,IAAI,CAAA;AAC/C,IAAA,MAAM,qBAAA,GAAwB,OAA6B,IAAI,CAAA;AAC/D,IAAA,MAAM,YAAA,GAAe,OAAgB,KAAK,CAAA;AAC1C,IAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1D,IAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAwB,IAAI,CAAA;AAEhE,IAAA,MAAM,uBAAA,GAA0B,YAAY,MAAmC;AAC7E,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,aAAA,EAAe;AACpC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,oBAAA,GACJ,OAAO,aAAA,CACP,oBAAA;AACF,QAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,OAAO,oBAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,yCAAyC,KAAK,CAAA;AAC3D,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,qBAAA,GAAwB,YAAY,YAAY;AACpD,MAAA,MAAM,uBAAuB,uBAAA,EAAwB;AACrD,MAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,QAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,MACtD;AAGA,MAAA,IAAI,qBAAqB,kBAAA,EAAoB;AAC3C,QAAA,MAAM,oBAAA,CAAqB,kBAAA;AAAA,MAC7B;AAGA,MAAA,IAAI,qBAAqB,cAAA,EAAgB;AACvC,QAAA,MAAM,qBAAqB,cAAA,CAAe,OAAA;AAAA,MAC5C;AAEA,MAAA,OAAO,oBAAA;AAAA,IACT,CAAA,EAAG,CAAC,uBAAuB,CAAC,CAAA;AAG9B,IAAA,MAAM,gBAAA,GAAmB,MAAA,CAAoB,EAAE,CAAA;AAK/C,IAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,CAAC,MAAA,KAAwB;AAC5D,MAAA,gBAAA,CAAiB,OAAA,GAAU,MAAA;AAC3B,MAAA,MAAA,CAAO,KAAK,0CAAA,EAA4C,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,QAAA,EAAU,EAAE,QAAA,EAAU,IAAA,EAAM,CAAA,CAAE,IAAA,GAAO,CAAC,CAAA;AAAA,IACjI,CAAA,EAAG,EAAE,CAAA;AAML,IAAA,MAAM,qBAAA,GAAwB,YAAY,YAA6C;AACrF,MAAA,MAAM,cAAsC,EAAC;AAG7C,MAAA,KAAA,MAAW,KAAA,IAAS,iBAAiB,OAAA,EAAS;AAC5C,QAAA,IAAI,MAAM,IAAA,KAAA,MAAA,aAA6B;AACrC,UAAA,IAAI,MAAM,QAAA,IAAY,KAAA,CAAM,YAAY,CAAA,IAAK,KAAA,CAAM,YAAY,EAAA,EAAI;AACjE,YAAA,WAAA,CAAY,KAAA,CAAM,IAAI,CAAA,GAAI,KAAA,CAAM,QAAA;AAAA,UAClC;AAAA,QACF;AAAA,MACF;AAGA,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,WAAW,CAAA,EAAG;AACzC,QAAA,IAAI;AACF,UAAA,MAAM,oBAAA,GAAuB,MAAM,qBAAA,EAAsB;AACzD,UAAA,IAAI,oBAAA,EAAsB,aAAa,eAAA,EAAiB;AACtD,YAAA,MAAM,YAAA,GAAe,MAAM,oBAAA,CAAqB,WAAA,CAAY,eAAA,EAAgB;AAE5E,YAAA,KAAA,MAAW,CAAC,SAAA,EAAW,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC9D,cAAA,MAAM,UAAA,GAAa,MAAA;AAEnB,cAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAE9B,gBAAA,IAAI,MAAM,aAAA,EAAe;AACvB,kBAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,aAAA,CAAc,KAAA,CAAM,mBAAmB,CAAA;AAC3D,kBAAA,IAAI,KAAA,EAAO;AACT,oBAAA,WAAA,CAAY,SAAS,CAAA,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAC9C,oBAAA;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,IAAA,CAAK,0CAA0C,KAAK,CAAA;AAAA,QAC7D;AAAA,MACF;AAEA,MAAA,OAAO,WAAA;AAAA,IACT,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AASxB,IAAA,MAAM,0BAAA,GAA6B,WAAA,CAAY,OAAO,GAAA,KAAkB;AACtE,MAAA,MAAM,OAAA,GAAU,8BAAA;AAGhB,MAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,cAAA,CAAe,OAAO,CAAA;AAChD,MAAA,IAAI,aAAA,EAAe;AACjB,QAAA,aAAA,CAAc,MAAA,EAAO;AAAA,MACvB;AAGA,MAAA,MAAM,WAAA,GAAc,MAAM,qBAAA,EAAsB;AAGhD,MAAA,MAAM,WAAqB,EAAC;AAE5B,MAAA,KAAA,MAAW,CAAC,SAAA,EAAW,QAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC/D,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,kBAAA,EACF,SAAS,CAAA;AAAA,kBAAA,EACT,SAAS,CAAA;AAAA,mBAAA,EACR,SAAS,CAAA;AAAA,mBAAA,EACT,QAAQ,CAAA;AAAA;AAAA,IAAA,CAExB,CAAA;AAAA,MACC;AAGA,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAKjB,CAAA;AAGG,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAKjB,CAAA;AAEG,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,OAAO,CAAA;AACvC,MAAA,KAAA,CAAM,EAAA,GAAK,OAAA;AACX,MAAA,KAAA,CAAM,WAAA,GAAc,CAAA;AAAA,EAA+C,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AACtF,MAAA,GAAA,CAAI,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IAC5B,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,IAAA,MAAM,OAAA,GAAU,WAAA;AAAA,MACd,OAAO,MAAA,KAAmB;AACxB,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,CAAC,MAAA,EAAQ;AACX,UAAA,MAAA,CAAO,MAAM,iCAAiC,CAAA;AAC9C,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,YAAA,CAAa,OAAA,IAAW,YAAA,CAAa,OAAA,KAAY,MAAA,EAAQ;AAC3D,UAAA;AAAA,QACF;AAEA,QAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,QAAA,YAAA,CAAa,OAAA,GAAU,MAAA;AAEvB,QAAA,IAAI;AAGF,UAAA,eAAA,EAAgB;AAGhB,UAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,MAAM,CAAA;AACnC,UAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,UAC3D;AAEA,UAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,WAAA,EAAY;AAG5C,UAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,CAAC,QAAQ,CAAA,EAAG,EAAE,IAAA,EAAM,iBAAA,EAAmB,CAAA;AAC7D,UAAA,MAAM,OAAA,GAAU,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAA;AAGxC,UAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,UAAA,MAAM,QAAA,GAAW,iBAAiB,MAAA,CAAO,cAAA;AAGzC,UAAA,MAAM,YAAY,CAAA,EAAG,QAAQ,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,OAAO,CAAC,CAAA,CAAA;AACjF,UAAA,MAAA,CAAO,GAAA,GAAM,SAAA;AAGb,UAAA,qBAAA,CAAsB,OAAA,GAAU,IAAI,OAAA,CAAQ,CAAC,SAAS,MAAA,KAAW;AAC/D,YAAA,MAAM,sBAAsB,MAAM;AAChC,cAAA,IAAI;AACF,gBAAA,MAAM,uBAAuB,uBAAA,EAAwB;AACrD,gBAAA,IAAI,oBAAA,IAAwB,qBAAqB,kBAAA,EAAoB;AACnE,kBAAA,oBAAA,CAAqB,kBAAA,CAAmB,KAAK,YAAY;AAEvD,oBAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,sBAAA,MAAM,0BAAA,CAA2B,OAAO,eAAe,CAAA;AAAA,oBACzD;AACA,oBAAA,OAAA,EAAQ;AAAA,kBACV,CAAC,CAAA,CAAE,KAAA,CAAM,MAAM,CAAA;AAAA,gBACjB,CAAA,MAAO;AAEL,kBAAA,UAAA,CAAW,qBAAqB,GAAG,CAAA;AAAA,gBACrC;AAAA,cACF,SAAS,KAAA,EAAO;AACd,gBAAA,MAAA,CAAO,KAAK,CAAA;AAAA,cACd;AAAA,YACF,CAAA;AAGA,YAAA,UAAA,CAAW,qBAAqB,GAAG,CAAA;AAAA,UACrC,CAAC,CAAA;AAAA,QACH,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,KAAA,CAAM,uBAAuB,KAAK,CAAA;AACzC,UAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,UAAA,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAe,CAAA;AAAA,QACpE;AAAA,MACF,CAAA;AAAA,MACA,CAAC,uBAAA,EAAyB,OAAA,EAAS,aAAa;AAAA,KAClD;AAEA,IAAA,MAAM,kBAAA,GAAqB,YAAY,YAA6C;AAClF,MAAA,IAAI;AACF,QAAA,MAAM,oBAAA,GAAuB,MAAM,qBAAA,EAAsB;AAEzD,QAAA,IAAI,CAAC,qBAAqB,WAAA,EAAa;AACrC,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,cAAc,oBAAA,CAAqB,WAAA;AACzC,QAAA,MAAM,SAAiC,EAAC;AAGxC,QAAA,IAAI,YAAY,iBAAA,EAAmB;AACjC,UAAA,MAAM,oBAAoB,WAAA,CAAY,iBAAA;AAGtC,UAAA,IAAI,eAA0C,EAAC;AAC/C,UAAA,IAAI;AACF,YAAA,IAAI,YAAY,eAAA,EAAiB;AAC/B,cAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,eAAA,EAAgB;AACjD,cAAA,YAAA,GAAe,UAAU,EAAC;AAAA,YAC5B;AAAA,UACF,SAAS,KAAA,EAAO;AACd,YAAA,MAAA,CAAO,IAAA,CAAK,gCAAgC,KAAK,CAAA;AAAA,UACnD;AAmBA,UAAA,MAAM,cAAsC,EAAC;AAC7C,UAAA,MAAM,YAAmE,EAAC;AAE1E,UAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACzD,YAAA,MAAM,UAAA,GAAa,MAAA;AAGnB,YAAA,SAAA,CAAU,IAAI,CAAA,GAAI;AAAA,cAChB,IAAA,EAAM,UAAA,CAAW,CAAC,CAAA,EAAG,IAAA,IAAQ,EAAA;AAAA,cAC7B,OAAA,EAAS;AAAA,aACX;AAGA,YAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,cAAA,IAAI,MAAM,EAAA,EAAI;AACZ,gBAAA,WAAA,CAAY,KAAA,CAAM,EAAE,CAAA,GAAI,IAAA;AAAA,cAC1B;AAAA,YACF;AAAA,UACF;AAGA,UAAA,IAAI,aAAsC,EAAC;AAC3C,UAAA,IAAI,iBAAA,CAAkB,YAAA,IAAgB,iBAAA,CAAkB,YAAA,CAAa,GAAA,EAAK;AACxE,YAAA,MAAM,UAAA,GAAa,kBAAkB,YAAA,CAAa,GAAA;AAClD,YAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,UAAA,CAAW,SAAQ,EAAG;AAC/C,cAAA,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,YACpB;AAAA,UACF,CAAA,MAAA,IAAW,OAAO,iBAAA,CAAkB,MAAA,KAAW,UAAA,EAAY;AACzD,YAAA,UAAA,GAAa,kBAAkB,MAAA,EAAO;AAAA,UACxC;AAGA,UAAA,MAAM,cAAiD,EAAC;AAGxD,UAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACnD,YAAA,MAAM,SAAA,GAAY,YAAY,EAAE,CAAA;AAChC,YAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,YAAA,MAAM,SAAA,GAAY,SAAA,CAAU,SAAS,CAAA,EAAG,IAAA;AAGxC,YAAA,MAAM,aAAA,GAAgB,SAAA,KACpB,SAAA,CAAU,WAAA,GAAc,QAAA,CAAS,OAAO,CAAA,IACxC,SAAA,CAAU,WAAA,EAAY,CAAE,QAAA,CAAS,aAAa,KAC9C,SAAA,KAAc,aAAA,CAAA;AAIhB,YAAA,MAAM,WAAA,GAAc,SAAA,CAAU,SAAS,CAAA,EAAG,SAAS,MAAA,IAAU,CAAA;AAC7D,YAAA,MAAM,qBAAqB,WAAA,GAAc,CAAA,IAAK,UAAU,WAAA,EAAY,CAAE,SAAS,OAAO,CAAA;AAEtF,YAAA,IAAI,SAAA,KAAc,iBAAiB,kBAAA,CAAA,EAAqB;AACtD,cAAA,IAAI,CAAC,WAAA,CAAY,SAAS,CAAA,EAAG;AAC3B,gBAAA,WAAA,CAAY,SAAS,IAAI,EAAC;AAAA,cAC5B;AAGA,cAAA,MAAM,MAAA,GAAS,SAAA,CAAU,SAAS,CAAA,EAAG,OAAA,EAAS,KAAK,CAAC,CAAA,KAAgB,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AAE/E,cAAA,WAAA,CAAY,SAAS,CAAA,CAAE,IAAA,CAAK,EAAE,EAAA,EAAI,IAAA,EAAM,QAAQ,CAAA;AAChD,cAAA,MAAA,CAAO,KAAK,CAAA,4BAAA,EAA+B,EAAE,CAAA,UAAA,EAAa,SAAS,WAAW,IAAI,CAAA;AAAA,YACpF;AAAA,UACF;AAEA,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,qBAAA,EAAwB,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,CAAE,MAAM,CAAA,cAAA,CAAA,EAAkB,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AAO7G,UAAA,MAAM,2BAA2B,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AAGjE,UAAA,KAAA,MAAW,CAAC,SAAA,EAAW,YAAY,KAAK,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AAGnE,YAAA,MAAM,gBAAgB,YAAA,CAAa,IAAA;AAAA,cAAK,CAAA,EAAA,KACtC,GAAG,IAAA,IAAQ,OAAO,GAAG,IAAA,KAAS,QAAA,IAC7B,EAAA,CAAG,IAAA,CAA6B,KAAA,KAAU;AAAA,aAC7C;AAEA,YAAA,IAAI,aAAA,EAAe;AAEjB,cAAA,MAAM,kBAAA,GAAqB,CAAC,GAAG,YAAY,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAC1D,gBAAA,MAAM,IAAA,GAAO,SAAS,CAAA,CAAE,EAAA,CAAG,QAAQ,KAAA,EAAO,EAAE,CAAA,EAAG,EAAE,CAAA,IAAK,CAAA;AACtD,gBAAA,MAAM,IAAA,GAAO,SAAS,CAAA,CAAE,EAAA,CAAG,QAAQ,KAAA,EAAO,EAAE,CAAA,EAAG,EAAE,CAAA,IAAK,CAAA;AACtD,gBAAA,OAAO,IAAA,GAAO,IAAA;AAAA,cAChB,CAAC,CAAA;AAGD,cAAA,MAAM,gBAAgB,kBAAA,CAAmB,SAAA,CAAU,QAAM,EAAA,CAAG,EAAA,KAAO,cAAc,EAAE,CAAA;AAGnF,cAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,gBAAA,MAAM,WAAA,GAAc,wBAAwB,aAAa,CAAA,EAAA,CAAA;AACzD,gBAAA,MAAA,CAAO,SAAS,CAAA,GAAI,WAAA;AACpB,gBAAA,MAAA,CAAO,KAAK,CAAA,cAAA,EAAiB,SAAS,oBAAoB,aAAa,CAAA,YAAA,EAAe,WAAW,CAAA,CAAE,CAAA;AAAA,cACrG,CAAA,MAAO;AACL,gBAAA,MAAA,CAAO,SAAS,CAAA,GAAI,MAAA;AACpB,gBAAA,MAAA,CAAO,IAAA,CAAK,CAAA,cAAA,EAAiB,SAAS,CAAA,iDAAA,CAAmD,CAAA;AAAA,cAC3F;AAAA,YACF,CAAA,MAAO;AACL,cAAA,MAAA,CAAO,KAAK,CAAA,cAAA,EAAiB,SAAS,CAAA,wBAAA,EAA2B,YAAA,CAAa,MAAM,CAAA,QAAA,CAAU,CAAA;AAAA,YAChG;AAAA,UACF;AAGA,UAAA,KAAA,MAAW,CAAC,EAAA,EAAI,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACnD,YAAA,MAAM,SAAA,GAAY,YAAY,EAAE,CAAA;AAIhC,YAAA,IAAI,cAAc,SAAA,IAAa,MAAA,IAAU,wBAAA,CAAyB,GAAA,CAAI,SAAS,CAAA,CAAA,EAAI;AACjF,cAAA;AAAA,YACF;AAEA,YAAA,IAAI,SAAA,EAAW;AACb,cAAA,IAAI,cAAA;AAEJ,cAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,gBAAA,MAAM,OAAA,GAAU,IAAA;AAChB,gBAAA,IAAI,WAAW,OAAA,EAAS;AACtB,kBAAA,cAAA,GAAiB,MAAA,CAAO,QAAQ,KAAK,CAAA;AAAA,gBACvC,CAAA,MAAA,IAAW,eAAe,OAAA,EAAS;AACjC,kBAAA,cAAA,GAAiB,MAAA,CAAO,QAAQ,SAAS,CAAA;AAAA,gBAC3C,CAAA,MAAA,IAAW,iBAAiB,OAAA,EAAS;AACnC,kBAAA,cAAA,GAAiB,MAAA,CAAO,QAAQ,WAAW,CAAA;AAAA,gBAC7C;AAAA,cACF,CAAA,MAAA,IAAW,IAAA,KAAS,KAAA,CAAA,IAAa,IAAA,KAAS,IAAA,EAAM;AAC9C,gBAAA,cAAA,GAAiB,OAAO,IAAI,CAAA;AAAA,cAC9B;AAEA,cAAA,IAAI,mBAAmB,KAAA,CAAA,EAAW;AAChC,gBAAA,MAAA,CAAO,SAAS,CAAA,GAAI,cAAA;AAAA,cACtB;AAAA,YACF;AAAA,UACF;AAKA,UAAA,KAAA,MAAW,CAAC,IAAA,EAAM,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAA,EAAG;AACzD,YAAA,IAAI,EAAE,QAAQ,MAAA,CAAA,EAAS;AACrB,cAAA,MAAM,UAAA,GAAa,MAAA;AACnB,cAAA,MAAM,KAAA,GAAQ,WAAW,CAAC,CAAA;AAE1B,cAAA,IAAI,SAAS,KAAA,CAAM,KAAA,KAAU,KAAA,CAAA,IAAa,KAAA,CAAM,UAAU,IAAA,EAAM;AAC9D,gBAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA;AACrC,gBAAA,MAAM,SAAA,GAAY,SAAA,CAAU,IAAI,CAAA,EAAG,IAAA;AAGnC,gBAAA,MAAM,aAAA,GAAgB,cACpB,SAAA,CAAU,WAAA,GAAc,QAAA,CAAS,OAAO,KACxC,SAAA,KAAc,aAAA,CAAA;AAGhB,gBAAA,IAAI,aAAA,IAAiB,UAAA,KAAe,MAAA,IAAU,UAAA,KAAe,OAAA,EAAS;AAEpE,kBAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAI,CAAA,EAAG,WAAW,EAAC;AAE7C,kBAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AAEtB,oBAAA,MAAM,aAAA,GAAgB,CAAC,GAAG,OAAO,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAChD,sBAAA,MAAM,IAAA,GAAO,QAAA,CAAA,CAAU,CAAA,CAAE,EAAA,IAAM,EAAA,EAAI,QAAQ,KAAA,EAAO,EAAE,CAAA,EAAG,EAAE,CAAA,IAAK,CAAA;AAC9D,sBAAA,MAAM,IAAA,GAAO,QAAA,CAAA,CAAU,CAAA,CAAE,EAAA,IAAM,EAAA,EAAI,QAAQ,KAAA,EAAO,EAAE,CAAA,EAAG,EAAE,CAAA,IAAK,CAAA;AAC9D,sBAAA,OAAO,IAAA,GAAO,IAAA;AAAA,oBAChB,CAAC,CAAA;AAGD,oBAAA,MAAM,gBAAgB,aAAA,CAAc,SAAA;AAAA,sBAAU,CAAA,MAAA,KAC5C,MAAA,CAAO,WAAA,KAAgB,UAAA,IAAc,OAAO,WAAA,KAAgB;AAAA,qBAC9D;AAEA,oBAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,sBAAA,MAAA,CAAO,IAAI,CAAA,GAAI,CAAA,qBAAA,EAAwB,aAAa,CAAA,EAAA,CAAA;AAAA,oBACtD,CAAA,MAAO;AAAA,oBACP;AAAA,kBACF;AAAA,gBACF,CAAA,MAAO;AAEL,kBAAA,MAAA,CAAO,IAAI,CAAA,GAAI,UAAA;AAAA,gBACjB;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,OAAO,MAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,uCAAuC,KAAK,CAAA;AACzD,QAAA,OAAO,EAAC;AAAA,MACV;AAAA,IACF,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,IAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,OAAO,MAAA,KAAkD;AAC9F,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,aAAA,EAAe;AACpC,QAAA,MAAA,CAAO,KAAK,+CAA+C,CAAA;AAC3D,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AAEF,QAAA,MAAM,qBAAA,EAAsB;AAG5B,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAG,CAAC,CAAA;AAErD,QAAA,MAAM,SAAA,GAAY,OAAO,aAAA,CAAc,QAAA;AAGvC,QAAA,KAAA,MAAW,CAAC,SAAA,EAAW,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACvD,UAAA,IAAI;AAGF,YAAA,IAAI,gBAAA,GAAmB,SAAA;AACvB,YAAA,IAAI,SAAA,CAAU,QAAA,CAAS,WAAW,CAAA,EAAG;AACnC,cAAA,gBAAA,GAAmB,UAAU,SAAA,CAAU,CAAA,EAAG,SAAA,CAAU,OAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,YAC1E,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,YAAY,CAAA,EAAG;AAC3C,cAAA,gBAAA,GAAmB,UAAU,SAAA,CAAU,CAAA,EAAG,SAAA,CAAU,OAAA,CAAQ,YAAY,CAAC,CAAA;AAAA,YAC3E,CAAA,MAAA,IAAW,SAAA,CAAU,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAChD,cAAA,gBAAA,GAAmB,UAAU,SAAA,CAAU,CAAA,EAAG,SAAA,CAAU,OAAA,CAAQ,iBAAiB,CAAC,CAAA;AAAA,YAChF;AAIA,YAAA,IAAI,WAAW,SAAA,CAAU,gBAAA;AAAA,cACvB,qBAAqB,SAAS,CAAA,WAAA,EAAc,SAAS,CAAA,sBAAA,EAAyB,gBAAgB,cAAc,gBAAgB,CAAA,EAAA;AAAA,aAC9H;AAEA,YAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,cAAA,MAAA,CAAO,IAAA,CAAK,CAAA,6BAAA,EAAgC,SAAS,CAAA,CAAE,CAAA;AACvD,cAAA;AAAA,YACF;AAGA,YAAA,MAAM,YAAA,GAAe,SAAS,CAAC,CAAA;AAC/B,YAAA,MAAM,YAAA,GAAe,QAAA,CAAS,MAAA,GAAS,CAAA,IAAA,CAClB,YAAA,CAAa,OAAA,IAAW,EAAA,EAAI,WAAA,EAAY,KAAM,OAAA,IAAA,CAC9C,YAAA,CAAa,IAAA,IAAQ,EAAA,MAAQ,OAAA;AAElD,YAAA,IAAI,YAAA,EAAc;AAEhB,cAAA,IAAI,KAAA,CAAM,QAAA,CAAS,uBAAuB,CAAA,EAAG;AAC3C,gBAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,8BAA8B,CAAA;AACxD,gBAAA,IAAI,KAAA,IAAS,KAAA,CAAM,CAAC,CAAA,EAAG;AACrB,kBAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAC3C,kBAAA,IAAI,aAAA,GAAgB,SAAS,MAAA,EAAQ;AAEnC,oBAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,sBAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,sBAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,wBAAA,OAAA,CAAQ,OAAA,GAAU,KAAA;AAAA,sBACpB;AAAA,oBACF;AAGA,oBAAA,MAAM,YAAA,GAAe,SAAS,aAAa,CAAA;AAC3C,oBAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAGvB,oBAAA,YAAA,CAAa,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AACjE,oBAAA,YAAA,CAAa,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAChE,oBAAA,YAAA,CAAa,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,kBAClE,CAAA,MAAO;AACL,oBAAA,MAAA,CAAO,IAAA,CAAK,CAAA,mBAAA,EAAsB,aAAa,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAE,CAAA;AAAA,kBACjF;AAAA,gBACF;AAAA,cACF;AAAA,YACF,CAAA,MAAO;AAEL,cAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,cAAA,MAAM,OAAA,GAAA,CAAW,OAAA,CAAQ,OAAA,IAAW,EAAA,EAAI,WAAA,EAAY;AAGpD,cAAA,IAAI,YAAY,OAAA,EAAS;AACvB,gBAAA,MAAM,SAAA,GAAY,QAAQ,IAAA,IAAQ,MAAA;AAClC,gBAAA,IAAI,cAAc,UAAA,EAAY;AAC5B,kBAAA,MAAM,SAAA,GAAY,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,SAAS,KAAA,KAAU,IAAA;AACnE,kBAAA,OAAA,CAAQ,OAAA,GAAU,SAAA;AAClB,kBAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC5D,kBAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC3D,kBAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,gBAC7D,CAAA,MAAA,IAAW,cAAc,OAAA,EAAS;AAEhC,kBAAA,OAAA,CAAQ,OAAA,GAAU,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,OAAA,CAAQ,KAAA;AACxD,kBAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC5D,kBAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC3D,kBAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,gBAC7D,CAAA,MAAO;AAEL,kBAAA,OAAA,CAAQ,KAAA,GAAQ,KAAA;AAChB,kBAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC3D,kBAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,gBAC9D;AAAA,cACF,CAAA,MAAA,IAAW,YAAY,QAAA,EAAU;AAE/B,gBAAA,OAAA,CAAQ,KAAA,GAAQ,KAAA;AAChB,gBAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC5D,gBAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,cAC7D,CAAA,MAAA,IAAW,YAAY,UAAA,EAAY;AAEjC,gBAAA,OAAA,CAAQ,KAAA,GAAQ,KAAA;AAChB,gBAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,OAAA,EAAS,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAC3D,gBAAA,OAAA,CAAQ,aAAA,CAAc,IAAI,KAAA,CAAM,QAAA,EAAU,EAAE,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,cAC9D,CAAA,MAAO;AACL,gBAAA,MAAA,CAAO,IAAA,CAAK,CAAA,+BAAA,EAAkC,SAAS,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AAAA,cACvE;AAAA,YACF;AAAA,UACF,SAAS,UAAA,EAAY;AACnB,YAAA,MAAA,CAAO,KAAA,CAAM,CAAA,8BAAA,EAAiC,SAAS,CAAA,CAAA,CAAA,EAAK,UAAU,CAAA;AAAA,UACxE;AAAA,QACF;AAAA,MAEF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,oCAAoC,KAAK,CAAA;AAAA,MACxD;AAAA,IACF,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,IAAA,MAAM,gBAAA,GAAmB,YAAY,YAA+B;AAClE,MAAA,IAAI;AACF,QAAA,MAAM,oBAAA,GAAuB,MAAM,qBAAA,EAAsB;AAEzD,QAAA,IAAI,CAAC,qBAAqB,WAAA,EAAa;AACrC,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,MAAM,cAAc,oBAAA,CAAqB,WAAA;AAEzC,QAAA,IAAI,eAA0C,EAAC;AAC/C,QAAA,IAAI;AACF,UAAA,IAAI,YAAY,eAAA,EAAiB;AAC/B,YAAA,MAAM,MAAA,GAAS,MAAM,WAAA,CAAY,eAAA,EAAgB;AACjD,YAAA,YAAA,GAAe,UAAU,EAAC;AAAA,UAC5B;AAAA,QACF,SAAS,KAAA,EAAO;AACd,UAAA,OAAO,EAAC;AAAA,QACV;AAEA,QAAA,OAAO,MAAA,CAAO,KAAK,YAAY,CAAA;AAAA,MACjC,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,kCAAkC,KAAK,CAAA;AACpD,QAAA,OAAO,EAAC;AAAA,MACV;AAAA,IACF,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,IAAA,MAAM,YAAA,GAAe,YAAY,YAAwC;AACvE,MAAA,IAAI;AACF,QAAA,MAAM,oBAAA,GAAuB,MAAM,qBAAA,EAAsB;AAEzD,QAAA,IAAI,CAAC,qBAAqB,WAAA,EAAa;AACrC,UAAA,OAAO,IAAA;AAAA,QACT;AAEA,QAAA,MAAM,cAAc,oBAAA,CAAqB,WAAA;AAEzC,QAAA,IAAI,OAAO,WAAA,CAAY,YAAA,KAAiB,UAAA,EAAY;AAClD,UAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,YAAA,EAAa;AAClD,UAAA,OAAO,IAAI,WAAW,UAAU,CAAA;AAAA,QAClC,CAAA,MAAA,IAAW,YAAY,OAAA,EAAS;AAC9B,UAAA,MAAM,YAAA,GAAe,MAAM,WAAA,CAAY,OAAA,EAAQ;AAC/C,UAAA,OAAO,IAAI,WAAW,YAAY,CAAA;AAAA,QACpC;AAEA,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAChD,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,IAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,CAAC,MAAA,KAAsE;AAC5G,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,aAAA,EAAe;AACpC,QAAA;AAAA,MACF;AAGA,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAI;AACF,UAAA,MAAM,SAAA,GAAY,OAAO,aAAA,CAAe,QAAA;AAGxC,UAAA,MAAM,cAAA,uBAAqB,GAAA,EAAoB;AAC/C,UAAA,MAAA,CAAO,QAAQ,CAAA,KAAA,KAAS;AACtB,YAAA,IAAI,MAAM,WAAA,EAAa;AACrB,cAAA,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,IAAA,EAAM,KAAA,CAAM,WAAW,CAAA;AAChD,cAAA,cAAA,CAAe,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAA,CAAM,WAAW,CAAA;AAAA,YAChD;AAAA,UACF,CAAC,CAAA;AAGD,UAAA,MAAM,MAAA,GAAS,SAAA,CAAU,gBAAA,CAAiB,qCAAqC,CAAA;AAG/E,UAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,KAAA,KAAU;AACxB,YAAA,MAAM,SAAA,GAAY,KAAA;AAClB,YAAA,MAAM,OAAA,GAAU,SAAA,CAAU,YAAA,CAAa,iBAAiB,KAAK,SAAA,CAAU,IAAA;AAEvE,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,MAAM,WAAA,GAAc,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA;AAC9C,cAAA,IAAI,WAAA,EAAa;AACf,gBAAA,SAAA,CAAU,WAAA,GAAc,WAAA;AAAA,cAC1B;AAAA,YACF;AAAA,UACF,CAAC,CAAA;AAAA,QACH,SAAS,KAAA,EAAO;AACd,UAAA,MAAA,CAAO,KAAA,CAAM,iCAAiC,KAAK,CAAA;AAAA,QACrD;AAAA,MACF,GAAG,GAAI,CAAA;AAAA,IACT,CAAA,EAAG,EAAE,CAAA;AAOL,IAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,OAAA,KAAmF;AAAA,IAG1H,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,MAAA,GAAS,YAAY,YAAY;AACrC,MAAA,IAAI;AACF,QAAA,MAAM,oBAAA,GAAuB,MAAM,qBAAA,EAAsB;AACzD,QAAA,IAAI,qBAAqB,SAAA,IAAa,OAAO,oBAAA,CAAqB,SAAA,CAAU,kBAAkB,UAAA,EAAY;AACxG,UAAA,oBAAA,CAAqB,UAAU,aAAA,EAAc;AAAA,QAC/C;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,qBAAqB,KAAK,CAAA;AAAA,MACzC;AAAA,IACF,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,IAAA,MAAM,OAAA,GAAU,YAAY,YAAY;AACtC,MAAA,IAAI;AACF,QAAA,MAAM,oBAAA,GAAuB,MAAM,qBAAA,EAAsB;AACzD,QAAA,IAAI,qBAAqB,SAAA,IAAa,OAAO,oBAAA,CAAqB,SAAA,CAAU,kBAAkB,UAAA,EAAY;AACxG,UAAA,oBAAA,CAAqB,UAAU,aAAA,EAAc;AAAA,QAC/C;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,sBAAsB,KAAK,CAAA;AAAA,MAC1C;AAAA,IACF,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,IAAA,MAAM,QAAA,GAAW,YAAY,YAAY;AACvC,MAAA,IAAI;AACF,QAAA,MAAM,oBAAA,GAAuB,MAAM,qBAAA,EAAsB;AACzD,QAAA,IAAI,qBAAqB,SAAA,IAAa,OAAO,oBAAA,CAAqB,SAAA,CAAU,aAAa,UAAA,EAAY;AACnG,UAAA,oBAAA,CAAqB,UAAU,QAAA,EAAS;AAAA,QAC1C;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAAA,MACjD;AAAA,IACF,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,IAAA,MAAM,YAAA,GAAe,YAAY,YAAY;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,oBAAA,GAAuB,MAAM,qBAAA,EAAsB;AACzD,QAAA,IAAI,qBAAqB,SAAA,IAAa,OAAO,oBAAA,CAAqB,SAAA,CAAU,iBAAiB,UAAA,EAAY;AACvG,UAAA,oBAAA,CAAqB,UAAU,YAAA,EAAa;AAAA,QAC9C;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,iCAAiC,KAAK,CAAA;AAAA,MACrD;AAAA,IACF,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,IAAA,MAAM,cAAA,GAAiB,YAAY,YAAoC;AACrE,MAAA,IAAI;AACF,QAAA,MAAM,oBAAA,GAAuB,MAAM,qBAAA,EAAsB;AACzD,QAAA,IAAI,qBAAqB,SAAA,IAAa,OAAO,oBAAA,CAAqB,SAAA,CAAU,sBAAsB,QAAA,EAAU;AAC1G,UAAA,OAAO,qBAAqB,SAAA,CAAU,iBAAA;AAAA,QACxC;AACA,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AAGd,QAAA,MAAM,WAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACtE,QAAA,IAAI,CAAC,SAAS,QAAA,CAAS,eAAe,KAAK,CAAC,QAAA,CAAS,QAAA,CAAS,qBAAqB,CAAA,EAAG;AACpF,UAAA,MAAA,CAAO,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAAA,QACnD;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAE1B,IAAA,MAAM,aAAA,GAAgB,YAAY,YAAoC;AACpE,MAAA,IAAI;AACF,QAAA,MAAM,oBAAA,GAAuB,MAAM,qBAAA,EAAsB;AACzD,QAAA,IAAI,qBAAqB,SAAA,IAAa,OAAO,oBAAA,CAAqB,SAAA,CAAU,eAAe,QAAA,EAAU;AACnG,UAAA,OAAO,qBAAqB,SAAA,CAAU,UAAA;AAAA,QACxC;AACA,QAAA,OAAO,IAAA;AAAA,MACT,SAAS,KAAA,EAAO;AAGd,QAAA,MAAM,WAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACtE,QAAA,IAAI,CAAC,SAAS,QAAA,CAAS,eAAe,KAAK,CAAC,QAAA,CAAS,QAAA,CAAS,qBAAqB,CAAA,EAAG;AACpF,UAAA,MAAA,CAAO,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,QAClD;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,EAAG,CAAC,qBAAqB,CAAC,CAAA;AAO1B,IAAA,MAAM,4BAAA,GAA+B,WAAA,CAAY,OAC/C,YAAA,KACG;AACH,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,QAAA,MAAA,CAAO,KAAK,oDAAoD,CAAA;AAChE,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AAGF,QAAA,MAAM,MAAM,MAAA,CAAO,eAAA;AAGnB,QAAA,MAAM,2BAA2B,GAAG,CAAA;AAGpC,QAAA,MAAM,qBAAA,GAAwB,gCAAA;AAC9B,QAAA,IAAI,CAAC,GAAA,CAAI,cAAA,CAAe,qBAAqB,CAAA,EAAG;AAC9C,UAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,aAAA,CAAc,OAAO,CAAA;AACvC,UAAA,KAAA,CAAM,EAAA,GAAK,qBAAA;AACX,UAAA,KAAA,CAAM,WAAA,GAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA;AAgBpB,UAAA,GAAA,CAAI,IAAA,CAAK,YAAY,KAAK,CAAA;AAC1B,UAAA,MAAA,CAAO,KAAK,uCAAuC,CAAA;AAAA,QACrD;AAGA,QAAA,IAAK,IAAY,yBAAA,EAA2B;AAC1C,UAAA,CAAC,eAAe,SAAA,EAAW,OAAA,EAAS,WAAW,CAAA,CAAE,QAAQ,CAAA,KAAA,KAAS;AAChE,YAAA,GAAA,CAAI,mBAAA,CAAoB,KAAA,EAAQ,GAAA,CAAY,yBAAA,EAA2B,IAAI,CAAA;AAAA,UAC7E,CAAC,CAAA;AAAA,QACH;AAGA,QAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,KAAa;AACrC,UAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AAGjB,UAAA,MAAA,CAAO,KAAK,CAAA,4BAAA,CAAA,EAAgC;AAAA,YAC1C,KAAK,MAAA,CAAO,OAAA;AAAA,YACZ,WAAW,MAAA,CAAO,SAAA;AAAA,YAClB,IAAI,MAAA,CAAO,EAAA;AAAA,YACX,IAAA,EAAM,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA;AAAA,YAChC,WAAW,CAAA,CAAE;AAAA,WACd,CAAA;AAGD,UAAA,IAAI,CAAC,CAAC,OAAA,EAAS,QAAA,EAAU,UAAA,EAAY,QAAQ,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA,EAAG;AACvE,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,8BAAA,EAAiC,MAAA,CAAO,OAAO,CAAA,+BAAA,CAAiC,CAAA;AAG5F,YAAA,IAAI,WAAA,GAA8B,IAAA;AAClC,YAAA,IAAI,OAAO,OAAA,KAAY,SAAA,IAAa,OAAO,SAAA,CAAU,QAAA,CAAS,YAAY,CAAA,EAAG;AAE3E,cAAA,WAAA,GAAc,MAAA,CAAO,cAAc,iCAAiC,CAAA;AACpE,cAAA,IAAI,WAAA,EAAa;AACf,gBAAA,MAAA,CAAO,IAAA,CAAK,CAAA,iDAAA,CAAA,EAAqD,WAAA,CAAY,OAAO,CAAA;AAAA,cACtF;AAAA,YACF;AAGA,YAAA,IAAI,CAAC,WAAA,EAAa;AAChB,cAAA,WAAA,GAAc,MAAA,CAAO,QAAQ,iCAAiC,CAAA;AAC9D,cAAA,IAAI,WAAA,EAAa;AACf,gBAAA,MAAA,CAAO,IAAA,CAAK,CAAA,oCAAA,CAAA,EAAwC,WAAA,CAAY,OAAO,CAAA;AAAA,cACzE;AAAA,YACF;AAEA,YAAA,IAAI,WAAA,EAAa;AAEf,cAAA,MAAM,QAAA,GAAW,IAAI,KAAA,CAAM,CAAA,CAAE,IAAA,EAAM,EAAE,OAAA,EAAS,IAAA,EAAM,UAAA,EAAY,IAAA,EAAM,CAAA;AACtE,cAAA,MAAA,CAAO,cAAA,CAAe,UAAU,QAAA,EAAU,EAAE,OAAO,WAAA,EAAa,UAAA,EAAY,MAAM,CAAA;AAClF,cAAA,gBAAA,CAAiB,QAAQ,CAAA;AACzB,cAAA,IAAI,SAAS,gBAAA,EAAkB;AAC7B,gBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,gBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,gBAAA,CAAA,CAAE,wBAAA,EAAyB;AAAA,cAC7B;AAAA,YACF;AACA,YAAA;AAAA,UACF;AAGA,UAAA,MAAM,SAAA,GAAY,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA,IACvC,MAAA,CAAO,YAAA,CAAa,iBAAiB,CAAA,IACrC,MAAA,CAAO,YAAA,CAAa,IAAI,CAAA;AAE7B,UAAA,IAAI,CAAC,SAAA,EAAW;AACd,YAAA,MAAA,CAAO,KAAK,iCAAiC,CAAA;AAC7C,YAAA;AAAA,UACF;AAEA,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,yBAAA,EAA4B,SAAS,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA;AAG3D,UAAA,MAAM,aAAA,GAAgB,YAAA,CAAa,SAAA,EAAW,MAAM,CAAA;AACpD,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,MAAA,EAAS,SAAS,CAAA,gBAAA,EAAmB,aAAa,CAAA,CAAE,CAAA;AAIhE,UAAA,IAAI,CAAA,CAAE,IAAA,KAAS,aAAA,IAAiB,CAAA,CAAE,SAAS,WAAA,EAAa;AAEtD,YAAA,IAAI,CAAC,aAAA,EAAe;AAClB,cAAA,CAAA,CAAE,cAAA,EAAe;AACjB,cAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,cAAA,CAAA,CAAE,wBAAA,EAAyB;AAC3B,cAAA,MAAA,CAAO,KAAK,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAE,CAAA;AAAA,YAC/D;AACA,YAAA;AAAA,UACF;AAGA,UAAA,IAAI,CAAC,aAAA,IAAiB,CAAA,CAAE,IAAA,KAAS,aAAA,EAAe;AAE9C,YAAA,MAAM,uBAAA,GAA0B,GAAA,CAAI,gBAAA,CAAiB,gBAAgB,CAAA;AACrE,YAAA,uBAAA,CAAwB,QAAQ,CAAA,EAAA,KAAM,EAAA,CAAG,SAAA,CAAU,MAAA,CAAO,eAAe,CAAC,CAAA;AAC1E,YAAA,MAAM,iCAAA,GAAoC,GAAA,CAAI,gBAAA,CAAiB,2BAA2B,CAAA;AAC1F,YAAA,iCAAA,CAAkC,QAAQ,CAAA,EAAA,KAAM,EAAA,CAAG,SAAA,CAAU,MAAA,CAAO,0BAA0B,CAAC,CAAA;AAG/F,YAAA,MAAA,CAAO,SAAA,CAAU,IAAI,eAAe,CAAA;AAGpC,YAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,OAAA,CAAQ,4FAA4F,CAAA;AACpI,YAAA,IAAI,gBAAA,EAAkB;AACpB,cAAA,gBAAA,CAAiB,SAAA,CAAU,IAAI,0BAA0B,CAAA;AAAA,YAC3D;AAEA,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,4CAAA,EAA+C,SAAS,CAAA,CAAA,EAAI;AAAA,cACtE,aAAA,EAAe,CAAC,CAAC,gBAAA;AAAA,cACjB,YAAY,MAAA,CAAO,OAAA;AAAA,cACnB,WAAW,CAAA,CAAE;AAAA,aACd,CAAA;AAGD,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,YAAA,CAAA,CAAE,wBAAA,EAAyB;AAC3B,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,gCAAA,EAAmC,SAAS,CAAA,CAAE,CAAA;AAAA,UAC5D,CAAA,MAAA,IAES,aAAA,IAAiB,CAAA,CAAE,IAAA,KAAS,WAAA,EAAa;AAEhD,YAAA,MAAM,uBAAA,GAA0B,GAAA,CAAI,gBAAA,CAAiB,gBAAgB,CAAA;AACrE,YAAA,uBAAA,CAAwB,QAAQ,CAAA,EAAA,KAAM,EAAA,CAAG,SAAA,CAAU,MAAA,CAAO,eAAe,CAAC,CAAA;AAC1E,YAAA,MAAM,iCAAA,GAAoC,GAAA,CAAI,gBAAA,CAAiB,2BAA2B,CAAA;AAC1F,YAAA,iCAAA,CAAkC,QAAQ,CAAA,EAAA,KAAM,EAAA,CAAG,SAAA,CAAU,MAAA,CAAO,0BAA0B,CAAC,CAAA;AAG/F,YAAA,MAAA,CAAO,SAAA,CAAU,IAAI,eAAe,CAAA;AAGpC,YAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,OAAA,CAAQ,4FAA4F,CAAA;AACpI,YAAA,IAAI,gBAAA,EAAkB;AACpB,cAAA,gBAAA,CAAiB,SAAA,CAAU,IAAI,0BAA0B,CAAA;AAAA,YAC3D;AAEA,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,4CAAA,EAA+C,SAAS,CAAA,CAAA,EAAI;AAAA,cACtE,aAAA,EAAe,CAAC,CAAC,gBAAA;AAAA,cACjB,YAAY,MAAA,CAAO,OAAA;AAAA,cACnB,WAAW,CAAA,CAAE;AAAA,aACd,CAAA;AAAA,UAGH,CAAA,MAAA,IAES,CAAC,aAAA,EAAe;AACvB,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,YAAA,CAAA,CAAE,wBAAA,EAAyB;AAC3B,YAAA,MAAA,CAAO,KAAK,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAE,CAAA;AAAA,UAC/D;AAAA,QACF,CAAA;AAGA,QAAC,IAAY,yBAAA,GAA4B,gBAAA;AAGzC,QAAA,CAAC,eAAe,SAAA,EAAW,OAAA,EAAS,WAAW,CAAA,CAAE,QAAQ,CAAA,KAAA,KAAS;AAChE,UAAA,GAAA,CAAI,gBAAA,CAAiB,OAAO,gBAAA,EAAkB;AAAA,YAC5C,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACV,CAAA;AAAA,QACH,CAAC,CAAA;AAGD,QAAA,IAAI,eAAe,GAAA,CAAI,gBAAA;AAAA,UACrB;AAAA,SACF;AACA,QAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,UAAA,YAAA,GAAe,GAAA,CAAI,iBAAiB,qCAAqC,CAAA;AAAA,QAC3E;AAEA,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,sCAAA,EAAyC,YAAA,CAAa,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAG7F,QAAA,YAAA,CAAa,OAAA,CAAQ,CAAC,OAAA,KAAY;AAChC,UAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAA,IACxC,OAAA,CAAQ,YAAA,CAAa,iBAAiB,CAAA,IACtC,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAA;AAE9B,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,MAAA,CAAO,IAAA,CAAK,CAAA,aAAA,EAAgB,SAAS,CAAA,QAAA,EAAW,OAAA,CAAQ,YAAA,CAAa,MAAM,CAAC,CAAA,MAAA,EAAS,OAAA,CAAQ,YAAA,CAAa,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,UACpH;AAAA,QACF,CAAC,CAAA;AAAA,MACH,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAAA,MACjE;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAQL,IAAA,MAAM,0BAAA,GAA6B,WAAA,CAAY,OAC7C,aAAA,KACwB;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,UAAA,MAAA,CAAO,KAAK,wDAAwD,CAAA;AACpE,UAAA,OAAO,MAAM;AAAA,UAAC,CAAA;AAAA,QAChB;AAEA,QAAA,MAAM,MAAM,MAAA,CAAO,eAAA;AAGnB,QAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAiB;AACrC,UAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,UAAA,IAAI,CAAC,MAAA,IAAU,CAAC,CAAC,OAAA,EAAS,QAAA,EAAU,UAAU,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA,EAAG;AACxE,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,SAAA,GAAY,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA,IACvC,MAAA,CAAO,YAAA,CAAa,iBAAiB,CAAA,IACrC,MAAA,CAAO,YAAA,CAAa,IAAI,CAAA,IACxB,EAAA;AAEL,UAAA,IAAI,CAAC,SAAA,EAAW;AAEhB,UAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,UAAA,IAAI,MAAA,CAAO,YAAY,OAAA,EAAS;AAC9B,YAAA,MAAM,YAAA,GAAe,MAAA;AACrB,YAAA,IAAI,YAAA,CAAa,SAAS,UAAA,EAAY;AACpC,cAAA,KAAA,GAAQ,YAAA,CAAa,UAAU,MAAA,GAAS,OAAA;AAAA,YAC1C,CAAA,MAAA,IAAW,YAAA,CAAa,IAAA,KAAS,OAAA,EAAS;AACxC,cAAA,IAAI,aAAa,OAAA,EAAS;AACxB,gBAAA,KAAA,GAAQ,aAAa,KAAA,IAAS,MAAA;AAAA,cAChC,CAAA,MAAO;AACL,gBAAA;AAAA,cACF;AAAA,YACF,CAAA,MAAO;AACL,cAAA,KAAA,GAAQ,YAAA,CAAa,KAAA;AAAA,YACvB;AAAA,UACF,CAAA,MAAA,IAAW,MAAA,CAAO,OAAA,KAAY,QAAA,EAAU;AACtC,YAAA,KAAA,GAAS,MAAA,CAA6B,KAAA;AAAA,UACxC,CAAA,MAAA,IAAW,MAAA,CAAO,OAAA,KAAY,UAAA,EAAY;AACxC,YAAA,KAAA,GAAS,MAAA,CAA+B,KAAA;AAAA,UAC1C;AAEA,UAAA,aAAA,CAAc,SAAA,EAAW,OAAO,MAAqB,CAAA;AAAA,QACvD,CAAA;AAGA,QAAA,GAAA,CAAI,gBAAA,CAAiB,QAAA,EAAU,YAAA,EAAc,IAAI,CAAA;AACjD,QAAA,GAAA,CAAI,gBAAA,CAAiB,OAAA,EAAS,YAAA,EAAc,IAAI,CAAA;AAEhD,QAAA,MAAA,CAAO,KAAK,oDAAoD,CAAA;AAGhE,QAAA,OAAO,MAAM;AACX,UAAA,GAAA,CAAI,mBAAA,CAAoB,QAAA,EAAU,YAAA,EAAc,IAAI,CAAA;AACpD,UAAA,GAAA,CAAI,mBAAA,CAAoB,OAAA,EAAS,YAAA,EAAc,IAAI,CAAA;AACnD,UAAA,MAAA,CAAO,KAAK,qDAAqD,CAAA;AAAA,QACnE,CAAA;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,2CAA2C,KAAK,CAAA;AAC7D,QAAA,OAAO,MAAM;AAAA,QAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAwBL,IAAA,MAAM,oBAAoB,WAAA,CAAY,OACpC,SAAA,EACA,aAAA,GAAsD,aACtD,eAAA,KACG;AACH,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,UAAA,MAAA,CAAO,KAAK,8CAA8C,CAAA;AAC1D,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,MAAM,MAAA,CAAO,eAAA;AAGnB,QAAA,MAAM,UAAA,GAAa,eAAA,GAAkB,eAAA,CAAgB,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,EAAA,KAAM,EAAA,CAAG,MAAM,CAAA,CAAE,MAAA,CAAO,CAAA,EAAA,KAAM,EAAE,CAAA,GAAI,IAAA;AAExG,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,sBAAA,EAAyB,SAAS,CAAA,kBAAA,CAAA,EAAsB,UAAU,CAAA;AAG9E,QAAA,IAAI,UAAA,KAAe,IAAA,IAAQ,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG;AAClD,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,kCAAA,EAAqC,SAAS,CAAA,WAAA,CAAa,CAAA;AACvE,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,SAAS,uBAAA,EAAwB;AACvC,QAAA,IAAI,sBAA8C,EAAC;AAEnD,QAAA,IAAI,MAAA,EAAQ,WAAA,EAAa,OAAA,IAAW,UAAA,EAAY;AAC9C,UAAA,IAAI;AACF,YAAA,MAAM,SAAS,MAAA,CAAO,WAAA;AAGtB,YAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,OAAA,EAAS;AAC1C,YAAA,MAAA,CAAO,IAAA,CAAK,wBAAwB,OAAO,WAAA,EAAa,kBAAkB,WAAA,YAAuB,WAAA,EAAa,eAAA,EAAiB,WAAA,YAAuB,UAAU,CAAA;AAChK,YAAA,MAAA,CAAO,IAAA,CAAK,wBAAA,EAA0B,WAAA,EAAa,WAAA,EAAa,IAAI,CAAA;AACpE,YAAA,MAAA,CAAO,IAAA,CAAK,wBAAA,EAA0B,CAAC,CAAE,aAAqB,MAAM,CAAA;AAGpE,YAAA,IAAI,QAAA;AACJ,YAAA,MAAM,OAAA,GAAU,WAAA;AAEhB,YAAA,IAAI,uBAAuB,UAAA,EAAY;AACrC,cAAA,QAAA,GAAW,WAAA;AAAA,YACb,CAAA,MAAA,IAAW,mBAAmB,WAAA,EAAa;AACzC,cAAA,QAAA,GAAW,IAAI,WAAW,OAAO,CAAA;AAAA,YACnC,CAAA,MAAA,IAAW,OAAA,EAAS,MAAA,YAAkB,WAAA,EAAa;AAEjD,cAAA,QAAA,GAAW,IAAI,UAAA,CAAW,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,cAAc,CAAA,EAAG,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,MAAM,CAAA;AAAA,YACzG,CAAA,MAAO;AACL,cAAA,MAAA,CAAO,KAAK,yDAAyD,CAAA;AACrE,cAAA,QAAA,GAAW,IAAI,WAAW,OAAO,CAAA;AAAA,YACnC;AAEA,YAAA,MAAA,CAAO,IAAA,CAAK,kCAAA,EAAoC,QAAA,CAAS,MAAM,CAAA;AAG/D,YAAA,MAAM,EAAE,WAAA,EAAa,OAAA,EAAQ,GAAI,MAAM,OAAO,SAAS,CAAA;AACvD,YAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,IAAA,CAAK,QAAQ,CAAA;AACjD,YAAA,MAAA,CAAO,KAAK,sCAAsC,CAAA;AAGlD,YAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,WAAA,CAAY,IAAA;AAC9C,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AAGhD,cAAA,MAAM,cAAc,OAAA,EAAS,GAAA,CAAI,OAAA,CAAQ,EAAA,CAAG,kBAAkB,CAAC,CAAA;AAE/D,cAAA,IAAI,WAAA,EAAa;AACf,gBAAA,MAAM,mBAAA,GAAsB,YAAY,QAAA,EAAS;AAGjD,gBAAA,IAAI,OAAA,GAAU,mBAAA;AACd,gBAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,KAAA,CAAM,YAAY,CAAA;AACzD,gBAAA,IAAI,UAAA,IAAc,UAAA,CAAW,CAAC,CAAA,EAAG;AAC/B,kBAAA,OAAA,GAAU,WAAW,CAAC,CAAA;AAAA,gBACxB;AAEA,gBAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC3C,gBAAA,MAAA,CAAO,IAAA,CAAK,6BAA6B,gBAAgB,CAAA;AAGzD,gBAAA,IAAI,iBAAiB,MAAA,EAAQ;AAC3B,kBAAA,MAAA,CAAO,OAAA,CAAQ,iBAAiB,MAAM,CAAA,CAAE,QAAQ,CAAC,CAAC,YAAA,EAAc,SAAS,CAAA,KAAqB;AAC5F,oBAAA,IAAI,UAAU,OAAA,EAAS;AACrB,sBAAA,mBAAA,CAAoB,SAAA,CAAU,OAAO,CAAA,GAAI,YAAA;AAAA,oBAC3C;AAAA,kBACF,CAAC,CAAA;AAAA,gBACH;AAEA,gBAAA,MAAA,CAAO,IAAA,CAAK,gCAAgC,mBAAmB,CAAA;AAAA,cACjE;AAAA,YACF;AAAA,UACF,SAAS,aAAA,EAAe;AACtB,YAAA,MAAA,CAAO,IAAA,CAAK,kDAAkD,aAAa,CAAA;AAAA,UAC7E;AAAA,QACF;AAIA,QAAA,IAAI,iBAA4B,EAAC;AAEjC,QAAA,IAAI,cAAc,sBAAA,EAAwB;AAExC,UAAA,MAAM,SAAA,GAAY,GAAA,CAAI,gBAAA,CAAiB,qCAAqC,CAAA;AAG5E,UAAA,MAAM,eAAA,GAAkB,UAAA,GACpB,UAAA,CAAW,GAAA,CAAI,CAAA,OAAA,KAAW,mBAAA,CAAoB,OAAO,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,GACtE,IAAA;AAEJ,UAAA,MAAA,CAAO,IAAA,CAAK,qDAAqD,eAAe,CAAA;AAEhF,UAAA,SAAA,CAAU,QAAQ,CAAA,KAAA,KAAS;AACzB,YAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,MAAM,KAAK,KAAA,CAAM,YAAA,CAAa,iBAAiB,CAAA,IAAK,EAAA;AACpF,YAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,WAAW,CAAA,IAAK,CAAC,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG;AAExF,cAAA,IAAI,oBAAoB,IAAA,EAAM;AAC5B,gBAAA,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,cAC3B,CAAA,MAAO;AAGL,gBAAA,MAAM,SAAA,GAAY,gBAAgB,IAAA,CAAK,CAAA,WAAA,KAAe,eAAe,IAAA,CAAK,UAAA,CAAW,WAAW,CAAC,CAAA;AACjG,gBAAA,IAAI,SAAA,EAAW;AACb,kBAAA,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,gBAC3B;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC,CAAA;AACD,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,MAAA,EAAS,cAAA,CAAe,MAAM,CAAA,8DAAA,CAAgE,CAAA;AAAA,QAC5G,CAAA,MAAA,IAAW,cAAc,qBAAA,EAAuB;AAE9C,UAAA,MAAM,SAAA,GAAY,GAAA,CAAI,gBAAA,CAAiB,qCAAqC,CAAA;AAG5E,UAAA,MAAM,eAAA,GAAkB,UAAA,GACpB,UAAA,CAAW,GAAA,CAAI,CAAA,OAAA,KAAW,mBAAA,CAAoB,OAAO,CAAC,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,GACtE,IAAA;AAEJ,UAAA,MAAA,CAAO,IAAA,CAAK,oDAAoD,eAAe,CAAA;AAE/E,UAAA,SAAA,CAAU,QAAQ,CAAA,KAAA,KAAS;AACzB,YAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,MAAM,KAAK,KAAA,CAAM,YAAA,CAAa,iBAAiB,CAAA,IAAK,EAAA;AACpF,YAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG;AAE3C,cAAA,IAAI,oBAAoB,IAAA,EAAM;AAC5B,gBAAA,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,cAC3B,CAAA,MAAO;AAGL,gBAAA,MAAM,SAAA,GAAY,gBAAgB,IAAA,CAAK,CAAA,WAAA,KAAe,eAAe,IAAA,CAAK,UAAA,CAAW,WAAW,CAAC,CAAA;AACjG,gBAAA,IAAI,SAAA,EAAW;AACb,kBAAA,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,gBAC3B;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC,CAAA;AACD,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,MAAA,EAAS,cAAA,CAAe,MAAM,CAAA,6DAAA,CAA+D,CAAA;AAAA,QAC3G,CAAA,MAAO;AAEL,UAAA,MAAM,cAAc,GAAA,CAAI,aAAA;AAAA,YACtB,CAAA,YAAA,EAAe,SAAS,CAAA,2BAAA,EAA8B,SAAS,CAAA,iBAAA,EAC/C,SAAS,CAAA,4BAAA,EAA+B,SAAS,CAAA,mBAAA,EAC/C,SAAS,CAAA,8BAAA,EAAiC,SAAS,CAAA,EAAA;AAAA,WACvE;AACA,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,cAAA,CAAe,KAAK,WAAW,CAAA;AAAA,UACjC;AAAA,QACF;AAEA,QAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,2CAAA,EAA8C,SAAS,CAAA,CAAA,CAAG,CAAA;AACtE,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,eAAA,GAAkB,CAAA;AAEtB,QAAA,cAAA,CAAe,QAAQ,CAAA,WAAA,KAAe;AAGpC,UAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA;AACvD,UAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,YAAA;AAAA,UACF;AAGA,UAAA,MAAM,iBAAA,GAAoB,iBAAA,CAAkB,aAAA,CAAc,2BAA2B,CAAA;AACrF,UAAA,IAAI,iBAAA,EAAmB;AACrB,YAAA,iBAAA,CAAkB,MAAA,EAAO;AAAA,UAC3B;AAGA,UAAA,MAAM,SAAA,GAAY,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACzC,UAAA,SAAA,CAAU,SAAA,GAAY,0BAAA;AAGtB,UAAA,SAAA,CAAU,YAAA,CAAa,QAAQ,QAAQ,CAAA;AACvC,UAAA,SAAA,CAAU,YAAA,CAAa,aAAa,QAAQ,CAAA;AAE5C,UAAA,IAAI,kBAAkB,WAAA,EAAa;AAEjC,YAAA,SAAA,CAAU,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA;AAMtB,YAAA,SAAA,CAAU,YAAA,CAAa,SAAS,0BAA0B,CAAA;AAC1D,YAAA,SAAA,CAAU,YAAA,CAAa,cAAc,kCAAkC,CAAA;AAAA,UACzE,CAAA,MAAA,IAAW,kBAAkB,aAAA,EAAe;AAE1C,YAAA,SAAA,CAAU,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA;AAMtB,YAAA,SAAA,CAAU,YAAA,CAAa,SAAS,0BAA0B,CAAA;AAC1D,YAAA,SAAA,CAAU,YAAA,CAAa,cAAc,iDAAiD,CAAA;AAAA,UACxF,CAAA,MAAA,IAAW,kBAAkB,MAAA,EAAQ;AAEnC,YAAA,SAAA,CAAU,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA,YAAA,CAAA;AAMtB,YAAA,SAAA,CAAU,YAAA,CAAa,SAAS,kCAAkC,CAAA;AAClE,YAAA,SAAA,CAAU,YAAA,CAAa,cAAc,0DAA0D,CAAA;AAAA,UACjG;AAIA,UAAA,MAAM,kBAAkB,aAAA,KAAkB,MAAA;AAC1C,UAAA,MAAA,CAAO,MAAA,CAAO,UAAU,KAAA,EAAO;AAAA,YAC7B,QAAA,EAAU,UAAA;AAAA,YACV,GAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,MAAA;AAAA,YACP,KAAA,EAAO,kBAAkB,MAAA,GAAS,MAAA;AAAA,YAClC,MAAA,EAAQ,kBAAkB,MAAA,GAAS,MAAA;AAAA,YACnC,OAAA,EAAS,OAAA;AAAA,YACT,MAAA,EAAQ,MAAA;AAAA,YACR,aAAA,EAAe,MAAA;AAAA,YACf,OAAA,EAAS,GAAA;AAAA,YACT,UAAA,EAAY,0BAAA;AAAA,YACZ,MAAA,EAAQ,GAAA;AAAA,YACR,OAAA,EAAS,GAAA;AAAA,YACT,UAAA,EAAY,GAAA;AAAA,YACZ,QAAA,EAAU;AAAA,WACX,CAAA;AAGD,UAAA,MAAM,GAAA,GAAM,SAAA,CAAU,aAAA,CAAc,KAAK,CAAA;AACzC,UAAA,IAAI,GAAA,EAAK;AACP,YAAC,GAAA,CAAmB,MAAM,OAAA,GAAU,OAAA;AACpC,YAAC,GAAA,CAAmB,MAAM,KAAA,GAAQ,MAAA;AAClC,YAAC,GAAA,CAAmB,MAAM,MAAA,GAAS,MAAA;AAAA,UACrC;AAGA,UAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,gBAAA,CAAiB,iBAAiB,CAAA,CAAE,QAAA;AACnE,UAAA,IAAI,oBAAoB,QAAA,EAAU;AAChC,YAAA,iBAAA,CAAkB,MAAM,QAAA,GAAW,UAAA;AAAA,UACrC;AACA,UAAA,iBAAA,CAAkB,YAAY,SAAS,CAAA;AAGvC,UAAA,qBAAA,CAAsB,MAAM;AAC1B,YAAA,SAAA,CAAU,MAAM,OAAA,GAAU,GAAA;AAAA,UAC5B,CAAC,CAAA;AAED,UAAA,eAAA,EAAA;AAAA,QACF,CAAC,CAAA;AAED,QAAA,MAAA,CAAO,KAAK,CAAA,MAAA,EAAS,eAAe,IAAI,aAAa,CAAA,yBAAA,EAA4B,SAAS,CAAA,CAAE,CAAA;AAAA,MAC9F,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,iCAAiC,KAAK,CAAA;AAAA,MACrD;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAKL,IAAA,MAAM,oBAAA,GAAuB,WAAA,CAAY,CAAC,SAAA,KAAsB;AAC9D,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAE9B,QAAA,MAAM,MAAM,MAAA,CAAO,eAAA;AAEnB,QAAA,MAAM,cAAc,GAAA,CAAI,aAAA;AAAA,UACtB,CAAA,YAAA,EAAe,SAAS,CAAA,2BAAA,EAA8B,SAAS,CAAA,iBAAA,EAC/C,SAAS,CAAA,4BAAA,EAA+B,SAAS,CAAA,mBAAA,EAC/C,SAAS,CAAA,8BAAA,EAAiC,SAAS,CAAA,EAAA;AAAA,SACvE;AAEA,QAAA,IAAI,CAAC,WAAA,EAAa;AAElB,QAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA;AACvD,QAAA,IAAI,CAAC,iBAAA,EAAmB;AAExB,QAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,aAAA,CAAc,2BAA2B,CAAA;AAC7E,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,SAAA,CAAU,MAAA,EAAO;AACjB,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,8BAAA,EAAiC,SAAS,CAAA,CAAE,CAAA;AAAA,QAC1D;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,mCAAmC,KAAK,CAAA;AAAA,MACvD;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AASL,IAAA,MAAM,qBAAA,GAAwB,WAAA,CAAY,CAAC,SAAA,KAAsB;AAC/D,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,UAAA,MAAA,CAAO,KAAK,mDAAmD,CAAA;AAC/D,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,MAAM,MAAA,CAAO,eAAA;AAGnB,QAAA,MAAM,cAAc,GAAA,CAAI,aAAA;AAAA,UACtB,eAAe,SAAS,CAAA,2BAAA,EAA8B,SAAS,CAAA,mBAAA,EAC7C,SAAS,iCAAiC,SAAS,CAAA,EAAA;AAAA,SACvE;AAEA,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,gDAAA,EAAmD,SAAS,CAAA,CAAA,CAAG,CAAA;AAC3E,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA;AACvD,QAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,sDAAA,EAAyD,SAAS,CAAA,CAAA,CAAG,CAAA;AACjF,UAAA;AAAA,QACF;AAGA,QAAA,MAAM,iBAAA,GAAoB,iBAAA,CAAkB,aAAA,CAAc,gCAAgC,CAAA;AAC1F,QAAA,IAAI,iBAAA,EAAmB;AACrB,UAAA,iBAAA,CAAkB,MAAA,EAAO;AAAA,QAC3B;AAGA,QAAA,MAAM,SAAA,GAAY,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACzC,QAAA,SAAA,CAAU,SAAA,GAAY,+BAAA;AAGtB,QAAA,SAAA,CAAU,YAAA,CAAa,QAAQ,QAAQ,CAAA;AACvC,QAAA,SAAA,CAAU,YAAA,CAAa,cAAc,sBAAsB,CAAA;AAC3D,QAAA,SAAA,CAAU,YAAA,CAAa,YAAY,GAAG,CAAA;AAGtC,QAAA,SAAA,CAAU,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAAA,CAAA;AAgBtB,QAAA,MAAA,CAAO,MAAA,CAAO,UAAU,KAAA,EAAO;AAAA,UAC7B,QAAA,EAAU,UAAA;AAAA,UACV,GAAA,EAAK,KAAA;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,SAAA,EAAW,kBAAA;AAAA,UACX,KAAA,EAAO,MAAA;AAAA,UACP,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS,MAAA;AAAA,UACT,UAAA,EAAY,QAAA;AAAA,UACZ,cAAA,EAAgB,QAAA;AAAA,UAChB,MAAA,EAAQ,MAAA;AAAA,UACR,MAAA,EAAQ,SAAA;AAAA,UACR,OAAA,EAAS,KAAA;AAAA,UACT,UAAA,EAAY,0BAAA;AAAA,UACZ,aAAA,EAAe,MAAA;AAAA,UACf,OAAA,EAAS,KAAA;AAAA,UACT,YAAA,EAAc;AAAA,SACf,CAAA;AAGD,QAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,UAAA,SAAA,CAAU,MAAM,OAAA,GAAU,GAAA;AAC1B,UAAA,SAAA,CAAU,MAAM,eAAA,GAAkB,SAAA;AAAA,QACpC,CAAC,CAAA;AACD,QAAA,SAAA,CAAU,gBAAA,CAAiB,cAAc,MAAM;AAC7C,UAAA,SAAA,CAAU,MAAM,OAAA,GAAU,KAAA;AAC1B,UAAA,SAAA,CAAU,MAAM,eAAA,GAAkB,aAAA;AAAA,QACpC,CAAC,CAAA;AAGD,QAAA,SAAA,CAAU,gBAAA,CAAiB,SAAA,EAAW,CAAC,CAAA,KAAqB;AAC1D,UAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,SAAA,CAAU,KAAA,EAAM;AAAA,UAClB;AAAA,QACF,CAAC,CAAA;AAGD,QAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,gBAAA,CAAiB,iBAAiB,CAAA,CAAE,QAAA;AACnE,QAAA,IAAI,oBAAoB,QAAA,EAAU;AAChC,UAAA,iBAAA,CAAkB,MAAM,QAAA,GAAW,UAAA;AAAA,QACrC;AAEA,QAAA,iBAAA,CAAkB,YAAY,SAAS,CAAA;AACvC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,gCAAA,EAAmC,SAAS,CAAA,CAAE,CAAA;AAAA,MAC5D,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,sCAAsC,KAAK,CAAA;AAAA,MAC1D;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAKL,IAAA,MAAM,wBAAA,GAA2B,WAAA,CAAY,CAAC,SAAA,KAAsB;AAClE,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAE9B,QAAA,MAAM,MAAM,MAAA,CAAO,eAAA;AAEnB,QAAA,MAAM,cAAc,GAAA,CAAI,aAAA;AAAA,UACtB,eAAe,SAAS,CAAA,2BAAA,EAA8B,SAAS,CAAA,mBAAA,EAC7C,SAAS,iCAAiC,SAAS,CAAA,EAAA;AAAA,SACvE;AAEA,QAAA,IAAI,CAAC,WAAA,EAAa;AAElB,QAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA;AACvD,QAAA,IAAI,CAAC,iBAAA,EAAmB;AAExB,QAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,aAAA,CAAc,gCAAgC,CAAA;AAClF,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,SAAA,CAAU,MAAA,EAAO;AACjB,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA,mCAAA,EAAsC,SAAS,CAAA,CAAE,CAAA;AAAA,QAC/D;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAAA,MAC5D;AAAA,IACF,CAAA,EAAG,EAAE,CAAA;AAML,IAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,CAAC,SAAA,KAAiC;AACtE,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,MAAA,EAAQ,eAAA,EAAiB,OAAO,EAAC;AAEtC,MAAA,MAAM,MAAM,MAAA,CAAO,eAAA;AACnB,MAAA,MAAM,iBAA4B,EAAC;AAEnC,MAAA,IAAI,cAAc,sBAAA,EAAwB;AACxC,QAAA,MAAM,SAAA,GAAY,GAAA,CAAI,gBAAA,CAAiB,qCAAqC,CAAA;AAC5E,QAAA,SAAA,CAAU,QAAQ,CAAA,KAAA,KAAS;AACzB,UAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,MAAM,KAAK,KAAA,CAAM,YAAA,CAAa,iBAAiB,CAAA,IAAK,EAAA;AACpF,UAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,WAAW,CAAA,IAAK,CAAC,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG;AACxF,YAAA,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,UAC3B;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,cAAc,qBAAA,EAAuB;AAC9C,QAAA,MAAM,SAAA,GAAY,GAAA,CAAI,gBAAA,CAAiB,qCAAqC,CAAA;AAC5E,QAAA,SAAA,CAAU,QAAQ,CAAA,KAAA,KAAS;AACzB,UAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,MAAM,KAAK,KAAA,CAAM,YAAA,CAAa,iBAAiB,CAAA,IAAK,EAAA;AACpF,UAAA,IAAI,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG;AAC3C,YAAA,cAAA,CAAe,KAAK,KAAK,CAAA;AAAA,UAC3B;AAAA,QACF,CAAC,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,MAAM,cAAc,GAAA,CAAI,aAAA;AAAA,UACtB,CAAA,YAAA,EAAe,SAAS,CAAA,2BAAA,EAA8B,SAAS,CAAA,EAAA;AAAA,SACjE;AACA,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,cAAA,CAAe,KAAK,WAAW,CAAA;AAAA,QACjC;AAAA,MACF;AAEA,MAAA,OAAO,cAAA;AAAA,IACT,CAAA,EAAG,EAAE,CAAA;AAML,IAAA,MAAM,gBAAA,GAAmB,WAAA,CAAY,CAAC,SAAA,EAAmB,OAAA,KAA2B;AAClF,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,UAAA,MAAA,CAAO,KAAK,4CAA4C,CAAA;AACxD,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,MAAM,MAAA,CAAO,eAAA;AACnB,QAAA,MAAM,cAAA,GAAiB,kBAAkB,SAAS,CAAA;AAElD,QAAA,cAAA,CAAe,QAAQ,CAAA,WAAA,KAAe;AACpC,UAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA;AACvD,UAAA,IAAI,CAAC,iBAAA,EAAmB;AAGxB,UAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,aAAA,CAAc,6BAA6B,CAAA;AAC9E,UAAA,IAAI,QAAA,WAAmB,MAAA,EAAO;AAE9B,UAAA,IAAI,CAAC,OAAA,EAAS;AAGd,UAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACvC,UAAA,OAAA,CAAQ,SAAA,GAAY,4BAAA;AACpB,UAAA,OAAA,CAAQ,YAAA,CAAa,eAAe,MAAM,CAAA;AAE1C,UAAA,MAAM,GAAA,GAAM,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACnC,UAAA,GAAA,CAAI,GAAA,GAAM,OAAA;AACV,UAAA,GAAA,CAAI,GAAA,GAAM,EAAA;AACV,UAAA,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,EAAO;AAAA,YACvB,KAAA,EAAO,MAAA;AAAA,YACP,MAAA,EAAQ,MAAA;AAAA,YACR,SAAA,EAAW,SAAA;AAAA,YACX,aAAA,EAAe;AAAA,WAChB,CAAA;AACD,UAAA,OAAA,CAAQ,YAAY,GAAG,CAAA;AAEvB,UAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,YAC3B,QAAA,EAAU,UAAA;AAAA,YACV,GAAA,EAAK,GAAA;AAAA,YACL,IAAA,EAAM,GAAA;AAAA,YACN,KAAA,EAAO,MAAA;AAAA,YACP,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,MAAA;AAAA,YACT,UAAA,EAAY,QAAA;AAAA,YACZ,cAAA,EAAgB,QAAA;AAAA,YAChB,MAAA,EAAQ,KAAA;AAAA,YACR,aAAA,EAAe,MAAA;AAAA,YACf,OAAA,EAAS,KAAA;AAAA,YACT,SAAA,EAAW,YAAA;AAAA,YACX,eAAA,EAAiB,2BAAA;AAAA,YACjB,OAAA,EAAS,GAAA;AAAA,YACT,UAAA,EAAY;AAAA,WACb,CAAA;AAED,UAAA,MAAM,kBAAmB,iBAAA,CAAkC,KAAA,CAAM,QAAA,IAAY,gBAAA,CAAiB,iBAAiB,CAAA,CAAE,QAAA;AACjH,UAAA,IAAI,eAAA,KAAoB,QAAA,IAAY,CAAC,eAAA,EAAiB;AACpD,YAAC,iBAAA,CAAkC,MAAM,QAAA,GAAW,UAAA;AAAA,UACtD;AAEA,UAAA,iBAAA,CAAkB,YAAY,OAAO,CAAA;AAErC,UAAA,qBAAA,CAAsB,MAAM;AAC1B,YAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AAAA,UAC1B,CAAC,CAAA;AAAA,QACH,CAAC,CAAA;AAED,QAAA,MAAA,CAAO,KAAK,CAAA,uBAAA,EAA0B,cAAA,CAAe,MAAM,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAE,CAAA;AAAA,MAC1F,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,+BAA+B,KAAK,CAAA;AAAA,MACnD;AAAA,IACF,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAMtB,IAAA,MAAM,eAAA,GAAkB,WAAA,CAAY,CAAC,SAAA,EAAmB,IAAA,KAAwB;AAC9E,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAC5B,UAAA,MAAA,CAAO,KAAK,2CAA2C,CAAA;AACvD,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,MAAM,MAAA,CAAO,eAAA;AACnB,QAAA,MAAM,cAAA,GAAiB,kBAAkB,SAAS,CAAA;AAElD,QAAA,cAAA,CAAe,QAAQ,CAAA,WAAA,KAAe;AACpC,UAAA,MAAM,iBAAA,GAAoB,WAAA,CAAY,OAAA,CAAQ,SAAS,CAAA;AACvD,UAAA,IAAI,CAAC,iBAAA,EAAmB;AAGxB,UAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,aAAA,CAAc,4BAA4B,CAAA;AAC7E,UAAA,IAAI,QAAA,WAAmB,MAAA,EAAO;AAE9B,UAAA,IAAI,CAAC,IAAA,EAAM;AAEX,UAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,KAAK,CAAA;AACvC,UAAA,OAAA,CAAQ,SAAA,GAAY,2BAAA;AACpB,UAAA,OAAA,CAAQ,YAAA,CAAa,eAAe,MAAM,CAAA;AAC1C,UAAA,OAAA,CAAQ,WAAA,GAAc,IAAA;AAEtB,UAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,KAAA,EAAO;AAAA,YAC3B,QAAA,EAAU,UAAA;AAAA,YACV,GAAA,EAAK,GAAA;AAAA,YACL,IAAA,EAAM,GAAA;AAAA,YACN,KAAA,EAAO,MAAA;AAAA,YACP,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,MAAA;AAAA,YACT,UAAA,EAAY,QAAA;AAAA,YACZ,cAAA,EAAgB,QAAA;AAAA,YAChB,MAAA,EAAQ,KAAA;AAAA,YACR,aAAA,EAAe,MAAA;AAAA,YACf,UAAA,EAAY,8CAAA;AAAA,YACZ,SAAA,EAAW,QAAA;AAAA,YACX,QAAA,EAAU,KAAA;AAAA,YACV,KAAA,EAAO,SAAA;AAAA,YACP,eAAA,EAAiB,2BAAA;AAAA,YACjB,QAAA,EAAU,QAAA;AAAA,YACV,OAAA,EAAS,GAAA;AAAA,YACT,UAAA,EAAY;AAAA,WACb,CAAA;AAED,UAAA,MAAM,kBAAmB,iBAAA,CAAkC,KAAA,CAAM,QAAA,IAAY,gBAAA,CAAiB,iBAAiB,CAAA,CAAE,QAAA;AACjH,UAAA,IAAI,eAAA,KAAoB,QAAA,IAAY,CAAC,eAAA,EAAiB;AACpD,YAAC,iBAAA,CAAkC,MAAM,QAAA,GAAW,UAAA;AAAA,UACtD;AAEA,UAAA,iBAAA,CAAkB,YAAY,OAAO,CAAA;AAErC,UAAA,qBAAA,CAAsB,MAAM;AAC1B,YAAA,OAAA,CAAQ,MAAM,OAAA,GAAU,GAAA;AAAA,UAC1B,CAAC,CAAA;AAAA,QACH,CAAC,CAAA;AAED,QAAA,MAAA,CAAO,KAAK,CAAA,sBAAA,EAAyB,cAAA,CAAe,MAAM,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAE,CAAA;AAAA,MACzF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,8BAA8B,KAAK,CAAA;AAAA,MAClD;AAAA,IACF,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAMtB,IAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,CAAC,SAAA,KAAuB;AAC7D,MAAA,IAAI;AACF,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,eAAA,EAAiB;AAE9B,QAAA,MAAM,MAAM,MAAA,CAAO,eAAA;AACnB,QAAA,MAAM,SAAA,GAAY,yDAAA;AAElB,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,MAAM,cAAA,GAAiB,kBAAkB,SAAS,CAAA;AAClD,UAAA,cAAA,CAAe,QAAQ,CAAA,EAAA,KAAM;AAC3B,YAAA,MAAM,OAAA,GAAU,EAAA,CAAG,OAAA,CAAQ,SAAS,CAAA;AACpC,YAAA,IAAI,OAAA,EAAS;AACX,cAAA,OAAA,CAAQ,iBAAiB,SAAS,CAAA,CAAE,QAAQ,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA;AAAA,YAC7D;AAAA,UACF,CAAC,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,GAAA,CAAI,iBAAiB,SAAS,CAAA,CAAE,QAAQ,CAAA,EAAA,KAAM,EAAA,CAAG,QAAQ,CAAA;AAAA,QAC3D;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAA,CAAO,KAAA,CAAM,kCAAkC,KAAK,CAAA;AAAA,MACtD;AAAA,IACF,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAGtB,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,QAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,QAAA,MAAM,QAAA,GAAW,iBAAiB,MAAA,CAAO,cAAA;AAEzC,QAAA,iBAAA,CAAkB,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AAC3C,UAAA,iBAAA,CAAkB,IAAI,CAAA;AAEtB,UAAA,IAAI,CAAC,OAAO,YAAA,EAAc;AACxB,YAAA,MAAM,QAAA,GAAW,CAAA;;AAAA;AAAA;;AAAA;;AAAA;;AAAA,kCAAA,CAAA;AACjB,YAAA,aAAA,CAAc,QAAQ,CAAA;AACtB,YAAA,MAAA,CAAO,MAAM,QAAQ,CAAA;AAAA,UACvB,CAAA,MAAA,IAAW,CAAC,MAAA,CAAO,YAAA,EAAc;AAC/B,YAAA,MAAA,CAAO,IAAA;AAAA,cACL,CAAA;AAAA,UAAA,EACa,OAAO,aAAa;AAAA,UAAA,EACpB,OAAO,aAAa;AAAA,wCAAA;AAAA,aAEnC;AAAA,UACF;AAAA,QACF,CAAC,CAAA,CAAE,KAAA,CAAM,CAAC,KAAA,KAAU;AAClB,UAAA,MAAA,CAAO,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACrD,UAAA,iBAAA,CAAkB,IAAI,CAAA;AAAA,QACxB,CAAC,CAAA;AAAA,MACH;AAAA,IACF,CAAA,EAAG,CAAC,aAAA,EAAe,cAAc,CAAC,CAAA;AAElC,IAAA,MAAM,gBAAA,GAAmB,YAAY,MAAM;AACzC,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,aAAA,EAAe;AACpC,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AAEF,QAAA,IAAI,OAAO,eAAA,EAAiB;AAC1B,UAAA,MAAM,KAAA,GAAQ,OAAO,eAAA,CAAgB,KAAA;AACrC,UAAA,MAAM,IAAA,GAAO,OAAO,eAAA,CAAgB,IAAA;AAGpC,UAAA,IACE,OAAO,QAAA,CAAS,KAAK,CAAA,IACrB,KAAA,EAAO,SAAS,WAAW,CAAA,IAC3B,IAAA,EAAM,WAAA,EAAa,SAAS,KAAK,CAAA,IACjC,MAAM,WAAA,EAAa,QAAA,CAAS,YAAY,CAAA,EACxC;AACA,YAAA,MAAM,WAAW,UAAA,IAAc,CAAA;;AAAA;AAAA;;AAAA,4BAAA,CAAA;AAC/B,YAAA,MAAA,CAAO,MAAM,QAAQ,CAAA;AACrB,YAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,YAAA,OAAA,GAAU,QAAQ,CAAA;AAClB,YAAA;AAAA,UACF;AAAA,QACF;AAEA,QAAA,UAAA,CAAW,YAAY;AACrB,UAAA,IAAI;AACF,YAAA,IAAI,sBAAsB,OAAA,EAAS;AACjC,cAAA,MAAM,qBAAA,CAAsB,OAAA;AAC5B,cAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,cAAA,MAAA,IAAS;AAAA,YACX;AAAA,UAGF,SAAS,KAAA,EAAO;AACd,YAAA,MAAM,YAAA,GACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,2BAAA;AAC3C,YAAA,MAAA,CAAO,KAAA,CAAM,8BAA8B,YAAY,CAAA;AACvD,YAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,YAAA,OAAA,GAAU,YAAY,CAAA;AAAA,UACxB;AAAA,QACF,GAAG,GAAG,CAAA;AAAA,MACR,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GACJ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,sCAAA;AAC3C,QAAA,MAAA,CAAO,KAAA,CAAM,iCAAiC,KAAK,CAAA;AACnD,QAAA,YAAA,CAAa,OAAA,GAAU,KAAA;AACvB,QAAA,OAAA,GAAU,YAAY,CAAA;AAAA,MACxB;AAAA,IACF,GAAG,CAAC,uBAAA,EAAyB,MAAA,EAAQ,OAAA,EAAS,UAAU,CAAC,CAAA;AAGzD,IAAA,mBAAA;AAAA,MACE,GAAA;AAAA,MACA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,kBAAA;AAAA,QACA,kBAAA;AAAA,QACA,gBAAA;AAAA,QACA,YAAA;AAAA,QACA,uBAAA;AAAA,QACA,kBAAA;AAAA,QACA,iBAAA;AAAA,QACA,gBAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAA;AAAA,QACA,YAAA;AAAA,QACA,cAAA;AAAA,QACA,aAAA;AAAA,QACA,4BAAA;AAAA,QACA,0BAAA;AAAA,QACA,iBAAA;AAAA,QACA,oBAAA;AAAA,QACA,qBAAA;AAAA,QACA,wBAAA;AAAA,QACA,gBAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OACF,CAAA;AAAA,MACA,CAAC,OAAA,EAAS,kBAAA,EAAoB,kBAAA,EAAoB,gBAAA,EAAkB,cAAc,uBAAA,EAAyB,kBAAA,EAAoB,iBAAA,EAAmB,gBAAA,EAAkB,MAAA,EAAQ,OAAA,EAAS,UAAU,YAAA,EAAc,cAAA,EAAgB,aAAA,EAAe,4BAAA,EAA8B,0BAAA,EAA4B,iBAAA,EAAmB,sBAAsB,qBAAA,EAAuB,wBAAA,EAA0B,gBAAA,EAAkB,eAAA,EAAiB,kBAAkB;AAAA,KACvb;AAEA,IAAA,uCAAU,QAAA,EAAA,QAAA,CAAS,EAAE,SAAA,EAAW,gBAAA,EAAkB,CAAA,EAAE,CAAA;AAAA,EACtD;AACF;AAEA,aAAA,CAAc,WAAA,GAAc,eAAA;ACz1DrB,IAAM,oBAAA,GAAuBC,UAAAA;AAAA,EAClC,CAAC,EAAE,KAAA,GAAQ,GAAA,EAAK,SAAS,GAAA,EAAK,WAAA,EAAa,QAAA,EAAS,EAAG,GAAA,KAAQ;AAC7D,IAAA,MAAM,SAAA,GAAYC,OAA0B,IAAI,CAAA;AAChD,IAAA,MAAM,YAAA,GAAeA,OAAuB,IAAI,CAAA;AAChD,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,SAAS,KAAK,CAAA;AAChD,IAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,SAAS,IAAI,CAAA;AAC3C,IAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,SAA0C,IAAI,CAAA;AAChF,IAAA,MAAM,CAAC,YAAY,aAAa,CAAA,GAAIA,SAAS,EAAE,KAAA,EAAO,QAAQ,CAAA;AAG9D,IAAAC,UAAU,MAAM;AACd,MAAA,MAAM,mBAAmB,MAAM;AAC7B,QAAA,IAAI,aAAa,OAAA,EAAS;AACxB,UAAA,MAAM,cAAA,GAAiB,aAAa,OAAA,CAAQ,WAAA;AAC5C,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,cAAA,GAAiB,IAAI,KAAK,CAAA;AACpD,UAAA,MAAM,cAAc,KAAA,GAAQ,MAAA;AAC5B,UAAA,MAAM,YAAY,QAAA,GAAW,WAAA;AAE7B,UAAA,aAAA,CAAc;AAAA,YACZ,KAAA,EAAO,QAAA;AAAA,YACP,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,QACH;AAAA,MACF,CAAA;AAEA,MAAA,UAAA,CAAW,kBAAkB,GAAG,CAAA;AAChC,MAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,gBAAgB,CAAA;AAClD,MAAA,OAAO,MAAM,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,gBAAgB,CAAA;AAAA,IACpE,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAElB,IAAA,MAAM,gBAAA,GAAmBC,YAAY,MAAM;AACzC,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,MAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,MAAA,OAAO,EAAE,QAAQ,GAAA,EAAI;AAAA,IACvB,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,MAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,EAAE,MAAA,EAAQ,GAAA,EAAI,GAAI,MAAA;AAGxB,MAAA,MAAA,CAAO,QAAQ,UAAA,CAAW,KAAA;AAC1B,MAAA,MAAA,CAAO,SAAS,UAAA,CAAW,MAAA;AAG3B,MAAA,GAAA,CAAI,WAAA,GAAc,SAAA;AAClB,MAAA,GAAA,CAAI,SAAA,GAAY,MAAA,CAAO,UAAA,GAAa,GAAA,GAAM,CAAA,GAAI,CAAA;AAC9C,MAAA,GAAA,CAAI,OAAA,GAAU,OAAA;AACd,MAAA,GAAA,CAAI,QAAA,GAAW,OAAA;AACf,MAAA,GAAA,CAAI,qBAAA,GAAwB,IAAA;AAG5B,MAAA,GAAA,CAAI,UAAU,CAAA,EAAG,CAAA,EAAG,UAAA,CAAW,KAAA,EAAO,WAAW,MAAM,CAAA;AAAA,IACzD,CAAA,EAAG,CAAC,UAAA,EAAY,gBAAgB,CAAC,CAAA;AAEjC,IAAA,MAAM,KAAA,GAAQA,YAAY,MAAM;AAC9B,MAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,MAAM,EAAE,KAAI,GAAI,MAAA;AAChB,MAAA,GAAA,CAAI,UAAU,CAAA,EAAG,CAAA,EAAG,UAAA,CAAW,KAAA,EAAO,WAAW,MAAM,CAAA;AACvD,MAAA,cAAA,CAAe,MAAM,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,IACvC,CAAA,EAAG,CAAC,UAAA,EAAY,gBAAgB,CAAC,CAAA;AAEjC,IAAA,MAAM,mBAAA,GAAsBA,YAAY,MAAM;AAC5C,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,MAAA,IAAU,OAAA,EAAS,OAAO,IAAA;AAE/B,MAAA,OAAO,MAAA,CAAO,UAAU,WAAW,CAAA;AAAA,IACrC,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,IAAA,MAAM,mBAAA,GAAsBA,WAAAA;AAAA,MAC1B,CAAC,CAAA,KAA2C;AAC1C,QAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,QAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,QAAA,MAAM,IAAA,GAAO,OAAO,qBAAA,EAAsB;AAC1C,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,GAAQ,IAAA,CAAK,KAAA;AACnC,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,MAAA;AAEpC,QAAA,IAAI,OAAA,EAAiB,OAAA;AAErB,QAAA,IAAI,aAAa,CAAA,EAAG;AAClB,UAAA,MAAM,QAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,IAAK,CAAA,CAAE,eAAe,CAAC,CAAA;AAChD,UAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,UAAA,OAAA,GAAU,KAAA,CAAM,OAAA;AAChB,UAAA,OAAA,GAAU,KAAA,CAAM,OAAA;AAAA,QAClB,CAAA,MAAO;AACL,UAAA,OAAA,GAAU,CAAA,CAAE,OAAA;AACZ,UAAA,OAAA,GAAU,CAAA,CAAE,OAAA;AAAA,QACd;AAEA,QAAA,OAAO;AAAA,UACL,CAAA,EAAA,CAAI,OAAA,GAAU,IAAA,CAAK,IAAA,IAAQ,MAAA;AAAA,UAC3B,CAAA,EAAA,CAAI,OAAA,GAAU,IAAA,CAAK,GAAA,IAAO;AAAA,SAC5B;AAAA,MACF,CAAA;AAAA,MACA;AAAC,KACH;AAEA,IAAA,MAAM,QAAA,GAAWA,WAAAA;AAAA,MACf,CAAC,MAAgC,EAAA,KAAiC;AAChE,QAAA,MAAM,SAAS,gBAAA,EAAiB;AAChC,QAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,QAAA,MAAM,EAAE,KAAI,GAAI,MAAA;AAEhB,QAAA,GAAA,CAAI,SAAA,EAAU;AACd,QAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,CAAC,CAAA;AACzB,QAAA,GAAA,CAAI,MAAA,CAAO,EAAA,CAAG,CAAA,EAAG,EAAA,CAAG,CAAC,CAAA;AACrB,QAAA,GAAA,CAAI,MAAA,EAAO;AAEX,QAAA,cAAA,CAAe,MAAM,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,MACxC,CAAA;AAAA,MACA,CAAC,gBAAgB;AAAA,KACnB;AAEA,IAAA,MAAM,YAAA,GAAeA,WAAAA;AAAA,MACnB,CAAC,CAAA,KAA2C;AAC1C,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,KAAA,GAAQ,oBAAoB,CAAC,CAAA;AACnC,QAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,QAAA,YAAA,CAAa,IAAI,CAAA;AACjB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB,CAAA;AAAA,MACA,CAAC,mBAAmB;AAAA,KACtB;AAEA,IAAA,MAAM,IAAA,GAAOA,WAAAA;AAAA,MACX,CAAC,CAAA,KAA2C;AAC1C,QAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,EAAW;AAE9B,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,MAAM,KAAA,GAAQ,oBAAoB,CAAC,CAAA;AACnC,QAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,QAAA,QAAA,CAAS,WAAW,KAAK,CAAA;AACzB,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB,CAAA;AAAA,MACA,CAAC,SAAA,EAAW,SAAA,EAAW,mBAAA,EAAqB,QAAQ;AAAA,KACtD;AAEA,IAAA,MAAM,WAAA,GAAcA,YAAY,MAAM;AACpC,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,YAAA,CAAa,IAAI,CAAA;AAAA,IACnB,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,UAAA,GAAaA,YAAY,MAAM;AACnC,MAAA,IAAI,OAAA,EAAS;AAEb,MAAA,MAAM,UAAU,mBAAA,EAAoB;AACpC,MAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,QAAA,WAAA,CAAY,OAAO,CAAA;AAAA,MACrB;AAAA,IACF,CAAA,EAAG,CAAC,OAAA,EAAS,mBAAA,EAAqB,WAAW,CAAC,CAAA;AAG9C,IAAAD,UAAU,MAAM;AACd,MAAA,WAAA,EAAY;AAAA,IACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,IAAA,MAAM,eAAA,GAAkBC,WAAAA;AAAA,MACtB,CAAC,CAAA,KAAwB;AACvB,QAAA,YAAA,CAAa,CAAC,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,CAAC,YAAY;AAAA,KACf;AAEA,IAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,MACtB,CAAC,CAAA,KAAwB;AACvB,QAAA,IAAA,CAAK,CAAC,CAAA;AAAA,MACR,CAAA;AAAA,MACA,CAAC,IAAI;AAAA,KACP;AAEA,IAAA,MAAM,aAAA,GAAgBA,YAAY,MAAM;AACtC,MAAA,WAAA,EAAY;AAAA,IACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,IAAA,MAAM,gBAAA,GAAmBA,YAAY,MAAM;AACzC,MAAA,WAAA,EAAY;AAAA,IACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,IAAA,MAAM,gBAAA,GAAmBA,WAAAA;AAAA,MACvB,CAAC,CAAA,KAAwB;AACvB,QAAA,YAAA,CAAa,CAAC,CAAA;AAAA,MAChB,CAAA;AAAA,MACA,CAAC,YAAY;AAAA,KACf;AAEA,IAAA,MAAM,eAAA,GAAkBA,WAAAA;AAAA,MACtB,CAAC,CAAA,KAAwB;AACvB,QAAA,IAAA,CAAK,CAAC,CAAA;AAAA,MACR,CAAA;AAAA,MACA,CAAC,IAAI;AAAA,KACP;AAEA,IAAA,MAAM,cAAA,GAAiBA,YAAY,MAAM;AACvC,MAAA,WAAA,EAAY;AAAA,IACd,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,IAAAC,mBAAAA;AAAA,MACE,GAAA;AAAA,MACA,OAAO;AAAA,QACL,KAAA;AAAA,QACA,mBAAA;AAAA,QACA,SAAS,MAAM;AAAA,OACjB,CAAA;AAAA,MACA,CAAC,KAAA,EAAO,mBAAA,EAAqB,OAAO;AAAA,KACtC;AAEA,IAAA,uBACEC,GAAAA,CAAAC,QAAAA,EAAA,EACG,QAAA,EAAA,QAAA,CAAS;AAAA,MACR,SAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA,EAAU;AAAA,QACR,WAAA,EAAa,eAAA;AAAA,QACb,WAAA,EAAa,eAAA;AAAA,QACb,SAAA,EAAW,aAAA;AAAA,QACX,YAAA,EAAc,gBAAA;AAAA,QACd,YAAA,EAAc,gBAAA;AAAA,QACd,WAAA,EAAa,eAAA;AAAA,QACb,UAAA,EAAY;AAAA,OACd;AAAA,MACA,OAAA,EAAS;AAAA,QACP,KAAA;AAAA,QACA,IAAA,EAAM;AAAA;AACR,KACD,CAAA,EACH,CAAA;AAAA,EAEJ;AACF;AAEA,oBAAA,CAAqB,WAAA,GAAc,sBAAA","file":"index.mjs","sourcesContent":["/**\r\n * PDF.js Configuration Provider\r\n * Manages global configuration for PDF.js worker and viewer paths\r\n * \r\n * COMPATIBILITY NOTE: This module is designed to work with both Vite and Next.js/webpack.\r\n * The worker source URL is computed lazily to avoid issues with webpack's handling of import.meta.\r\n */\r\n\r\nimport type { PdfJsConfig } from '../types';\r\nimport * as pdfjsLib from 'pdfjs-dist';\r\n\r\n/**\r\n * CDN paths for PDF.js (exported for manual fallback configuration)\r\n * Note: CDN URLs may cause CORS issues in some environments\r\n * \r\n * @example\r\n * // Manually configure CDN (not recommended)\r\n * setPdfJsConfig({ \r\n * viewerBasePath: CDN_VIEWER,\r\n * workerSrc: CDN_WORKER \r\n * });\r\n */\r\nexport const CDN_WORKER = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@5.3.93/build/pdf.worker.mjs';\r\nexport const CDN_VIEWER = 'https://mozilla.github.io/pdf.js';\r\n\r\n/**\r\n * Internal flag to track if worker source has been computed\r\n */\r\nlet _workerSrcComputed = false;\r\nlet _cachedWorkerSrc: string | null = null;\r\n\r\n/**\r\n * Get the worker source URL (computed lazily to avoid webpack import.meta issues)\r\n * - In browser environments, the bundler resolves the URL from node_modules\r\n * - The worker is loaded from the user's bundle (no CORS issues)\r\n * \r\n * This function uses lazy evaluation to avoid triggering webpack's\r\n * \"Critical dependency: Accessing import.meta directly is unsupported\" warning\r\n * at module load time.\r\n */\r\nfunction getDefaultWorkerSrc(): string {\r\n // Return cached value if already computed\r\n if (_workerSrcComputed && _cachedWorkerSrc !== null) {\r\n return _cachedWorkerSrc;\r\n }\r\n\r\n // Default fallback\r\n let workerSrc = '/pdfjs/build/pdf.worker.mjs';\r\n\r\n // Only attempt import.meta resolution in browser environment\r\n if (typeof window !== 'undefined' && typeof URL !== 'undefined') {\r\n try {\r\n // Check if import.meta is available (ESM environment like Vite)\r\n // Use indirect access to avoid webpack static analysis issues\r\n const meta = (function() {\r\n try {\r\n // This pattern avoids webpack's direct import.meta detection\r\n return new Function('return import.meta')();\r\n } catch {\r\n return null;\r\n }\r\n })();\r\n\r\n if (meta && meta.url) {\r\n workerSrc = new URL('pdfjs-dist/build/pdf.worker.mjs', meta.url).href;\r\n }\r\n } catch {\r\n // Fallback for environments that don't support import.meta.url (Next.js/webpack)\r\n // Use the public path fallback\r\n }\r\n }\r\n\r\n // Cache the result\r\n _workerSrcComputed = true;\r\n _cachedWorkerSrc = workerSrc;\r\n\r\n return workerSrc;\r\n}\r\n\r\n/**\r\n * Default configuration for PDF.js\r\n * \r\n * By default, the package uses:\r\n * - Worker: Loaded from node_modules (bundled by your build tool)\r\n * - Viewer: Served from /pdfjs/ (automatically copied by postinstall)\r\n * \r\n * The postinstall script automatically copies viewer files to your public/pdfjs/ directory.\r\n * If setup fails, run: npx signiphi-setup\r\n * \r\n * NOTE: workerSrc is initialized to null and computed lazily on first access\r\n * to ensure compatibility with Next.js/webpack environments.\r\n */\r\nlet globalConfig: Required<PdfJsConfig> = {\r\n viewerBasePath: '/pdfjs',\r\n workerSrc: '', // Lazy-initialized below\r\n};\r\n\r\n// Flag to track if globalConfig.workerSrc has been initialized\r\nlet _configInitialized = false;\r\n\r\n/**\r\n * Ensure config is initialized (called lazily)\r\n */\r\nfunction ensureConfigInitialized(): void {\r\n if (!_configInitialized) {\r\n globalConfig.workerSrc = getDefaultWorkerSrc();\r\n _configInitialized = true;\r\n \r\n // Initialize PDF.js worker in browser environment\r\n if (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = globalConfig.workerSrc;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Set PDF.js configuration\r\n * @param config - Partial configuration to merge with defaults\r\n * \r\n * @example\r\n * // Use self-hosted PDF.js files\r\n * setPdfJsConfig({ viewerBasePath: '/pdfjs' });\r\n * \r\n * @example\r\n * // Use custom CDN\r\n * setPdfJsConfig({ \r\n * viewerBasePath: 'https://my-cdn.com/pdfjs',\r\n * workerSrc: 'https://my-cdn.com/pdfjs/build/pdf.worker.mjs'\r\n * });\r\n */\r\nexport function setPdfJsConfig(config: Partial<PdfJsConfig>): void {\r\n // Ensure default config is computed first\r\n ensureConfigInitialized();\r\n \r\n if (config.viewerBasePath !== undefined) {\r\n globalConfig.viewerBasePath = config.viewerBasePath;\r\n }\r\n \r\n if (config.workerSrc !== undefined) {\r\n globalConfig.workerSrc = config.workerSrc;\r\n } else if (config.viewerBasePath !== undefined) {\r\n // Auto-update workerSrc based on viewerBasePath\r\n globalConfig.workerSrc = `${config.viewerBasePath}/build/pdf.worker.mjs`;\r\n }\r\n\r\n // Update PDF.js worker if in browser environment\r\n if (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = globalConfig.workerSrc;\r\n }\r\n}\r\n\r\n/**\r\n * Get current PDF.js configuration\r\n * @returns Current configuration\r\n */\r\nexport function getPdfJsConfig(): Required<PdfJsConfig> {\r\n // Ensure config is initialized before returning\r\n ensureConfigInitialized();\r\n return { ...globalConfig };\r\n}\r\n\r\n/**\r\n * Reset configuration to defaults (local files)\r\n */\r\nexport function resetPdfJsConfig(): void {\r\n // Clear cached worker src to force recomputation\r\n _workerSrcComputed = false;\r\n _cachedWorkerSrc = null;\r\n _configInitialized = false;\r\n \r\n // Re-initialize with fresh defaults\r\n ensureConfigInitialized();\r\n}\r\n\r\n/**\r\n * Initialize PDF.js configuration\r\n * This is called automatically when the first PDF operation is attempted,\r\n * but can also be called manually to pre-initialize the configuration.\r\n * \r\n * Unlike previous versions, this does NOT run at module load time to\r\n * ensure compatibility with Next.js/webpack environments.\r\n */\r\nexport function initializePdfJs(): void {\r\n ensureConfigInitialized();\r\n}\r\n\r\n","/**\r\n * PDF.js Version Check Utility\r\n * Detects version mismatches between viewer and worker\r\n */\r\n\r\nimport * as pdfjsLib from 'pdfjs-dist';\r\n\r\nexport interface PdfJsVersionCheckResult {\r\n viewerExists: boolean;\r\n versionMatch: boolean;\r\n viewerVersion?: string;\r\n workerVersion: string;\r\n errorMessage?: string;\r\n}\r\n\r\n/**\r\n * Check if PDF.js viewer files exist and versions match\r\n * @param viewerBasePath - Base path for the viewer (e.g., '/pdfjs')\r\n * @returns Version check result\r\n */\r\nexport async function checkPdfJsVersion(\r\n viewerBasePath: string = '/pdfjs'\r\n): Promise<PdfJsVersionCheckResult> {\r\n const workerVersion = pdfjsLib.version;\r\n \r\n try {\r\n // Check if version file exists (use version.txt, not dotfile — Next.js blocks dotfiles)\r\n const versionUrl = `${viewerBasePath}/version.txt`;\r\n const response = await fetch(versionUrl);\r\n \r\n if (!response.ok) {\r\n return {\r\n viewerExists: false,\r\n versionMatch: false,\r\n workerVersion,\r\n errorMessage: 'PDF.js viewer files not found. Run: npx signiphi-setup',\r\n };\r\n }\r\n \r\n const viewerVersion = (await response.text()).trim();\r\n const versionMatch = viewerVersion === workerVersion;\r\n \r\n if (!versionMatch) {\r\n return {\r\n viewerExists: true,\r\n versionMatch: false,\r\n viewerVersion,\r\n workerVersion,\r\n errorMessage: `Version mismatch: viewer=${viewerVersion}, worker=${workerVersion}. Run: npx signiphi-setup`,\r\n };\r\n }\r\n \r\n return {\r\n viewerExists: true,\r\n versionMatch: true,\r\n viewerVersion,\r\n workerVersion,\r\n };\r\n } catch (error) {\r\n return {\r\n viewerExists: false,\r\n versionMatch: false,\r\n workerVersion,\r\n errorMessage: 'Unable to check PDF.js version. Viewer files may not be installed.',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Log version check warnings to console\r\n * @param result - Version check result\r\n */\r\nexport function logVersionCheckWarning(result: PdfJsVersionCheckResult): void {\r\n if (!result.viewerExists) {\r\n console.warn(\r\n '⚠️ PDF.js viewer files not found.\\n' +\r\n 'The PDF viewer requires viewer files to be installed.\\n' +\r\n 'Run: npx signiphi-setup\\n' +\r\n 'Or reinstall the package: npm install @signiphi/pdf-signer'\r\n );\r\n } else if (!result.versionMatch) {\r\n console.warn(\r\n `⚠️ PDF.js version mismatch detected:\\n` +\r\n ` Viewer: ${result.viewerVersion}\\n` +\r\n ` Worker: ${result.workerVersion}\\n` +\r\n 'Run: npx signiphi-setup to sync versions'\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Check version and log warnings automatically\r\n * @param viewerBasePath - Base path for the viewer\r\n */\r\nexport async function checkAndLogPdfJsVersion(\r\n viewerBasePath: string = '/pdfjs'\r\n): Promise<PdfJsVersionCheckResult> {\r\n const result = await checkPdfJsVersion(viewerBasePath);\r\n \r\n if (!result.viewerExists || !result.versionMatch) {\r\n logVersionCheckWarning(result);\r\n }\r\n \r\n return result;\r\n}\r\n\r\n","/**\r\n * Logger Utility\r\n * Centralized logging system with environment-based log level control\r\n */\r\n\r\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error';\r\n\r\ninterface Logger {\r\n debug(message: string, ...args: unknown[]): void;\r\n info(message: string, ...args: unknown[]): void;\r\n warn(message: string, ...args: unknown[]): void;\r\n error(message: string, ...args: unknown[]): void;\r\n}\r\n\r\n/**\r\n * Determines if the current environment is production\r\n */\r\nfunction isProduction(): boolean {\r\n return typeof process !== 'undefined' && process.env.NODE_ENV === 'production';\r\n}\r\n\r\n/**\r\n * Creates a formatted log prefix\r\n */\r\nfunction createPrefix(level: LogLevel): string {\r\n return `[@signiphi/pdf-signer] [${level.toUpperCase()}]`;\r\n}\r\n\r\n/**\r\n * Creates the logger instance with environment-based behavior\r\n */\r\nfunction createLogger(): Logger {\r\n const isProd = isProduction();\r\n\r\n return {\r\n debug(message: string, ...args: unknown[]): void {\r\n if (!isProd) {\r\n console.log(createPrefix('debug'), message, ...args);\r\n }\r\n },\r\n\r\n info(message: string, ...args: unknown[]): void {\r\n if (!isProd) {\r\n console.log(createPrefix('info'), message, ...args);\r\n }\r\n },\r\n\r\n warn(message: string, ...args: unknown[]): void {\r\n if (!isProd) {\r\n console.warn(createPrefix('warn'), message, ...args);\r\n }\r\n },\r\n\r\n error(message: string, ...args: unknown[]): void {\r\n // Errors are shown in both development and production\r\n console.error(createPrefix('error'), message, ...args);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Singleton logger instance\r\n */\r\nexport const logger = createLogger();\r\n\r\n\r\n\r\n","import { useRef, useCallback, forwardRef, useImperativeHandle, useState, useEffect } from 'react';\r\nimport type { PdfViewerRef, PDFViewerApplication, FormField } from '../types';\r\nimport { FormFieldType } from '../types';\r\nimport { getPdfJsConfig, initializePdfJs } from '../utils/pdfjs-config';\r\nimport { checkPdfJsVersion } from '../utils/pdfjs-version-check';\r\nimport { logger } from '../utils';\r\n\r\n/**\r\n * Props for the headless PDF viewer core component\r\n */\r\nexport interface PdfViewerCoreProps {\r\n onLoad?: () => void;\r\n onError?: (error: string) => void;\r\n pdfjsBasePath?: string; // Override default PDF.js path (defaults to CDN)\r\n children: (props: {\r\n iframeRef: React.RefObject<HTMLIFrameElement>;\r\n handleIframeLoad: () => void;\r\n }) => React.ReactNode;\r\n}\r\n\r\n/**\r\n * Headless PDF viewer core component\r\n * Provides PDF loading and form field extraction logic without any UI\r\n */\r\nexport const PdfViewerCore = forwardRef<PdfViewerRef, PdfViewerCoreProps>(\r\n ({ onLoad, onError, pdfjsBasePath, children }, ref) => {\r\n const iframeRef = useRef<HTMLIFrameElement>(null);\r\n const loadedPdfUrl = useRef<string | null>(null);\r\n const initializationPromise = useRef<Promise<void> | null>(null);\r\n const isLoadingRef = useRef<boolean>(false);\r\n const [versionChecked, setVersionChecked] = useState(false);\r\n const [setupError, setSetupError] = useState<string | null>(null);\r\n\r\n const getPDFViewerApplication = useCallback((): PDFViewerApplication | null => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe || !iframe.contentWindow) {\r\n return null;\r\n }\r\n\r\n const PDFViewerApplication = (\r\n iframe.contentWindow as Window & { PDFViewerApplication: PDFViewerApplication }\r\n ).PDFViewerApplication;\r\n if (!PDFViewerApplication) {\r\n return null;\r\n }\r\n\r\n return PDFViewerApplication;\r\n } catch (error) {\r\n logger.error('Error accessing PDFViewerApplication:', error);\r\n return null;\r\n }\r\n }, []);\r\n\r\n const waitForInitialization = useCallback(async () => {\r\n const PDFViewerApplication = getPDFViewerApplication();\r\n if (!PDFViewerApplication) {\r\n throw new Error('PDFViewerApplication not available');\r\n }\r\n\r\n // Wait for the viewer to be initialized\r\n if (PDFViewerApplication.initializedPromise) {\r\n await PDFViewerApplication.initializedPromise;\r\n }\r\n\r\n // Wait for the document to be loaded\r\n if (PDFViewerApplication.pdfLoadingTask) {\r\n await PDFViewerApplication.pdfLoadingTask.promise;\r\n }\r\n\r\n return PDFViewerApplication;\r\n }, [getPDFViewerApplication]);\r\n\r\n // Store field metadata for font size information\r\n const fieldMetadataRef = useRef<FormField[]>([]);\r\n\r\n /**\r\n * Set field metadata to be used for font size and other field properties\r\n */\r\n const setFieldMetadata = useCallback((fields: FormField[]) => {\r\n fieldMetadataRef.current = fields;\r\n logger.info('[FIELD METADATA] Updated field metadata:', fields.map(f => ({ name: f.name, fontSize: f.fontSize, type: f.type })));\r\n }, []);\r\n\r\n /**\r\n * Extracts font sizes from stored field metadata or PDF field objects.\r\n * @returns A map of field names to font sizes in points.\r\n */\r\n const extractFieldFontSizes = useCallback(async (): Promise<Record<string, number>> => {\r\n const fontSizeMap: Record<string, number> = {};\r\n \r\n // First, try to get from stored field metadata (if available)\r\n for (const field of fieldMetadataRef.current) {\r\n if (field.type === FormFieldType.TEXT) { // Only TEXT fields\r\n if (field.fontSize && field.fontSize >= 8 && field.fontSize <= 72) {\r\n fontSizeMap[field.name] = field.fontSize;\r\n }\r\n }\r\n }\r\n \r\n // If no metadata available, try extracting from PDF field objects\r\n if (Object.keys(fontSizeMap).length === 0) {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication?.pdfDocument?.getFieldObjects) {\r\n const fieldObjects = await PDFViewerApplication.pdfDocument.getFieldObjects();\r\n \r\n for (const [fieldName, fields] of Object.entries(fieldObjects)) {\r\n const fieldArray = fields as any[];\r\n // Check all widgets (not just [0])\r\n for (const field of fieldArray) {\r\n // Extract from alternateText (TU field) if it has the format \"label|fontSize:XX\"\r\n if (field.alternateText) {\r\n const match = field.alternateText.match(/\\|fontSize:(\\d+)$/);\r\n if (match) {\r\n fontSizeMap[fieldName] = parseInt(match[1], 10);\r\n break; // Found it, no need to check other widgets\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n logger.warn('[FONT SIZE] Error extracting from PDF:', error);\r\n }\r\n }\r\n \r\n return fontSizeMap;\r\n }, [waitForInitialization]);\r\n\r\n /**\r\n * Injects CSS into the iframe's document to control the font size of PDF form fields.\r\n * This is necessary because PDF.js often applies inline styles that override external CSS,\r\n * and we need to ensure a consistent, readable font size for user-entered data.\r\n * Extracts font sizes from the PDF metadata to respect per-field fontSize properties.\r\n * @param doc The iframe's contentDocument.\r\n */\r\n const injectFormFieldFontSizeCSS = useCallback(async (doc: Document) => {\r\n const styleId = 'signiphi-pdf-font-size-style';\r\n \r\n // Remove existing style if present\r\n const existingStyle = doc.getElementById(styleId);\r\n if (existingStyle) {\r\n existingStyle.remove();\r\n }\r\n \r\n // Extract font sizes from field metadata or PDF\r\n const fontSizeMap = await extractFieldFontSizes();\r\n \r\n // Generate per-field CSS rules\r\n const cssRules: string[] = [];\r\n \r\n for (const [fieldName, fontSize] of Object.entries(fontSizeMap)) {\r\n cssRules.push(`\r\n input[name=\"${fieldName}\"],\r\n input[name=\"${fieldName}_date\"],\r\n select[name=\"${fieldName}\"] {\r\n font-size: ${fontSize}px !important;\r\n }\r\n `);\r\n }\r\n \r\n // Date and dropdown fields get 18px font size (they don't have fontSize setting in document-prepare)\r\n cssRules.push(`\r\n input[data-element-id][name*=\"date\"],\r\n select[data-element-id] {\r\n font-size: 18px !important;\r\n }\r\n `);\r\n \r\n // Fallback for other fields without explicit font size\r\n cssRules.push(`\r\n input[type=\"text\"][data-element-id]:not([style*=\"font-size\"]),\r\n select[data-element-id]:not([style*=\"font-size\"]) {\r\n font-size: 12px !important; /* Default fallback */\r\n }\r\n `);\r\n \r\n const style = doc.createElement('style');\r\n style.id = styleId;\r\n style.textContent = `/* Dynamic font sizes from PDF metadata */\\n${cssRules.join('\\n')}`;\r\n doc.head.appendChild(style);\r\n }, [extractFieldFontSizes]);\r\n\r\n const loadPdf = useCallback(\r\n async (pdfUrl: string) => {\r\n const iframe = iframeRef.current;\r\n if (!iframe) {\r\n logger.error('PDF viewer iframe not available');\r\n return;\r\n }\r\n\r\n // Prevent loading the same PDF multiple times or loading while already loading\r\n if (isLoadingRef.current || loadedPdfUrl.current === pdfUrl) {\r\n return;\r\n }\r\n\r\n isLoadingRef.current = true;\r\n loadedPdfUrl.current = pdfUrl;\r\n\r\n try {\r\n // Initialize PDF.js configuration (lazy, only runs once)\r\n // This ensures the worker is configured before any PDF operations\r\n initializePdfJs();\r\n \r\n // Fetch the PDF data first to avoid CORS issues\r\n const response = await fetch(pdfUrl);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch PDF: ${response.status}`);\r\n }\r\n\r\n const pdfBytes = await response.arrayBuffer();\r\n\r\n // Create a blob URL for the PDF data\r\n const blob = new Blob([pdfBytes], { type: 'application/pdf' });\r\n const blobUrl = URL.createObjectURL(blob);\r\n\r\n // Get PDF.js base path (use prop override or global config)\r\n const config = getPdfJsConfig();\r\n const basePath = pdfjsBasePath ?? config.viewerBasePath;\r\n\r\n // Load the PDF.js viewer with the blob URL\r\n const viewerUrl = `${basePath}/web/viewer.html?file=${encodeURIComponent(blobUrl)}`;\r\n iframe.src = viewerUrl;\r\n\r\n // Create a new initialization promise\r\n initializationPromise.current = new Promise((resolve, reject) => {\r\n const checkInitialization = () => {\r\n try {\r\n const PDFViewerApplication = getPDFViewerApplication();\r\n if (PDFViewerApplication && PDFViewerApplication.initializedPromise) {\r\n PDFViewerApplication.initializedPromise.then(async () => {\r\n // Inject CSS for dynamic font sizes in PDF form fields\r\n if (iframe.contentDocument) {\r\n await injectFormFieldFontSizeCSS(iframe.contentDocument);\r\n }\r\n resolve();\r\n }).catch(reject);\r\n } else {\r\n // Retry after a short delay\r\n setTimeout(checkInitialization, 100);\r\n }\r\n } catch (error) {\r\n reject(error);\r\n }\r\n };\r\n\r\n // Start checking after iframe loads\r\n setTimeout(checkInitialization, 500);\r\n });\r\n } catch (error) {\r\n logger.error('Error fetching PDF:', error);\r\n isLoadingRef.current = false;\r\n onError?.(error instanceof Error ? error.message : 'Unknown error');\r\n }\r\n },\r\n [getPDFViewerApplication, onError, pdfjsBasePath]\r\n );\r\n\r\n const getFormFieldValues = useCallback(async (): Promise<Record<string, string>> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n\r\n if (!PDFViewerApplication.pdfDocument) {\r\n return {};\r\n }\r\n\r\n const pdfDocument = PDFViewerApplication.pdfDocument;\r\n const values: Record<string, string> = {};\r\n\r\n // Use the PDF.js API to extract form field values\r\n if (pdfDocument.annotationStorage) {\r\n const annotationStorage = pdfDocument.annotationStorage;\r\n\r\n // Get field objects to understand form structure\r\n let fieldObjects: Record<string, unknown[]> = {};\r\n try {\r\n if (pdfDocument.getFieldObjects) {\r\n const result = await pdfDocument.getFieldObjects();\r\n fieldObjects = result || {};\r\n }\r\n } catch (error) {\r\n logger.warn('Error getting field objects:', error);\r\n }\r\n\r\n // Create mapping from field IDs to names and store field info with widgets\r\n type PDFField = {\r\n id?: string;\r\n type?: string;\r\n value?: unknown;\r\n exportValue?: string;\r\n buttonValue?: string;\r\n defaultValue?: unknown;\r\n name?: string;\r\n };\r\n \r\n type RadioButtonData = {\r\n id: string;\r\n data: unknown;\r\n widget?: PDFField;\r\n };\r\n\r\n const idToNameMap: Record<string, string> = {};\r\n const fieldInfo: Record<string, { type: string; widgets: PDFField[] }> = {};\r\n \r\n for (const [name, fields] of Object.entries(fieldObjects)) {\r\n const fieldArray = fields as PDFField[];\r\n \r\n // Store field type and ALL widgets (critical for radio buttons)\r\n fieldInfo[name] = {\r\n type: fieldArray[0]?.type || '',\r\n widgets: fieldArray\r\n };\r\n \r\n // Create ID to name mapping\r\n for (const field of fieldArray) {\r\n if (field.id) {\r\n idToNameMap[field.id] = name;\r\n }\r\n }\r\n }\r\n\r\n // Get annotation storage data\r\n let storedData: Record<string, unknown> = {};\r\n if (annotationStorage.serializable && annotationStorage.serializable.map) {\r\n const storageMap = annotationStorage.serializable.map;\r\n for (const [key, value] of storageMap.entries()) {\r\n storedData[key] = value;\r\n }\r\n } else if (typeof annotationStorage.getAll === 'function') {\r\n storedData = annotationStorage.getAll();\r\n }\r\n\r\n // Group radio button widgets by field name (Dockmaster approach)\r\n const radioGroups: Record<string, RadioButtonData[]> = {};\r\n \r\n // First pass: identify and group radio buttons from annotationStorage\r\n for (const [id, data] of Object.entries(storedData)) {\r\n const fieldName = idToNameMap[id];\r\n if (!fieldName) continue;\r\n \r\n const fieldType = fieldInfo[fieldName]?.type;\r\n \r\n // Check if this is a radio button field\r\n const isRadioButton = fieldType && (\r\n fieldType.toLowerCase().includes('radio') ||\r\n fieldType.toLowerCase().includes('radiobutton') ||\r\n fieldType === 'radiobutton'\r\n );\r\n \r\n // Fallback detection: if multiple widgets share the same field name, it's likely a radio group\r\n const widgetCount = fieldInfo[fieldName]?.widgets?.length || 0;\r\n const isLikelyRadioGroup = widgetCount > 1 && fieldName.toLowerCase().includes('radio');\r\n \r\n if (fieldName && (isRadioButton || isLikelyRadioGroup)) {\r\n if (!radioGroups[fieldName]) {\r\n radioGroups[fieldName] = [];\r\n }\r\n \r\n // Find the corresponding widget from fieldInfo\r\n const widget = fieldInfo[fieldName]?.widgets?.find((w: PDFField) => w.id === id);\r\n \r\n radioGroups[fieldName].push({ id, data, widget });\r\n logger.info(`[RADIO DETECT] Added widget ${id} to group ${fieldName}, data:`, data);\r\n }\r\n }\r\n \r\n logger.info(`[RADIO DETECT] Found ${Object.keys(radioGroups).length} radio groups:`, Object.keys(radioGroups));\r\n\r\n // Track all field names identified as radio groups so their widget\r\n // data doesn't leak into the non-radio processing loop below.\r\n // Without this, a radio group with no selection in annotationStorage\r\n // would have individual widget data ({value: false}) extracted as\r\n // the field value \"false\", overwriting seeded defaults.\r\n const processedRadioFieldNames = new Set(Object.keys(radioGroups));\r\n\r\n // Process radio groups to find selected options\r\n for (const [fieldName, radioButtons] of Object.entries(radioGroups)) {\r\n \r\n // Find the selected radio button (the one with value: true)\r\n const selectedRadio = radioButtons.find(rb => \r\n rb.data && typeof rb.data === 'object' && \r\n (rb.data as { value?: boolean }).value === true\r\n );\r\n \r\n if (selectedRadio) {\r\n // Sort radio buttons by their ID to get consistent ordering\r\n const sortedRadioButtons = [...radioButtons].sort((a, b) => {\r\n const aNum = parseInt(a.id.replace(/\\D/g, ''), 10) || 0;\r\n const bNum = parseInt(b.id.replace(/\\D/g, ''), 10) || 0;\r\n return aNum - bNum;\r\n });\r\n \r\n // Find the position of the selected widget\r\n const selectedIndex = sortedRadioButtons.findIndex(rb => rb.id === selectedRadio.id);\r\n \r\n // Store the widget position for later mapping to actual option values\r\n if (selectedIndex >= 0) {\r\n const exportValue = `__RADIO_OPTION_INDEX_${selectedIndex}__`;\r\n values[fieldName] = exportValue;\r\n logger.info(`[RADIO] Field ${fieldName}: selected index ${selectedIndex}, stored as ${exportValue}`);\r\n } else {\r\n values[fieldName] = 'true';\r\n logger.warn(`[RADIO] Field ${fieldName}: could not determine index, defaulting to 'true'`);\r\n }\r\n } else {\r\n logger.info(`[RADIO] Field ${fieldName}: no selection found in ${radioButtons.length} widgets`);\r\n }\r\n }\r\n\r\n // Extract values for non-radio fields from stored data\r\n for (const [id, data] of Object.entries(storedData)) {\r\n const fieldName = idToNameMap[id];\r\n \r\n // Skip if this field was identified as a radio group (regardless of\r\n // whether a selection was found) or already has a value (including \"\").\r\n if (fieldName && (fieldName in values || processedRadioFieldNames.has(fieldName))) {\r\n continue;\r\n }\r\n \r\n if (fieldName) {\r\n let extractedValue: string | undefined;\r\n\r\n if (data && typeof data === 'object') {\r\n const dataObj = data as Record<string, unknown>;\r\n if ('value' in dataObj) {\r\n extractedValue = String(dataObj.value);\r\n } else if ('formValue' in dataObj) {\r\n extractedValue = String(dataObj.formValue);\r\n } else if ('textContent' in dataObj) {\r\n extractedValue = String(dataObj.textContent);\r\n }\r\n } else if (data !== undefined && data !== null) {\r\n extractedValue = String(data);\r\n }\r\n\r\n if (extractedValue !== undefined) {\r\n values[fieldName] = extractedValue;\r\n }\r\n }\r\n }\r\n\r\n // Get default values for fields not in storage.\r\n // Use `in` check so that an explicit empty string from annotationStorage\r\n // (user cleared a pre-filled field) is not overwritten by the default.\r\n for (const [name, fields] of Object.entries(fieldObjects)) {\r\n if (!(name in values)) {\r\n const fieldArray = fields as PDFField[];\r\n const field = fieldArray[0];\r\n \r\n if (field && field.value !== undefined && field.value !== null) {\r\n const fieldValue = String(field.value);\r\n const fieldType = fieldInfo[name]?.type;\r\n \r\n // For radio buttons, convert to index pattern using fieldInfo widgets\r\n const isRadioButton = fieldType && (\r\n fieldType.toLowerCase().includes('radio') ||\r\n fieldType === 'radiobutton'\r\n );\r\n \r\n if (isRadioButton && fieldValue !== 'true' && fieldValue !== 'false') {\r\n // Use widgets from fieldInfo (not field.items which may be missing after filtering)\r\n const widgets = fieldInfo[name]?.widgets || [];\r\n \r\n if (widgets.length > 0) {\r\n // Sort widgets by ID to get consistent ordering\r\n const sortedWidgets = [...widgets].sort((a, b) => {\r\n const aNum = parseInt((a.id || '').replace(/\\D/g, ''), 10) || 0;\r\n const bNum = parseInt((b.id || '').replace(/\\D/g, ''), 10) || 0;\r\n return aNum - bNum;\r\n });\r\n \r\n // Find which widget matches the default value\r\n const selectedIndex = sortedWidgets.findIndex(widget => \r\n widget.exportValue === fieldValue || widget.buttonValue === fieldValue\r\n );\r\n \r\n if (selectedIndex >= 0) {\r\n values[name] = `__RADIO_OPTION_INDEX_${selectedIndex}__`;\r\n } else {\r\n }\r\n }\r\n } else {\r\n // Non-radio fields: use the value as-is\r\n values[name] = fieldValue;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return values;\r\n } catch (error) {\r\n logger.error('Error extracting form field values:', error);\r\n return {};\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const setFormFieldValues = useCallback(async (values: Record<string, string>): Promise<void> => {\r\n const iframe = iframeRef.current;\r\n if (!iframe || !iframe.contentWindow) {\r\n logger.warn('Cannot set field values: iframe not available');\r\n return;\r\n }\r\n\r\n try {\r\n // Wait for PDF.js to be ready\r\n await waitForInitialization();\r\n\r\n // Small delay to ensure fields are rendered in the DOM\r\n await new Promise(resolve => setTimeout(resolve, 200));\r\n\r\n const iframeDoc = iframe.contentWindow.document;\r\n \r\n // Set values for each field by accessing DOM directly\r\n for (const [fieldName, value] of Object.entries(values)) {\r\n try {\r\n // Try to decode the field name (PDF.js might use decoded names in DOM)\r\n // Extract the base name before __LABEL__, __SIGNER__, or __PLACEHOLDER__\r\n let decodedFieldName = fieldName;\r\n if (fieldName.includes('__LABEL__')) {\r\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__LABEL__'));\r\n } else if (fieldName.includes('__SIGNER__')) {\r\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__SIGNER__'));\r\n } else if (fieldName.includes('__PLACEHOLDER__')) {\r\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__PLACEHOLDER__'));\r\n }\r\n \r\n // Try multiple selectors to find the field\r\n // PDF.js might use either the encoded or decoded name\r\n let elements = iframeDoc.querySelectorAll(\r\n `[data-element-id=\"${fieldName}\"], [name=\"${fieldName}\"], [data-element-id=\"${decodedFieldName}\"], [name=\"${decodedFieldName}\"]`\r\n );\r\n \r\n if (elements.length === 0) {\r\n logger.warn(`Field element not found for: ${fieldName}`);\r\n continue;\r\n }\r\n \r\n // Handle radio buttons (multiple elements with same name)\r\n const firstElement = elements[0] as any;\r\n const isRadioGroup = elements.length > 1 && \r\n (firstElement.tagName || '').toLowerCase() === 'input' && \r\n (firstElement.type || '') === 'radio';\r\n \r\n if (isRadioGroup) {\r\n // Radio button group\r\n if (value.includes('__RADIO_OPTION_INDEX_')) {\r\n const match = value.match(/__RADIO_OPTION_INDEX_(\\d+)__/);\r\n if (match && match[1]) {\r\n const selectedIndex = parseInt(match[1], 10);\r\n if (selectedIndex < elements.length) {\r\n // First, uncheck all radio buttons in the group\r\n for (let i = 0; i < elements.length; i++) {\r\n const radioEl = elements[i] as any;\r\n if (radioEl.checked) {\r\n radioEl.checked = false;\r\n }\r\n }\r\n \r\n // Then check the selected one\r\n const radioElement = elements[selectedIndex] as any;\r\n radioElement.checked = true;\r\n \r\n // Dispatch events to notify PDF.js\r\n radioElement.dispatchEvent(new Event('change', { bubbles: true }));\r\n radioElement.dispatchEvent(new Event('input', { bubbles: true }));\r\n radioElement.dispatchEvent(new Event('click', { bubbles: true }));\r\n } else {\r\n logger.warn(`Radio button index ${selectedIndex} out of range for ${fieldName}`);\r\n }\r\n }\r\n }\r\n } else {\r\n // Single element (text, checkbox, dropdown, date, etc.)\r\n const element = elements[0] as any; // Use any to access properties from iframe context\r\n const tagName = (element.tagName || '').toLowerCase();\r\n \r\n // Check tagName instead of instanceof (iframe has different constructor context)\r\n if (tagName === 'input') {\r\n const inputType = element.type || 'text';\r\n if (inputType === 'checkbox') {\r\n const boolValue = value === 'true' || value === 'Yes' || value === 'On';\r\n element.checked = boolValue;\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n element.dispatchEvent(new Event('click', { bubbles: true }));\r\n } else if (inputType === 'radio') {\r\n // Single radio button\r\n element.checked = value === 'true' || value === element.value;\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n element.dispatchEvent(new Event('click', { bubbles: true }));\r\n } else {\r\n // Text, date, etc.\r\n element.value = value;\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n }\r\n } else if (tagName === 'select') {\r\n // Dropdown\r\n element.value = value;\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n } else if (tagName === 'textarea') {\r\n // Textarea\r\n element.value = value;\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n } else {\r\n logger.warn(`Unknown element type for field ${fieldName}: ${tagName}`);\r\n }\r\n }\r\n } catch (fieldError) {\r\n logger.error(`Error setting value for field ${fieldName}:`, fieldError);\r\n }\r\n }\r\n\r\n } catch (error) {\r\n logger.error('Error setting form field values:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const getAllFieldNames = useCallback(async (): Promise<string[]> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n\r\n if (!PDFViewerApplication.pdfDocument) {\r\n return [];\r\n }\r\n\r\n const pdfDocument = PDFViewerApplication.pdfDocument;\r\n\r\n let fieldObjects: Record<string, unknown[]> = {};\r\n try {\r\n if (pdfDocument.getFieldObjects) {\r\n const result = await pdfDocument.getFieldObjects();\r\n fieldObjects = result || {};\r\n }\r\n } catch (error) {\r\n return [];\r\n }\r\n\r\n return Object.keys(fieldObjects);\r\n } catch (error) {\r\n logger.error('Error getting all field names:', error);\r\n return [];\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const saveDocument = useCallback(async (): Promise<Uint8Array | null> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n\r\n if (!PDFViewerApplication.pdfDocument) {\r\n return null;\r\n }\r\n\r\n const pdfDocument = PDFViewerApplication.pdfDocument;\r\n\r\n if (typeof pdfDocument.saveDocument === 'function') {\r\n const savedBytes = await pdfDocument.saveDocument();\r\n return new Uint8Array(savedBytes);\r\n } else if (pdfDocument.getData) {\r\n const originalData = await pdfDocument.getData();\r\n return new Uint8Array(originalData);\r\n }\r\n\r\n return null;\r\n } catch (error) {\r\n logger.error('Error saving PDF document:', error);\r\n return null;\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const injectPlaceholders = useCallback((fields: Array<{ id: string; name: string; placeholder?: string }>) => {\r\n const iframe = iframeRef.current;\r\n if (!iframe || !iframe.contentWindow) {\r\n return;\r\n }\r\n\r\n // Wait for PDF.js to render the form fields\r\n setTimeout(() => {\r\n try {\r\n const iframeDoc = iframe.contentWindow!.document;\r\n \r\n // Create a map of field names to placeholders for O(1) lookup\r\n const placeholderMap = new Map<string, string>();\r\n fields.forEach(field => {\r\n if (field.placeholder) {\r\n placeholderMap.set(field.name, field.placeholder);\r\n placeholderMap.set(field.id, field.placeholder);\r\n }\r\n });\r\n\r\n // Query all input fields in the iframe\r\n const inputs = iframeDoc.querySelectorAll('input[data-element-id], input[name]');\r\n \r\n \r\n inputs.forEach((input) => {\r\n const htmlInput = input as HTMLInputElement;\r\n const fieldId = htmlInput.getAttribute('data-element-id') || htmlInput.name;\r\n \r\n if (fieldId) {\r\n const placeholder = placeholderMap.get(fieldId);\r\n if (placeholder) {\r\n htmlInput.placeholder = placeholder;\r\n }\r\n }\r\n });\r\n } catch (error) {\r\n logger.error('Error injecting placeholders:', error);\r\n }\r\n }, 1000); // Wait 1 second for PDF.js to render\r\n }, []);\r\n\r\n /**\r\n * Radio labels are now drawn on the PDF canvas in pdf-viewer-filter.ts\r\n * This function is kept for backwards compatibility but does nothing.\r\n * Labels drawn on canvas scale naturally with zoom - no special handling needed.\r\n */\r\n const injectRadioLabels = useCallback((_fields: Array<{ id: string; name: string; type: string; options?: string[] }>) => {\r\n // No-op: Radio option labels are now drawn on the PDF canvas in pdf-viewer-filter.ts\r\n // This provides natural zoom scaling like all other field labels\r\n }, []);\r\n\r\n const zoomIn = useCallback(async () => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.increaseScale === 'function') {\r\n PDFViewerApplication.pdfViewer.increaseScale();\r\n }\r\n } catch (error) {\r\n logger.error('Error zooming in:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const zoomOut = useCallback(async () => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.decreaseScale === 'function') {\r\n PDFViewerApplication.pdfViewer.decreaseScale();\r\n }\r\n } catch (error) {\r\n logger.error('Error zooming out:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const nextPage = useCallback(async () => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.nextPage === 'function') {\r\n PDFViewerApplication.pdfViewer.nextPage();\r\n }\r\n } catch (error) {\r\n logger.error('Error going to next page:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const previousPage = useCallback(async () => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.previousPage === 'function') {\r\n PDFViewerApplication.pdfViewer.previousPage();\r\n }\r\n } catch (error) {\r\n logger.error('Error going to previous page:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const getCurrentPage = useCallback(async (): Promise<number | null> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.currentPageNumber === 'number') {\r\n return PDFViewerApplication.pdfViewer.currentPageNumber;\r\n }\r\n return null;\r\n } catch (error) {\r\n // Silently return null if PDF viewer isn't ready yet (expected during initialization)\r\n // Only log if it's an unexpected error\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n if (!errorMsg.includes('not available') && !errorMsg.includes('not yet initialized')) {\r\n logger.error('Error getting current page:', error);\r\n }\r\n return null;\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const getTotalPages = useCallback(async (): Promise<number | null> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.pagesCount === 'number') {\r\n return PDFViewerApplication.pdfViewer.pagesCount;\r\n }\r\n return null;\r\n } catch (error) {\r\n // Silently return null if PDF viewer isn't ready yet (expected during initialization)\r\n // Only log if it's an unexpected error\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n if (!errorMsg.includes('not available') && !errorMsg.includes('not yet initialized')) {\r\n logger.error('Error getting total pages:', error);\r\n }\r\n return null;\r\n }\r\n }, [waitForInitialization]);\r\n\r\n /**\r\n * Attaches click interceptors to PDF form fields\r\n * Allows blocking interaction if custom validation fails\r\n * @param onFieldClick - Callback that receives field name and returns true to allow interaction, false to block\r\n */\r\n const attachFieldClickInterceptors = useCallback(async (\r\n onFieldClick: (fieldName: string, element?: HTMLElement) => boolean\r\n ) => {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) {\r\n logger.warn('Cannot attach field interceptors: iframe not ready');\r\n return;\r\n }\r\n\r\n try {\r\n // Use event delegation instead of attaching to individual elements\r\n // This survives PDF.js re-renders\r\n const doc = iframe.contentDocument;\r\n\r\n // Inject CSS for form field font size\r\n await injectFormFieldFontSizeCSS(doc);\r\n\r\n // Inject CSS styles for click highlighting (if not already present)\r\n const clickHighlightStyleId = 'signiphi-click-highlight-style';\r\n if (!doc.getElementById(clickHighlightStyleId)) {\r\n const style = doc.createElement('style');\r\n style.id = clickHighlightStyleId;\r\n style.textContent = `\r\n .clicked-field-annotation {\r\n outline: 2px solid #3b82f6 !important;\r\n outline-offset: 1px !important;\r\n box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.15) !important;\r\n border-radius: 3px !important;\r\n z-index: 999 !important;\r\n position: relative !important;\r\n }\r\n .clicked-field {\r\n outline: none !important;\r\n border-color: #3b82f6 !important;\r\n background-color: rgba(59, 130, 246, 0.05) !important;\r\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1) !important;\r\n }\r\n `;\r\n doc.head.appendChild(style);\r\n logger.info('[CLICK HIGHLIGHT] Injected CSS styles');\r\n }\r\n\r\n // Remove existing delegated listener if any\r\n if ((doc as any)._signiphiDelegatedHandler) {\r\n ['pointerdown', 'focusin', 'click', 'mousedown'].forEach(event => {\r\n doc.removeEventListener(event, (doc as any)._signiphiDelegatedHandler, true);\r\n });\r\n }\r\n\r\n // Create delegated handler\r\n const delegatedHandler = (e: Event) => {\r\n const target = e.target as HTMLElement;\r\n\r\n // Log ALL clicks in PDF for debugging\r\n logger.info(`[PDF CLICK] Element clicked:`, {\r\n tag: target.tagName,\r\n className: target.className,\r\n id: target.id,\r\n name: target.getAttribute('name'),\r\n eventType: e.type\r\n });\r\n\r\n // Check if target is a form field OR button (signature fields might be buttons)\r\n if (!['INPUT', 'SELECT', 'TEXTAREA', 'BUTTON'].includes(target.tagName)) {\r\n logger.info(`[PDF CLICK] Not a form field (${target.tagName}), checking for child/parent...`);\r\n\r\n // First check if this is a PDF.js widget annotation wrapper (SECTION with class containing \"Annotation\")\r\n let formElement: Element | null = null;\r\n if (target.tagName === 'SECTION' && target.className.includes('Annotation')) {\r\n // Look for input/select/textarea/button INSIDE this section\r\n formElement = target.querySelector('input, select, textarea, button');\r\n if (formElement) {\r\n logger.info(`[PDF CLICK] Found child form field in annotation:`, formElement.tagName);\r\n }\r\n }\r\n\r\n // If not found, try parent elements\r\n if (!formElement) {\r\n formElement = target.closest('input, select, textarea, button');\r\n if (formElement) {\r\n logger.info(`[PDF CLICK] Found parent form field:`, formElement.tagName);\r\n }\r\n }\r\n\r\n if (formElement) {\r\n // Recurse with the actual form element\r\n const newEvent = new Event(e.type, { bubbles: true, cancelable: true });\r\n Object.defineProperty(newEvent, 'target', { value: formElement, enumerable: true });\r\n delegatedHandler(newEvent);\r\n if (newEvent.defaultPrevented) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // Get field name\r\n const fieldName = target.getAttribute('name')\r\n || target.getAttribute('data-element-id')\r\n || target.getAttribute('id');\r\n\r\n if (!fieldName) {\r\n logger.info('[PDF CLICK] No field name found');\r\n return; // No identifier, ignore\r\n }\r\n\r\n logger.info(`Field click intercepted: ${fieldName}`, e.type);\r\n\r\n // Call callback first to determine if we should block (pass the element too)\r\n const shouldProceed = onFieldClick(fieldName, target);\r\n logger.info(`Field ${fieldName} shouldProceed: ${shouldProceed}`);\r\n\r\n // Only process pointerdown and mousedown events for highlighting and blocking\r\n // Let focusin and click events pass through for normal field behavior\r\n if (e.type !== 'pointerdown' && e.type !== 'mousedown') {\r\n // For focusin and click, only block if field is not allowed\r\n if (!shouldProceed) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n logger.info(`Blocked ${e.type} event for field: ${fieldName}`);\r\n }\r\n return; // Don't apply highlights on these events\r\n }\r\n\r\n // Apply click highlighting on the FIRST blocking event (when modal will open)\r\n if (!shouldProceed && e.type === 'pointerdown') {\r\n // Remove previous click highlights from all fields\r\n const previousClickHighlights = doc.querySelectorAll('.clicked-field');\r\n previousClickHighlights.forEach(el => el.classList.remove('clicked-field'));\r\n const previousAnnotationClickHighlights = doc.querySelectorAll('.clicked-field-annotation');\r\n previousAnnotationClickHighlights.forEach(el => el.classList.remove('clicked-field-annotation'));\r\n\r\n // Add click highlight to current field\r\n target.classList.add('clicked-field');\r\n\r\n // Also highlight the parent widget annotation if it exists\r\n const widgetAnnotation = target.closest('.widgetAnnotation, .textWidgetAnnotation, .choiceWidgetAnnotation, .buttonWidgetAnnotation');\r\n if (widgetAnnotation) {\r\n widgetAnnotation.classList.add('clicked-field-annotation');\r\n }\r\n\r\n logger.info(`[CLICK HIGHLIGHT] Applied to blocked field: ${fieldName}`, {\r\n hasAnnotation: !!widgetAnnotation,\r\n elementTag: target.tagName,\r\n eventType: e.type\r\n });\r\n\r\n // Block the interaction\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n logger.info(`Blocked interaction with field: ${fieldName}`);\r\n } \r\n // Apply on mousedown for allowed fields (normal interaction)\r\n else if (shouldProceed && e.type === 'mousedown') {\r\n // Remove previous click highlights from all fields\r\n const previousClickHighlights = doc.querySelectorAll('.clicked-field');\r\n previousClickHighlights.forEach(el => el.classList.remove('clicked-field'));\r\n const previousAnnotationClickHighlights = doc.querySelectorAll('.clicked-field-annotation');\r\n previousAnnotationClickHighlights.forEach(el => el.classList.remove('clicked-field-annotation'));\r\n\r\n // Add click highlight to current field\r\n target.classList.add('clicked-field');\r\n\r\n // Also highlight the parent widget annotation if it exists\r\n const widgetAnnotation = target.closest('.widgetAnnotation, .textWidgetAnnotation, .choiceWidgetAnnotation, .buttonWidgetAnnotation');\r\n if (widgetAnnotation) {\r\n widgetAnnotation.classList.add('clicked-field-annotation');\r\n }\r\n\r\n logger.info(`[CLICK HIGHLIGHT] Applied to allowed field: ${fieldName}`, {\r\n hasAnnotation: !!widgetAnnotation,\r\n elementTag: target.tagName,\r\n eventType: e.type\r\n });\r\n \r\n // DO NOT prevent default for allowed fields - let them focus and accept input\r\n }\r\n // Handle blocked pointerdown that's not the first one (shouldn't happen, but be safe)\r\n else if (!shouldProceed) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n e.stopImmediatePropagation();\r\n logger.info(`Blocked ${e.type} event for field: ${fieldName}`);\r\n }\r\n };\r\n\r\n // Store reference for cleanup\r\n (doc as any)._signiphiDelegatedHandler = delegatedHandler;\r\n\r\n // Attach delegated listener to document\r\n ['pointerdown', 'focusin', 'click', 'mousedown'].forEach(event => {\r\n doc.addEventListener(event, delegatedHandler, {\r\n capture: true,\r\n passive: false\r\n });\r\n });\r\n\r\n // Log how many fields we found (for diagnostics)\r\n let formElements = doc.querySelectorAll(\r\n 'input[data-element-id], select[data-element-id], textarea[data-element-id]'\r\n );\r\n if (formElements.length === 0) {\r\n formElements = doc.querySelectorAll('input[id], select[id], textarea[id]');\r\n }\r\n\r\n logger.info(`Attached delegated interceptor. Found ${formElements.length} form fields in PDF`);\r\n\r\n // Just log field names for diagnostics\r\n formElements.forEach((element) => {\r\n const fieldName = element.getAttribute('name')\r\n || element.getAttribute('data-element-id')\r\n || element.getAttribute('id');\r\n\r\n if (fieldName) {\r\n logger.info(`Found field: ${fieldName} (name: ${element.getAttribute('name')}, id: ${element.getAttribute('id')})`);\r\n }\r\n });\r\n } catch (error) {\r\n logger.error('Error attaching field click interceptors:', error);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Attach change/input listeners to PDF form fields\r\n * Uses the correct iframe reference to ensure listeners work after PDF.js initialization\r\n * @param onFieldChange - Callback when a field value changes\r\n * @returns Cleanup function to remove the listeners\r\n */\r\n const attachFieldChangeListeners = useCallback(async (\r\n onFieldChange: (fieldName: string, value: string, element: HTMLElement) => void\r\n ): Promise<() => void> => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) {\r\n logger.warn('Cannot attach field change listeners: iframe not ready');\r\n return () => {};\r\n }\r\n\r\n const doc = iframe.contentDocument;\r\n\r\n // Handler that extracts field info and calls the callback\r\n const handleChange = (event: Event) => {\r\n const target = event.target as HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement;\r\n if (!target || !['INPUT', 'SELECT', 'TEXTAREA'].includes(target.tagName)) {\r\n return;\r\n }\r\n\r\n const fieldName = target.getAttribute('name')\r\n || target.getAttribute('data-element-id')\r\n || target.getAttribute('id')\r\n || '';\r\n\r\n if (!fieldName) return;\r\n\r\n let value = '';\r\n if (target.tagName === 'INPUT') {\r\n const inputElement = target as HTMLInputElement;\r\n if (inputElement.type === 'checkbox') {\r\n value = inputElement.checked ? 'true' : 'false';\r\n } else if (inputElement.type === 'radio') {\r\n if (inputElement.checked) {\r\n value = inputElement.value || 'true';\r\n } else {\r\n return; // Don't fire for unchecked radios\r\n }\r\n } else {\r\n value = inputElement.value;\r\n }\r\n } else if (target.tagName === 'SELECT') {\r\n value = (target as HTMLSelectElement).value;\r\n } else if (target.tagName === 'TEXTAREA') {\r\n value = (target as HTMLTextAreaElement).value;\r\n }\r\n\r\n onFieldChange(fieldName, value, target as HTMLElement);\r\n };\r\n\r\n // Attach listeners with capture phase\r\n doc.addEventListener('change', handleChange, true);\r\n doc.addEventListener('input', handleChange, true);\r\n\r\n logger.info('Attached field change listeners to iframe document');\r\n\r\n // Return cleanup function\r\n return () => {\r\n doc.removeEventListener('change', handleChange, true);\r\n doc.removeEventListener('input', handleChange, true);\r\n logger.info('Removed field change listeners from iframe document');\r\n };\r\n } catch (error) {\r\n logger.error('Error attaching field change listeners:', error);\r\n return () => {};\r\n }\r\n }, []);\r\n\r\n /**\r\n * Add visual indicator to a PDF form field\r\n * Shows user the field's acknowledgement/completion state\r\n * @param fieldName - The field name (e.g., 'signature_field_main')\r\n * @param indicatorType - Type of indicator: 'completed' (green checkmark), 'pending-ack' (amber badge), or 'info' (subtle info icon)\r\n * @param allowedFieldIds - Comma-separated list of fieldIds (UUIDs) that should show indicators\r\n */\r\n /**\r\n * Add a visual indicator badge to a field's annotation section\r\n * \r\n * Field Indicator System - Three-state visual feedback for acknowledgement status:\r\n * - 'info' (gray 'i', 20x20px): Field has acknowledgements but is unfilled\r\n * - 'pending-ack' (amber '!', 24x24px): Field is filled but needs acknowledgement \r\n * - 'completed' (green '✓', 24x24px): Field is filled AND fully acknowledged\r\n * \r\n * Indicators are positioned in the top-right corner of the field annotation.\r\n * Only fields with acknowledgements will display indicators.\r\n * \r\n * @param fieldName - Name of the field to add indicator to\r\n * @param indicatorType - Type of indicator badge to display\r\n * @param allowedFieldIds - Optional comma-separated list of fieldIds (UUIDs) to filter which fields get indicators\r\n */\r\n const addFieldIndicator = useCallback(async (\r\n fieldName: string, \r\n indicatorType: 'completed' | 'pending-ack' | 'info' = 'completed',\r\n allowedFieldIds?: string\r\n ) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) {\r\n logger.warn('Cannot add field indicator: iframe not ready');\r\n return;\r\n }\r\n\r\n const doc = iframe.contentDocument;\r\n\r\n // Parse allowed fieldIds (UUIDs)\r\n const allowedIds = allowedFieldIds ? allowedFieldIds.split(',').map(id => id.trim()).filter(id => id) : null;\r\n\r\n logger.info(`Adding indicators for ${fieldName}, allowedFieldIds:`, allowedIds);\r\n\r\n // If no allowed IDs provided or empty, don't add any indicators\r\n if (allowedIds !== null && allowedIds.length === 0) {\r\n logger.info(`No fields allowed for indicators (${fieldName}), skipping`);\r\n return;\r\n }\r\n\r\n // Get PDF metadata to map fieldIds to PDF field names\r\n const pdfApp = getPDFViewerApplication();\r\n let fieldIdToPdfNameMap: Record<string, string> = {};\r\n\r\n if (pdfApp?.pdfDocument?.getData && allowedIds) {\r\n try {\r\n const pdfDoc = pdfApp.pdfDocument;\r\n\r\n // Get PDF bytes\r\n const pdfBytesRaw = await pdfDoc.getData!();\r\n logger.info('Got PDF bytes, type:', typeof pdfBytesRaw, 'isArrayBuffer:', pdfBytesRaw instanceof ArrayBuffer, 'isUint8Array:', pdfBytesRaw instanceof Uint8Array);\r\n logger.info('PDF bytes constructor:', pdfBytesRaw?.constructor?.name);\r\n logger.info('PDF bytes has buffer?:', !!(pdfBytesRaw as any)?.buffer);\r\n\r\n // Ensure we have a Uint8Array for pdf-lib\r\n let pdfBytes: Uint8Array;\r\n const rawData = pdfBytesRaw as any;\r\n\r\n if (pdfBytesRaw instanceof Uint8Array) {\r\n pdfBytes = pdfBytesRaw;\r\n } else if (rawData instanceof ArrayBuffer) {\r\n pdfBytes = new Uint8Array(rawData);\r\n } else if (rawData?.buffer instanceof ArrayBuffer) {\r\n // It's a typed array view (like Uint8Array from a different realm/iframe)\r\n pdfBytes = new Uint8Array(rawData.buffer, rawData.byteOffset || 0, rawData.byteLength || rawData.length);\r\n } else {\r\n logger.warn('Unexpected PDF bytes type, attempting direct conversion');\r\n pdfBytes = new Uint8Array(rawData);\r\n }\r\n\r\n logger.info('Converted to Uint8Array, length:', pdfBytes.length);\r\n\r\n // Use pdf-lib to read metadata\r\n const { PDFDocument, PDFName } = await import('pdf-lib');\r\n const pdfLibDoc = await PDFDocument.load(pdfBytes);\r\n logger.info('Successfully loaded PDF with pdf-lib');\r\n\r\n // Get the Info dictionary\r\n const infoRef = pdfLibDoc.context.trailerInfo.Info;\r\n if (infoRef) {\r\n const infoObj = pdfLibDoc.context.lookup(infoRef) as any;\r\n\r\n // Try to get SigniphiMetadata\r\n const metadataObj = infoObj?.get(PDFName.of('SigniphiMetadata'));\r\n\r\n if (metadataObj) {\r\n const signiphiMetadataStr = metadataObj.toString();\r\n\r\n // Parse the metadata (it's stored as a PDF string in format (JSON))\r\n let jsonStr = signiphiMetadataStr;\r\n const parenMatch = signiphiMetadataStr.match(/^\\((.*)\\)$/);\r\n if (parenMatch && parenMatch[1]) {\r\n jsonStr = parenMatch[1];\r\n }\r\n\r\n const signiphiMetadata = JSON.parse(jsonStr);\r\n logger.info('Parsed Signiphi metadata:', signiphiMetadata);\r\n\r\n // Create fieldId → PDF field name mapping\r\n if (signiphiMetadata.fields) {\r\n Object.entries(signiphiMetadata.fields).forEach(([pdfFieldName, fieldData]: [string, any]) => {\r\n if (fieldData.fieldId) {\r\n fieldIdToPdfNameMap[fieldData.fieldId] = pdfFieldName;\r\n }\r\n });\r\n }\r\n\r\n logger.info('FieldId to PDF name mapping:', fieldIdToPdfNameMap);\r\n }\r\n }\r\n } catch (metadataError) {\r\n logger.warn('Could not read PDF metadata for field mapping:', metadataError);\r\n }\r\n }\r\n\r\n // Special handling for signature_field_main and initials_field_main\r\n // These are synthetic fields - we need to find ALL actual signature/initials fields\r\n let targetElements: Element[] = [];\r\n\r\n if (fieldName === 'signature_field_main') {\r\n // Find ALL signature fields in the PDF\r\n const allInputs = doc.querySelectorAll('input[name], input[data-element-id]');\r\n\r\n // Get allowed PDF field names from the mapping\r\n const allowedPdfNames = allowedIds\r\n ? allowedIds.map(fieldId => fieldIdToPdfNameMap[fieldId]).filter(Boolean)\r\n : null;\r\n\r\n logger.info(`Allowed PDF field names for signature indicators:`, allowedPdfNames);\r\n\r\n allInputs.forEach(input => {\r\n const name = input.getAttribute('name') || input.getAttribute('data-element-id') || '';\r\n if (name.toLowerCase().includes('signature') && !name.toLowerCase().includes('initials')) {\r\n // If we have a filter, only include fields in the allowed list\r\n if (allowedPdfNames === null) {\r\n targetElements.push(input);\r\n } else {\r\n // Check if the DOM field name starts with any allowed metadata name\r\n // (DOM names have suffixes like \"_signature\" added during encoding)\r\n const isAllowed = allowedPdfNames.some(allowedName => allowedName && name.startsWith(allowedName));\r\n if (isAllowed) {\r\n targetElements.push(input);\r\n }\r\n }\r\n }\r\n });\r\n logger.info(`Found ${targetElements.length} signature fields for indicator (filtered by acknowledgements)`);\r\n } else if (fieldName === 'initials_field_main') {\r\n // Find ALL initials fields in the PDF\r\n const allInputs = doc.querySelectorAll('input[name], input[data-element-id]');\r\n\r\n // Get allowed PDF field names from the mapping\r\n const allowedPdfNames = allowedIds\r\n ? allowedIds.map(fieldId => fieldIdToPdfNameMap[fieldId]).filter(Boolean)\r\n : null;\r\n\r\n logger.info(`Allowed PDF field names for initials indicators:`, allowedPdfNames);\r\n\r\n allInputs.forEach(input => {\r\n const name = input.getAttribute('name') || input.getAttribute('data-element-id') || '';\r\n if (name.toLowerCase().includes('initials')) {\r\n // If we have a filter, only include fields in the allowed list\r\n if (allowedPdfNames === null) {\r\n targetElements.push(input);\r\n } else {\r\n // Check if the DOM field name starts with any allowed metadata name\r\n // (DOM names have suffixes like \"_initials\" added during encoding)\r\n const isAllowed = allowedPdfNames.some(allowedName => allowedName && name.startsWith(allowedName));\r\n if (isAllowed) {\r\n targetElements.push(input);\r\n }\r\n }\r\n }\r\n });\r\n logger.info(`Found ${targetElements.length} initials fields for indicator (filtered by acknowledgements)`);\r\n } else {\r\n // Regular field - try to find by exact name\r\n const formElement = doc.querySelector(\r\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"], ` +\r\n `select[name=\"${fieldName}\"], select[data-element-id=\"${fieldName}\"], ` +\r\n `textarea[name=\"${fieldName}\"], textarea[data-element-id=\"${fieldName}\"]`\r\n );\r\n if (formElement) {\r\n targetElements.push(formElement);\r\n }\r\n }\r\n\r\n if (targetElements.length === 0) {\r\n logger.warn(`Cannot add indicator: no fields found for \"${fieldName}\"`);\r\n return;\r\n }\r\n\r\n // Add indicator to each target element (showMode is 'all')\r\n let indicatorsAdded = 0;\r\n\r\n targetElements.forEach(formElement => {\r\n\r\n // Find the parent annotation section\r\n const annotationSection = formElement.closest('section');\r\n if (!annotationSection) {\r\n return;\r\n }\r\n\r\n // Remove existing indicator if any (to allow updating indicator type)\r\n const existingIndicator = annotationSection.querySelector('.signiphi-field-indicator');\r\n if (existingIndicator) {\r\n existingIndicator.remove();\r\n }\r\n\r\n // Create indicator based on type\r\n const indicator = doc.createElement('div');\r\n indicator.className = 'signiphi-field-indicator';\r\n \r\n // Add ARIA attributes for accessibility\r\n indicator.setAttribute('role', 'status');\r\n indicator.setAttribute('aria-live', 'polite');\r\n \r\n if (indicatorType === 'completed') {\r\n // Green checkmark (existing style)\r\n indicator.innerHTML = `\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#10b981\" stroke=\"white\" stroke-width=\"2\"/>\r\n <path d=\"M7 12l4 4 6-8\" stroke=\"white\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\r\n </svg>\r\n `;\r\n indicator.setAttribute('title', 'Acknowledgement complete');\r\n indicator.setAttribute('aria-label', 'Acknowledgement status: Complete');\r\n } else if (indicatorType === 'pending-ack') {\r\n // Amber badge with exclamation mark\r\n indicator.innerHTML = `\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#f59e0b\" stroke=\"white\" stroke-width=\"2\"/>\r\n <text x=\"12\" y=\"17\" font-size=\"16\" font-weight=\"bold\" fill=\"white\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\">!</text>\r\n </svg>\r\n `;\r\n indicator.setAttribute('title', 'Acknowledgement required');\r\n indicator.setAttribute('aria-label', 'Acknowledgement status: Pending acknowledgement');\r\n } else if (indicatorType === 'info') {\r\n // Subtle info icon for unfilled fields with acknowledgements\r\n indicator.innerHTML = `\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"10\" cy=\"10\" r=\"9\" fill=\"#94a3b8\" stroke=\"white\" stroke-width=\"1.5\"/>\r\n <text x=\"10\" y=\"14\" font-size=\"12\" font-weight=\"bold\" fill=\"white\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\">i</text>\r\n </svg>\r\n `;\r\n indicator.setAttribute('title', 'Has acknowledgement requirements');\r\n indicator.setAttribute('aria-label', 'Acknowledgement status: Has acknowledgement requirements');\r\n }\r\n\r\n // Style the indicator - positioned in top-right corner\r\n // Info indicators are slightly smaller to be more subtle\r\n const isInfoIndicator = indicatorType === 'info';\r\n Object.assign(indicator.style, {\r\n position: 'absolute',\r\n top: '-8px',\r\n right: '-8px',\r\n width: isInfoIndicator ? '20px' : '24px',\r\n height: isInfoIndicator ? '20px' : '24px',\r\n display: 'block',\r\n zIndex: '1000',\r\n pointerEvents: 'none',\r\n opacity: '0',\r\n transition: 'opacity 0.3s ease-in-out',\r\n margin: '0',\r\n padding: '0',\r\n lineHeight: '0',\r\n fontSize: '0',\r\n });\r\n\r\n // Ensure SVG doesn't cause layout shifts\r\n const svg = indicator.querySelector('svg');\r\n if (svg) {\r\n (svg as SVGElement).style.display = 'block';\r\n (svg as SVGElement).style.width = '24px';\r\n (svg as SVGElement).style.height = '24px';\r\n }\r\n\r\n // Add to annotation section (ensure no layout shift)\r\n const currentPosition = window.getComputedStyle(annotationSection).position;\r\n if (currentPosition === 'static') {\r\n annotationSection.style.position = 'relative';\r\n }\r\n annotationSection.appendChild(indicator);\r\n\r\n // Fade in animation\r\n requestAnimationFrame(() => {\r\n indicator.style.opacity = '1';\r\n });\r\n\r\n indicatorsAdded++;\r\n });\r\n\r\n logger.info(`Added ${indicatorsAdded} ${indicatorType} indicator(s) for field: ${fieldName}`);\r\n } catch (error) {\r\n logger.error('Error adding field indicator:', error);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Remove visual indicator from a PDF form field\r\n */\r\n const removeFieldIndicator = useCallback((fieldName: string) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) return;\r\n\r\n const doc = iframe.contentDocument;\r\n\r\n const formElement = doc.querySelector(\r\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"], ` +\r\n `select[name=\"${fieldName}\"], select[data-element-id=\"${fieldName}\"], ` +\r\n `textarea[name=\"${fieldName}\"], textarea[data-element-id=\"${fieldName}\"]`\r\n );\r\n\r\n if (!formElement) return;\r\n\r\n const annotationSection = formElement.closest('section');\r\n if (!annotationSection) return;\r\n\r\n const indicator = annotationSection.querySelector('.signiphi-field-indicator');\r\n if (indicator) {\r\n indicator.remove();\r\n logger.info(`Removed indicator from field: ${fieldName}`);\r\n }\r\n } catch (error) {\r\n logger.error('Error removing field indicator:', error);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Add a calendar icon indicator to a date field\r\n * Shows a small calendar icon in the top-right corner of the field\r\n * Clicking the icon will trigger the calendar popup\r\n * \r\n * @param fieldName - Name of the date field to add indicator to\r\n */\r\n const addDateFieldIndicator = useCallback((fieldName: string) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) {\r\n logger.warn('Cannot add date field indicator: iframe not ready');\r\n return;\r\n }\r\n\r\n const doc = iframe.contentDocument;\r\n\r\n // Find the date field\r\n const formElement = doc.querySelector(\r\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"], ` +\r\n `textarea[name=\"${fieldName}\"], textarea[data-element-id=\"${fieldName}\"]`\r\n );\r\n\r\n if (!formElement) {\r\n logger.warn(`Cannot add date indicator: field not found for \"${fieldName}\"`);\r\n return;\r\n }\r\n\r\n // Find the parent annotation section\r\n const annotationSection = formElement.closest('section');\r\n if (!annotationSection) {\r\n logger.warn(`Cannot add date indicator: no annotation section for \"${fieldName}\"`);\r\n return;\r\n }\r\n\r\n // Remove existing date indicator if any\r\n const existingIndicator = annotationSection.querySelector('.signiphi-date-field-indicator');\r\n if (existingIndicator) {\r\n existingIndicator.remove();\r\n }\r\n\r\n // Create calendar icon indicator\r\n const indicator = doc.createElement('div');\r\n indicator.className = 'signiphi-date-field-indicator';\r\n \r\n // Add ARIA attributes for accessibility\r\n indicator.setAttribute('role', 'button');\r\n indicator.setAttribute('aria-label', 'Open calendar picker');\r\n indicator.setAttribute('tabindex', '0');\r\n \r\n // Calendar icon SVG\r\n indicator.innerHTML = `\r\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 18 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <rect x=\"2\" y=\"3\" width=\"14\" height=\"13\" rx=\"2\" stroke=\"#6b7280\" stroke-width=\"1.5\" fill=\"white\"/>\r\n <line x1=\"2\" y1=\"6.5\" x2=\"16\" y2=\"6.5\" stroke=\"#6b7280\" stroke-width=\"1.5\"/>\r\n <line x1=\"5.5\" y1=\"1\" x2=\"5.5\" y2=\"5\" stroke=\"#6b7280\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n <line x1=\"12.5\" y1=\"1\" x2=\"12.5\" y2=\"5\" stroke=\"#6b7280\" stroke-width=\"1.5\" stroke-linecap=\"round\"/>\r\n <circle cx=\"5.5\" cy=\"9.5\" r=\"0.8\" fill=\"#6b7280\"/>\r\n <circle cx=\"9\" cy=\"9.5\" r=\"0.8\" fill=\"#6b7280\"/>\r\n <circle cx=\"12.5\" cy=\"9.5\" r=\"0.8\" fill=\"#6b7280\"/>\r\n <circle cx=\"5.5\" cy=\"12.5\" r=\"0.8\" fill=\"#6b7280\"/>\r\n <circle cx=\"9\" cy=\"12.5\" r=\"0.8\" fill=\"#6b7280\"/>\r\n <circle cx=\"12.5\" cy=\"12.5\" r=\"0.8\" fill=\"#6b7280\"/>\r\n </svg>\r\n `;\r\n\r\n // Style the indicator\r\n Object.assign(indicator.style, {\r\n position: 'absolute',\r\n top: '50%',\r\n right: '4px',\r\n transform: 'translateY(-50%)',\r\n width: '24px',\r\n height: '24px',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: '1000',\r\n cursor: 'pointer',\r\n opacity: '0.7',\r\n transition: 'opacity 0.2s ease-in-out',\r\n pointerEvents: 'auto',\r\n padding: '3px',\r\n borderRadius: '4px',\r\n });\r\n\r\n // Add hover effect\r\n indicator.addEventListener('mouseenter', () => {\r\n indicator.style.opacity = '1';\r\n indicator.style.backgroundColor = '#f3f4f6';\r\n });\r\n indicator.addEventListener('mouseleave', () => {\r\n indicator.style.opacity = '0.7';\r\n indicator.style.backgroundColor = 'transparent';\r\n });\r\n\r\n // Add keyboard support (Enter or Space to activate)\r\n indicator.addEventListener('keydown', (e: KeyboardEvent) => {\r\n if (e.key === 'Enter' || e.key === ' ') {\r\n e.preventDefault();\r\n indicator.click();\r\n }\r\n });\r\n\r\n // Ensure parent annotation has relative positioning\r\n const currentPosition = window.getComputedStyle(annotationSection).position;\r\n if (currentPosition === 'static') {\r\n annotationSection.style.position = 'relative';\r\n }\r\n \r\n annotationSection.appendChild(indicator);\r\n logger.info(`Added date field indicator for: ${fieldName}`);\r\n } catch (error) {\r\n logger.error('Error adding date field indicator:', error);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Remove date field indicator from a PDF form field\r\n */\r\n const removeDateFieldIndicator = useCallback((fieldName: string) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) return;\r\n\r\n const doc = iframe.contentDocument;\r\n\r\n const formElement = doc.querySelector(\r\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"], ` +\r\n `textarea[name=\"${fieldName}\"], textarea[data-element-id=\"${fieldName}\"]`\r\n );\r\n\r\n if (!formElement) return;\r\n\r\n const annotationSection = formElement.closest('section');\r\n if (!annotationSection) return;\r\n\r\n const indicator = annotationSection.querySelector('.signiphi-date-field-indicator');\r\n if (indicator) {\r\n indicator.remove();\r\n logger.info(`Removed date field indicator from: ${fieldName}`);\r\n }\r\n } catch (error) {\r\n logger.error('Error removing date field indicator:', error);\r\n }\r\n }, []);\r\n\r\n /**\r\n * Find target field elements in the PDF iframe for signature or initials fields.\r\n * Reuses the same discovery logic as addFieldIndicator.\r\n */\r\n const findFieldElements = useCallback((fieldName: string): Element[] => {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) return [];\r\n\r\n const doc = iframe.contentDocument;\r\n const targetElements: Element[] = [];\r\n\r\n if (fieldName === 'signature_field_main') {\r\n const allInputs = doc.querySelectorAll('input[name], input[data-element-id]');\r\n allInputs.forEach(input => {\r\n const name = input.getAttribute('name') || input.getAttribute('data-element-id') || '';\r\n if (name.toLowerCase().includes('signature') && !name.toLowerCase().includes('initials')) {\r\n targetElements.push(input);\r\n }\r\n });\r\n } else if (fieldName === 'initials_field_main') {\r\n const allInputs = doc.querySelectorAll('input[name], input[data-element-id]');\r\n allInputs.forEach(input => {\r\n const name = input.getAttribute('name') || input.getAttribute('data-element-id') || '';\r\n if (name.toLowerCase().includes('initials')) {\r\n targetElements.push(input);\r\n }\r\n });\r\n } else {\r\n const formElement = doc.querySelector(\r\n `input[name=\"${fieldName}\"], input[data-element-id=\"${fieldName}\"]`\r\n );\r\n if (formElement) {\r\n targetElements.push(formElement);\r\n }\r\n }\r\n\r\n return targetElements;\r\n }, []);\r\n\r\n /**\r\n * Preview a signature image on the PDF viewer at the field position.\r\n * Creates an overlay inside the annotation section — purely visual, no PDF modification.\r\n */\r\n const previewSignature = useCallback((fieldName: string, dataUrl: string | null) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) {\r\n logger.warn('Cannot preview signature: iframe not ready');\r\n return;\r\n }\r\n\r\n const doc = iframe.contentDocument;\r\n const targetElements = findFieldElements(fieldName);\r\n\r\n targetElements.forEach(formElement => {\r\n const annotationSection = formElement.closest('section');\r\n if (!annotationSection) return;\r\n\r\n // Remove existing preview\r\n const existing = annotationSection.querySelector('.signiphi-signature-preview');\r\n if (existing) existing.remove();\r\n\r\n if (!dataUrl) return;\r\n\r\n // Create preview overlay\r\n const preview = doc.createElement('div');\r\n preview.className = 'signiphi-signature-preview';\r\n preview.setAttribute('aria-hidden', 'true');\r\n\r\n const img = doc.createElement('img');\r\n img.src = dataUrl;\r\n img.alt = '';\r\n Object.assign(img.style, {\r\n width: '100%',\r\n height: '100%',\r\n objectFit: 'contain',\r\n pointerEvents: 'none',\r\n });\r\n preview.appendChild(img);\r\n\r\n Object.assign(preview.style, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: '999',\r\n pointerEvents: 'none',\r\n padding: '2px',\r\n boxSizing: 'border-box',\r\n backgroundColor: 'rgba(255, 255, 255, 0.85)',\r\n opacity: '0',\r\n transition: 'opacity 0.3s ease-in-out',\r\n });\r\n\r\n const currentPosition = (annotationSection as HTMLElement).style.position || getComputedStyle(annotationSection).position;\r\n if (currentPosition === 'static' || !currentPosition) {\r\n (annotationSection as HTMLElement).style.position = 'relative';\r\n }\r\n\r\n annotationSection.appendChild(preview);\r\n\r\n requestAnimationFrame(() => {\r\n preview.style.opacity = '1';\r\n });\r\n });\r\n\r\n logger.info(`Previewed signature on ${targetElements.length} field(s) for: ${fieldName}`);\r\n } catch (error) {\r\n logger.error('Error previewing signature:', error);\r\n }\r\n }, [findFieldElements]);\r\n\r\n /**\r\n * Preview initials text on the PDF viewer at the field position.\r\n * Creates an overlay inside the annotation section — purely visual, no PDF modification.\r\n */\r\n const previewInitials = useCallback((fieldName: string, text: string | null) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) {\r\n logger.warn('Cannot preview initials: iframe not ready');\r\n return;\r\n }\r\n\r\n const doc = iframe.contentDocument;\r\n const targetElements = findFieldElements(fieldName);\r\n\r\n targetElements.forEach(formElement => {\r\n const annotationSection = formElement.closest('section');\r\n if (!annotationSection) return;\r\n\r\n // Remove existing preview\r\n const existing = annotationSection.querySelector('.signiphi-initials-preview');\r\n if (existing) existing.remove();\r\n\r\n if (!text) return;\r\n\r\n const preview = doc.createElement('div');\r\n preview.className = 'signiphi-initials-preview';\r\n preview.setAttribute('aria-hidden', 'true');\r\n preview.textContent = text;\r\n\r\n Object.assign(preview.style, {\r\n position: 'absolute',\r\n top: '0',\r\n left: '0',\r\n width: '100%',\r\n height: '100%',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n zIndex: '999',\r\n pointerEvents: 'none',\r\n fontFamily: \"'Dancing Script', 'Brush Script MT', cursive\",\r\n fontStyle: 'italic',\r\n fontSize: '70%',\r\n color: '#000000',\r\n backgroundColor: 'rgba(255, 255, 255, 0.85)',\r\n overflow: 'hidden',\r\n opacity: '0',\r\n transition: 'opacity 0.3s ease-in-out',\r\n });\r\n\r\n const currentPosition = (annotationSection as HTMLElement).style.position || getComputedStyle(annotationSection).position;\r\n if (currentPosition === 'static' || !currentPosition) {\r\n (annotationSection as HTMLElement).style.position = 'relative';\r\n }\r\n\r\n annotationSection.appendChild(preview);\r\n\r\n requestAnimationFrame(() => {\r\n preview.style.opacity = '1';\r\n });\r\n });\r\n\r\n logger.info(`Previewed initials on ${targetElements.length} field(s) for: ${fieldName}`);\r\n } catch (error) {\r\n logger.error('Error previewing initials:', error);\r\n }\r\n }, [findFieldElements]);\r\n\r\n /**\r\n * Clear signature/initials previews from the PDF viewer.\r\n * If fieldName is provided, clears only that field's previews; otherwise clears all.\r\n */\r\n const clearFieldPreviews = useCallback((fieldName?: string) => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe?.contentDocument) return;\r\n\r\n const doc = iframe.contentDocument;\r\n const selectors = '.signiphi-signature-preview, .signiphi-initials-preview';\r\n\r\n if (fieldName) {\r\n const targetElements = findFieldElements(fieldName);\r\n targetElements.forEach(el => {\r\n const section = el.closest('section');\r\n if (section) {\r\n section.querySelectorAll(selectors).forEach(p => p.remove());\r\n }\r\n });\r\n } else {\r\n doc.querySelectorAll(selectors).forEach(el => el.remove());\r\n }\r\n } catch (error) {\r\n logger.error('Error clearing field previews:', error);\r\n }\r\n }, [findFieldElements]);\r\n\r\n // Check PDF.js version on mount\r\n useEffect(() => {\r\n if (!versionChecked) {\r\n const config = getPdfJsConfig();\r\n const basePath = pdfjsBasePath ?? config.viewerBasePath;\r\n \r\n checkPdfJsVersion(basePath).then((result) => {\r\n setVersionChecked(true);\r\n \r\n if (!result.viewerExists) {\r\n const errorMsg = `⚠️ PDF.js files not found\\n\\nThe PDF viewer requires PDF.js files to be installed.\\nThis should happen automatically, but you can run:\\n\\n npx signiphi-setup\\n\\nOr reinstall the package:\\n\\n npm install @signiphi/pdf-signer`;\r\n setSetupError(errorMsg);\r\n logger.error(errorMsg);\r\n } else if (!result.versionMatch) {\r\n logger.warn(\r\n `⚠️ PDF.js version mismatch:\\n` +\r\n ` Viewer: ${result.viewerVersion}\\n` +\r\n ` Worker: ${result.workerVersion}\\n` +\r\n `Run: npx signiphi-setup to sync versions`\r\n );\r\n }\r\n }).catch((error) => {\r\n logger.error('Failed to check PDF.js version:', error);\r\n setVersionChecked(true);\r\n });\r\n }\r\n }, [pdfjsBasePath, versionChecked]);\r\n\r\n const handleIframeLoad = useCallback(() => {\r\n const iframe = iframeRef.current;\r\n if (!iframe || !iframe.contentWindow) {\r\n return;\r\n }\r\n\r\n try {\r\n // Check if iframe failed to load (404 error for viewer.html)\r\n if (iframe.contentDocument) {\r\n const title = iframe.contentDocument.title;\r\n const body = iframe.contentDocument.body;\r\n \r\n // Detect common error patterns (404, file not found)\r\n if (\r\n title?.includes('404') || \r\n title?.includes('Not Found') ||\r\n body?.textContent?.includes('404') ||\r\n body?.textContent?.includes('Cannot GET')\r\n ) {\r\n const errorMsg = setupError || `⚠️ PDF.js viewer not found\\n\\nThe viewer.html file could not be loaded from the configured path.\\nRun: npx signiphi-setup\\n\\nOr check your configuration.`;\r\n logger.error(errorMsg);\r\n isLoadingRef.current = false;\r\n onError?.(errorMsg);\r\n return;\r\n }\r\n }\r\n\r\n setTimeout(async () => {\r\n try {\r\n if (initializationPromise.current) {\r\n await initializationPromise.current;\r\n isLoadingRef.current = false;\r\n onLoad?.();\r\n }\r\n // If no initializationPromise, loadPdf hasn't been called yet\r\n // so we don't signal onLoad - the loadPdf flow handles initialization\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : 'Failed to load PDF viewer';\r\n logger.error('Error in handleIframeLoad:', errorMessage);\r\n isLoadingRef.current = false;\r\n onError?.(errorMessage);\r\n }\r\n }, 100);\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : 'Unknown error in iframe load handler';\r\n logger.error('Error in iframe load handler:', error);\r\n isLoadingRef.current = false;\r\n onError?.(errorMessage);\r\n }\r\n }, [getPDFViewerApplication, onLoad, onError, setupError]);\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n loadPdf,\r\n getFormFieldValues,\r\n setFormFieldValues,\r\n getAllFieldNames,\r\n saveDocument,\r\n getPDFViewerApplication,\r\n injectPlaceholders,\r\n injectRadioLabels,\r\n setFieldMetadata,\r\n zoomIn,\r\n zoomOut,\r\n nextPage,\r\n previousPage,\r\n getCurrentPage,\r\n getTotalPages,\r\n attachFieldClickInterceptors,\r\n attachFieldChangeListeners,\r\n addFieldIndicator,\r\n removeFieldIndicator,\r\n addDateFieldIndicator,\r\n removeDateFieldIndicator,\r\n previewSignature,\r\n previewInitials,\r\n clearFieldPreviews,\r\n }),\r\n [loadPdf, getFormFieldValues, setFormFieldValues, getAllFieldNames, saveDocument, getPDFViewerApplication, injectPlaceholders, injectRadioLabels, setFieldMetadata, zoomIn, zoomOut, nextPage, previousPage, getCurrentPage, getTotalPages, attachFieldClickInterceptors, attachFieldChangeListeners, addFieldIndicator, removeFieldIndicator, addDateFieldIndicator, removeDateFieldIndicator, previewSignature, previewInitials, clearFieldPreviews]\r\n );\r\n\r\n return <>{children({ iframeRef, handleIframeLoad })}</>;\r\n }\r\n);\r\n\r\nPdfViewerCore.displayName = 'PdfViewerCore';\r\n\r\n","import {\r\n useRef,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n forwardRef,\r\n useImperativeHandle,\r\n} from 'react';\r\nimport type { SignatureCanvasRef } from '../types';\r\n\r\n/**\r\n * Props for the headless signature capture core component\r\n */\r\nexport interface SignatureCaptureCoreProps {\r\n width?: number;\r\n height?: number;\r\n onSignature?: (dataUrl: string) => void;\r\n children: (props: {\r\n canvasRef: React.RefObject<HTMLCanvasElement>;\r\n containerRef: React.RefObject<HTMLDivElement>;\r\n isEmpty: boolean;\r\n canvasSize: { width: number; height: number };\r\n handlers: {\r\n onMouseDown: (e: React.MouseEvent) => void;\r\n onMouseMove: (e: React.MouseEvent) => void;\r\n onMouseUp: () => void;\r\n onMouseLeave: () => void;\r\n onTouchStart: (e: React.TouchEvent) => void;\r\n onTouchMove: (e: React.TouchEvent) => void;\r\n onTouchEnd: () => void;\r\n };\r\n actions: {\r\n clear: () => void;\r\n save: () => void;\r\n };\r\n }) => React.ReactNode;\r\n}\r\n\r\n/**\r\n * Headless signature capture core component\r\n * Provides canvas drawing logic without any UI\r\n */\r\nexport const SignatureCaptureCore = forwardRef<SignatureCanvasRef, SignatureCaptureCoreProps>(\r\n ({ width = 400, height = 200, onSignature, children }, ref) => {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const [isDrawing, setIsDrawing] = useState(false);\r\n const [isEmpty, setIsEmpty] = useState(true);\r\n const [lastPoint, setLastPoint] = useState<{ x: number; y: number } | null>(null);\r\n const [canvasSize, setCanvasSize] = useState({ width, height });\r\n\r\n // Handle responsive canvas sizing\r\n useEffect(() => {\r\n const updateCanvasSize = () => {\r\n if (containerRef.current) {\r\n const containerWidth = containerRef.current.offsetWidth;\r\n const maxWidth = Math.max(containerWidth - 16, width);\r\n const aspectRatio = width / height;\r\n const newHeight = maxWidth / aspectRatio;\r\n\r\n setCanvasSize({\r\n width: maxWidth,\r\n height: newHeight,\r\n });\r\n }\r\n };\r\n\r\n setTimeout(updateCanvasSize, 100);\r\n window.addEventListener('resize', updateCanvasSize);\r\n return () => window.removeEventListener('resize', updateCanvasSize);\r\n }, [width, height]);\r\n\r\n const getCanvasContext = useCallback(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return null;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return null;\r\n\r\n return { canvas, ctx };\r\n }, []);\r\n\r\n const setupCanvas = useCallback(() => {\r\n const result = getCanvasContext();\r\n if (!result) return;\r\n\r\n const { canvas, ctx } = result;\r\n\r\n // Set canvas size\r\n canvas.width = canvasSize.width;\r\n canvas.height = canvasSize.height;\r\n\r\n // Configure drawing context\r\n ctx.strokeStyle = '#000000';\r\n ctx.lineWidth = window.innerWidth < 768 ? 3 : 2;\r\n ctx.lineCap = 'round';\r\n ctx.lineJoin = 'round';\r\n ctx.imageSmoothingEnabled = true;\r\n\r\n // Clear canvas with transparent background\r\n ctx.clearRect(0, 0, canvasSize.width, canvasSize.height);\r\n }, [canvasSize, getCanvasContext]);\r\n\r\n const clear = useCallback(() => {\r\n const result = getCanvasContext();\r\n if (!result) return;\r\n\r\n const { ctx } = result;\r\n ctx.clearRect(0, 0, canvasSize.width, canvasSize.height);\r\n queueMicrotask(() => setIsEmpty(true));\r\n }, [canvasSize, getCanvasContext]);\r\n\r\n const getSignatureDataUrl = useCallback(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas || isEmpty) return null;\r\n\r\n return canvas.toDataURL('image/png');\r\n }, [isEmpty]);\r\n\r\n const getRelativePosition = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return null;\r\n\r\n const rect = canvas.getBoundingClientRect();\r\n const scaleX = canvas.width / rect.width;\r\n const scaleY = canvas.height / rect.height;\r\n\r\n let clientX: number, clientY: number;\r\n\r\n if ('touches' in e) {\r\n const touch = e.touches[0] || e.changedTouches[0];\r\n if (!touch) return null;\r\n clientX = touch.clientX;\r\n clientY = touch.clientY;\r\n } else {\r\n clientX = e.clientX;\r\n clientY = e.clientY;\r\n }\r\n\r\n return {\r\n x: (clientX - rect.left) * scaleX,\r\n y: (clientY - rect.top) * scaleY,\r\n };\r\n },\r\n []\r\n );\r\n\r\n const drawLine = useCallback(\r\n (from: { x: number; y: number }, to: { x: number; y: number }) => {\r\n const result = getCanvasContext();\r\n if (!result) return;\r\n\r\n const { ctx } = result;\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(from.x, from.y);\r\n ctx.lineTo(to.x, to.y);\r\n ctx.stroke();\r\n\r\n queueMicrotask(() => setIsEmpty(false));\r\n },\r\n [getCanvasContext]\r\n );\r\n\r\n const startDrawing = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n e.preventDefault();\r\n const point = getRelativePosition(e);\r\n if (!point) return;\r\n\r\n setIsDrawing(true);\r\n setLastPoint(point);\r\n },\r\n [getRelativePosition]\r\n );\r\n\r\n const draw = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n if (!isDrawing || !lastPoint) return;\r\n\r\n e.preventDefault();\r\n const point = getRelativePosition(e);\r\n if (!point) return;\r\n\r\n drawLine(lastPoint, point);\r\n setLastPoint(point);\r\n },\r\n [isDrawing, lastPoint, getRelativePosition, drawLine]\r\n );\r\n\r\n const stopDrawing = useCallback(() => {\r\n setIsDrawing(false);\r\n setLastPoint(null);\r\n }, []);\r\n\r\n const handleSave = useCallback(() => {\r\n if (isEmpty) return;\r\n\r\n const dataUrl = getSignatureDataUrl();\r\n if (dataUrl && onSignature) {\r\n onSignature(dataUrl);\r\n }\r\n }, [isEmpty, getSignatureDataUrl, onSignature]);\r\n\r\n // Initialize canvas\r\n useEffect(() => {\r\n setupCanvas();\r\n }, [setupCanvas]);\r\n\r\n // Mouse event handlers\r\n const handleMouseDown = useCallback(\r\n (e: React.MouseEvent) => {\r\n startDrawing(e);\r\n },\r\n [startDrawing]\r\n );\r\n\r\n const handleMouseMove = useCallback(\r\n (e: React.MouseEvent) => {\r\n draw(e);\r\n },\r\n [draw]\r\n );\r\n\r\n const handleMouseUp = useCallback(() => {\r\n stopDrawing();\r\n }, [stopDrawing]);\r\n\r\n const handleMouseLeave = useCallback(() => {\r\n stopDrawing();\r\n }, [stopDrawing]);\r\n\r\n // Touch event handlers\r\n const handleTouchStart = useCallback(\r\n (e: React.TouchEvent) => {\r\n startDrawing(e);\r\n },\r\n [startDrawing]\r\n );\r\n\r\n const handleTouchMove = useCallback(\r\n (e: React.TouchEvent) => {\r\n draw(e);\r\n },\r\n [draw]\r\n );\r\n\r\n const handleTouchEnd = useCallback(() => {\r\n stopDrawing();\r\n }, [stopDrawing]);\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n clear,\r\n getSignatureDataUrl,\r\n isEmpty: () => isEmpty,\r\n }),\r\n [clear, getSignatureDataUrl, isEmpty]\r\n );\r\n\r\n return (\r\n <>\r\n {children({\r\n canvasRef,\r\n containerRef,\r\n isEmpty,\r\n canvasSize,\r\n handlers: {\r\n onMouseDown: handleMouseDown,\r\n onMouseMove: handleMouseMove,\r\n onMouseUp: handleMouseUp,\r\n onMouseLeave: handleMouseLeave,\r\n onTouchStart: handleTouchStart,\r\n onTouchMove: handleTouchMove,\r\n onTouchEnd: handleTouchEnd,\r\n },\r\n actions: {\r\n clear,\r\n save: handleSave,\r\n },\r\n })}\r\n </>\r\n );\r\n }\r\n);\r\n\r\nSignatureCaptureCore.displayName = 'SignatureCaptureCore';\r\n\r\n"]}