[{"data":1,"prerenderedAt":60},["Reactive",2],{"blog-post-markdown-collaborative-editing-real-time-synchronization-complete-guide":3},{"slug":4,"title":5,"description":6,"excerpt":7,"date":8,"category":9,"author":10,"keywords":11,"readingMinutes":12,"html":13,"headings":14,"tools":34,"related":35},"markdown-collaborative-editing-real-time-synchronization-complete-guide","Markdown Collaborative Editing and Real-Time Synchronization: Complete Guide for Team-Based Documentation Workflows","Master collaborative Markdown editing with real-time synchronization, conflict resolution, and team workflow management. Learn to build scalable multi-user documentation systems with live editing capabilities.","Collaborative Markdown editing with real-time synchronization transforms traditional documentation workflows into dynamic, multi-user environments where teams can simultaneously create, edit, and…","2025-10-16","Tutorial","Matthew Rathbone","markdown collaborative editing, real-time markdown synchronization, collaborative documentation, markdown team workflows, live markdown editing, conflict resolution markdown, multi-user markdown editor, collaborative content creation",30,"\u003Cp>Collaborative Markdown editing with real-time synchronization transforms traditional documentation workflows into dynamic, multi-user environments where teams can simultaneously create, edit, and review content with immediate visibility of changes. By implementing sophisticated operational transformation algorithms, conflict resolution mechanisms, and synchronized state management, teams can achieve seamless collaborative editing experiences that maintain document integrity while enabling productive parallel workflows across distributed development environments.\u003C/p>\n\u003Ch2 id=\"why-master-collaborative-markdown-editing\">Why Master Collaborative Markdown Editing?\u003C/h2>\n\u003Cp>Real-time collaborative editing provides essential capabilities for modern documentation teams:\u003C/p>\n\u003Cul>\n\u003Cli>\u003Cstrong>Simultaneous Editing\u003C/strong>: Enable multiple team members to work on the same document without conflicts\u003C/li>\n\u003Cli>\u003Cstrong>Real-Time Visibility\u003C/strong>: See changes from other users instantly as they type and edit content\u003C/li>\n\u003Cli>\u003Cstrong>Conflict Resolution\u003C/strong>: Automatically resolve editing conflicts while preserving all contributions\u003C/li>\n\u003Cli>\u003Cstrong>Version Control Integration\u003C/strong>: Maintain comprehensive change history and branch management\u003C/li>\n\u003Cli>\u003Cstrong>Distributed Teams\u003C/strong>: Support remote collaboration with synchronized editing experiences\u003C/li>\n\u003C/ul>\n\u003Ch2 id=\"foundation-collaborative-architecture\">Foundation Collaborative Architecture\u003C/h2>\n\u003Ch3 id=\"core-synchronization-engine\">Core Synchronization Engine\u003C/h3>\n\u003Cp>Building a robust real-time synchronization system for collaborative Markdown editing:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// collaborative-markdown-engine.js - Real-time collaborative editing system\u003C/span>\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-title class_\">EventEmitter\u003C/span> = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;events&#x27;\u003C/span>);\n\u003Cspan class=\"hljs-keyword\">const\u003C/span> { \u003Cspan class=\"hljs-title class_\">WebSocketServer\u003C/span> } = \u003Cspan class=\"hljs-built_in\">require\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;ws&#x27;\u003C/span>);\n\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">CollaborativeMarkdownEngine\u003C/span> \u003Cspan class=\"hljs-keyword\">extends\u003C/span> \u003Cspan class=\"hljs-title class_ inherited__\">EventEmitter\u003C/span> {\n    \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">options = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">super\u003C/span>();\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">port\u003C/span>: options.\u003Cspan class=\"hljs-property\">port\u003C/span> || \u003Cspan class=\"hljs-number\">3001\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enablePersistence\u003C/span>: options.\u003Cspan class=\"hljs-property\">enablePersistence\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">conflictResolution\u003C/span>: options.\u003Cspan class=\"hljs-property\">conflictResolution\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;operational-transform&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">heartbeatInterval\u003C/span>: options.\u003Cspan class=\"hljs-property\">heartbeatInterval\u003C/span> || \u003Cspan class=\"hljs-number\">30000\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">maxConcurrentUsers\u003C/span>: options.\u003Cspan class=\"hljs-property\">maxConcurrentUsers\u003C/span> || \u003Cspan class=\"hljs-number\">50\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">documentTimeout\u003C/span>: options.\u003Cspan class=\"hljs-property\">documentTimeout\u003C/span> || \u003Cspan class=\"hljs-number\">3600000\u003C/span>, \u003Cspan class=\"hljs-comment\">// 1 hour\u003C/span>\n            \u003Cspan class=\"hljs-attr\">enableVersioning\u003C/span>: options.\u003Cspan class=\"hljs-property\">enableVersioning\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enableLocking\u003C/span>: options.\u003Cspan class=\"hljs-property\">enableLocking\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            ...options\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>(); \u003Cspan class=\"hljs-comment\">// documentId -&gt; DocumentState\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">users\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>(); \u003Cspan class=\"hljs-comment\">// userId -&gt; UserSession\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>(); \u003Cspan class=\"hljs-comment\">// connectionId -&gt; WebSocket\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">operationQueue\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>(); \u003Cspan class=\"hljs-comment\">// documentId -&gt; Operation[]\u003C/span>\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">wss\u003C/span> = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">heartbeatTimer\u003C/span> = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">setupWebSocketServer\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">setupOperationalTransform\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">startHeartbeat\u003C/span>();\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Collaborative Markdown Engine initialized on port \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.options.port}\u003C/span>`\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">setupWebSocketServer\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">wss\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">WebSocketServer\u003C/span>({ \n            \u003Cspan class=\"hljs-attr\">port\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">port\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">perMessageDeflate\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">maxPayload\u003C/span>: \u003Cspan class=\"hljs-number\">1024\u003C/span> * \u003Cspan class=\"hljs-number\">1024\u003C/span> \u003Cspan class=\"hljs-comment\">// 1MB\u003C/span>\n        });\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">wss\u003C/span>.\u003Cspan class=\"hljs-title function_\">on\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;connection&#x27;\u003C/span>, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">ws, request\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleConnection\u003C/span>(ws, request);\n        });\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">wss\u003C/span>.\u003Cspan class=\"hljs-title function_\">on\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">error\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;WebSocket server error:&#x27;\u003C/span>, error);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, error);\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleConnection\u003C/span>(\u003Cspan class=\"hljs-params\">ws, request\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> connectionId = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateId\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> userAgent = request.\u003Cspan class=\"hljs-property\">headers\u003C/span>[\u003Cspan class=\"hljs-string\">&#x27;user-agent&#x27;\u003C/span>] || \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> ip = request.\u003Cspan class=\"hljs-property\">socket\u003C/span>.\u003Cspan class=\"hljs-property\">remoteAddress\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`New connection: \u003Cspan class=\"hljs-subst\">${connectionId}\u003C/span> from \u003Cspan class=\"hljs-subst\">${ip}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(connectionId, {\n            ws,\n            connectionId,\n            \u003Cspan class=\"hljs-attr\">userId\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">documentId\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n            userAgent,\n            ip,\n            \u003Cspan class=\"hljs-attr\">connectedAt\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">lastActivity\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n        });\n        \n        ws.\u003Cspan class=\"hljs-title function_\">on\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">data\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleMessage\u003C/span>(connectionId, data);\n        });\n        \n        ws.\u003Cspan class=\"hljs-title function_\">on\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;close&#x27;\u003C/span>, \u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleDisconnection\u003C/span>(connectionId);\n        });\n        \n        ws.\u003Cspan class=\"hljs-title function_\">on\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">error\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">`Connection error for \u003Cspan class=\"hljs-subst\">${connectionId}\u003C/span>:`\u003C/span>, error);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleDisconnection\u003C/span>(connectionId);\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Send connection acknowledgment\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendToConnection\u003C/span>(connectionId, {\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;connection-ack&#x27;\u003C/span>,\n            connectionId,\n            \u003Cspan class=\"hljs-attr\">serverTime\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">handleMessage\u003C/span>(\u003Cspan class=\"hljs-params\">connectionId, data\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> connection = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(connectionId);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!connection) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n            \n            connection.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span> = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> message = \u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">parse\u003C/span>(data.\u003Cspan class=\"hljs-title function_\">toString\u003C/span>());\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> { type, payload } = message;\n            \n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Message from \u003Cspan class=\"hljs-subst\">${connectionId}\u003C/span>: \u003Cspan class=\"hljs-subst\">${type}\u003C/span>`\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">switch\u003C/span> (type) {\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;join-document&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleJoinDocument\u003C/span>(connectionId, payload);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;leave-document&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleLeaveDocument\u003C/span>(connectionId, payload);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;operation&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleOperation\u003C/span>(connectionId, payload);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;cursor-update&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleCursorUpdate\u003C/span>(connectionId, payload);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;selection-update&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleSelectionUpdate\u003C/span>(connectionId, payload);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;lock-request&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleLockRequest\u003C/span>(connectionId, payload);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;unlock-request&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleUnlockRequest\u003C/span>(connectionId, payload);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;heartbeat&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleHeartbeat\u003C/span>(connectionId, payload);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                \u003Cspan class=\"hljs-attr\">default\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">warn\u003C/span>(\u003Cspan class=\"hljs-string\">`Unknown message type: \u003Cspan class=\"hljs-subst\">${type}\u003C/span>`\u003C/span>);\n            }\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">`Error handling message from \u003Cspan class=\"hljs-subst\">${connectionId}\u003C/span>:`\u003C/span>, error);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendToConnection\u003C/span>(connectionId, {\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">error\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;Message processing failed&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">originalMessage\u003C/span>: data.\u003Cspan class=\"hljs-title function_\">toString\u003C/span>()\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">handleJoinDocument\u003C/span>(\u003Cspan class=\"hljs-params\">connectionId, payload\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { documentId, userId, userInfo } = payload;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> connection = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(connectionId);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!connection || !documentId || !userId) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendError\u003C/span>(connectionId, \u003Cspan class=\"hljs-string\">&#x27;Invalid join request&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Initialize document if it doesn&#x27;t exist\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(documentId)) {\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">initializeDocument\u003C/span>(documentId);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-variable language_\">document\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(documentId);\n        \n        \u003Cspan class=\"hljs-comment\">// Check user limits\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">activeUsers\u003C/span>.\u003Cspan class=\"hljs-property\">size\u003C/span> &gt;= \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">maxConcurrentUsers\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendError\u003C/span>(connectionId, \u003Cspan class=\"hljs-string\">&#x27;Document user limit reached&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Update connection info\u003C/span>\n        connection.\u003Cspan class=\"hljs-property\">userId\u003C/span> = userId;\n        connection.\u003Cspan class=\"hljs-property\">documentId\u003C/span> = documentId;\n        \n        \u003Cspan class=\"hljs-comment\">// Add user to document\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> userSession = {\n            userId,\n            connectionId,\n            \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">name\u003C/span>: userInfo?.\u003Cspan class=\"hljs-property\">name\u003C/span> || \u003Cspan class=\"hljs-string\">`User \u003Cspan class=\"hljs-subst\">${userId}\u003C/span>`\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">color\u003C/span>: userInfo?.\u003Cspan class=\"hljs-property\">color\u003C/span> || \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateUserColor\u003C/span>(),\n                \u003Cspan class=\"hljs-attr\">avatar\u003C/span>: userInfo?.\u003Cspan class=\"hljs-property\">avatar\u003C/span> || \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n                ...userInfo\n            },\n            \u003Cspan class=\"hljs-attr\">cursor\u003C/span>: { \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span> },\n            \u003Cspan class=\"hljs-attr\">selection\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">joinedAt\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">lastActivity\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">activeUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(userId, userSession);\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">users\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(userId, userSession);\n        \n        \u003Cspan class=\"hljs-comment\">// Send document state to new user\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendToConnection\u003C/span>(connectionId, {\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;document-state&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">document\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">id\u003C/span>: documentId,\n                \u003Cspan class=\"hljs-attr\">content\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">version\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">version\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">metadata\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">metadata\u003C/span>\n            },\n            \u003Cspan class=\"hljs-attr\">activeUsers\u003C/span>: \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">activeUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>()).\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">user\u003C/span> =&gt;\u003C/span> ({\n                \u003Cspan class=\"hljs-attr\">userId\u003C/span>: user.\u003Cspan class=\"hljs-property\">userId\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: user.\u003Cspan class=\"hljs-property\">userInfo\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">cursor\u003C/span>: user.\u003Cspan class=\"hljs-property\">cursor\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">selection\u003C/span>: user.\u003Cspan class=\"hljs-property\">selection\u003C/span>\n            })),\n            \u003Cspan class=\"hljs-attr\">locks\u003C/span>: \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">locks\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>())\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Notify other users about new user\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(documentId, {\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;user-joined&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">user\u003C/span>: {\n                userId,\n                \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: userSession.\u003Cspan class=\"hljs-property\">userInfo\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">cursor\u003C/span>: userSession.\u003Cspan class=\"hljs-property\">cursor\u003C/span>\n            }\n        }, connectionId);\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`User \u003Cspan class=\"hljs-subst\">${userId}\u003C/span> joined document \u003Cspan class=\"hljs-subst\">${documentId}\u003C/span>`\u003C/span>);\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;user-joined&#x27;\u003C/span>, { documentId, userId, \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: userSession.\u003Cspan class=\"hljs-property\">userInfo\u003C/span> });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">handleLeaveDocument\u003C/span>(\u003Cspan class=\"hljs-params\">connectionId, payload\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> connection = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(connectionId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!connection || !connection.\u003Cspan class=\"hljs-property\">documentId\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { documentId, userId } = connection;\n        \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">removeUserFromDocument\u003C/span>(documentId, userId, connectionId);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">handleOperation\u003C/span>(\u003Cspan class=\"hljs-params\">connectionId, payload\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { documentId, operation, version } = payload;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> connection = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(connectionId);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!connection || connection.\u003Cspan class=\"hljs-property\">documentId\u003C/span> !== documentId) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendError\u003C/span>(connectionId, \u003Cspan class=\"hljs-string\">&#x27;Invalid operation context&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-variable language_\">document\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(documentId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">document\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendError\u003C/span>(connectionId, \u003Cspan class=\"hljs-string\">&#x27;Document not found&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Apply operational transformation\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> transformedOperation = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">transformOperation\u003C/span>(\n                \u003Cspan class=\"hljs-variable language_\">document\u003C/span>, \n                operation, \n                version\n            );\n            \n            \u003Cspan class=\"hljs-comment\">// Apply operation to document\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> result = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">applyOperation\u003C/span>(\u003Cspan class=\"hljs-variable language_\">document\u003C/span>, transformedOperation);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (result.\u003Cspan class=\"hljs-property\">success\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// Broadcast transformed operation to all users\u003C/span>\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(documentId, {\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;operation&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">operation\u003C/span>: transformedOperation,\n                    \u003Cspan class=\"hljs-attr\">version\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">version\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">author\u003C/span>: connection.\u003Cspan class=\"hljs-property\">userId\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n                }, connectionId);\n                \n                \u003Cspan class=\"hljs-comment\">// Send acknowledgment to sender\u003C/span>\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendToConnection\u003C/span>(connectionId, {\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;operation-ack&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">operationId\u003C/span>: operation.\u003Cspan class=\"hljs-property\">id\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">version\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">version\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">success\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n                });\n                \n                \u003Cspan class=\"hljs-comment\">// Persist if enabled\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enablePersistence\u003C/span>) {\n                    \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">persistDocument\u003C/span>(\u003Cspan class=\"hljs-variable language_\">document\u003C/span>);\n                }\n                \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;document-changed&#x27;\u003C/span>, {\n                    documentId,\n                    \u003Cspan class=\"hljs-attr\">operation\u003C/span>: transformedOperation,\n                    \u003Cspan class=\"hljs-attr\">author\u003C/span>: connection.\u003Cspan class=\"hljs-property\">userId\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">version\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">version\u003C/span>\n                });\n                \n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendError\u003C/span>(connectionId, \u003Cspan class=\"hljs-string\">`Operation failed: \u003Cspan class=\"hljs-subst\">${result.error}\u003C/span>`\u003C/span>);\n            }\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">`Operation processing failed:`\u003C/span>, error);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendError\u003C/span>(connectionId, \u003Cspan class=\"hljs-string\">`Operation processing failed: \u003Cspan class=\"hljs-subst\">${error.message}\u003C/span>`\u003C/span>);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">handleCursorUpdate\u003C/span>(\u003Cspan class=\"hljs-params\">connectionId, payload\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { documentId, cursor } = payload;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> connection = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(connectionId);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!connection || connection.\u003Cspan class=\"hljs-property\">documentId\u003C/span> !== documentId) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-variable language_\">document\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(documentId);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> user = \u003Cspan class=\"hljs-variable language_\">document\u003C/span>?.\u003Cspan class=\"hljs-property\">activeUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(connection.\u003Cspan class=\"hljs-property\">userId\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (user) {\n            user.\u003Cspan class=\"hljs-property\">cursor\u003C/span> = cursor;\n            user.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span> = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n            \n            \u003Cspan class=\"hljs-comment\">// Broadcast cursor update to other users\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(documentId, {\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;cursor-update&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">userId\u003C/span>: connection.\u003Cspan class=\"hljs-property\">userId\u003C/span>,\n                cursor\n            }, connectionId);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">handleSelectionUpdate\u003C/span>(\u003Cspan class=\"hljs-params\">connectionId, payload\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { documentId, selection } = payload;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> connection = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(connectionId);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!connection || connection.\u003Cspan class=\"hljs-property\">documentId\u003C/span> !== documentId) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-variable language_\">document\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(documentId);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> user = \u003Cspan class=\"hljs-variable language_\">document\u003C/span>?.\u003Cspan class=\"hljs-property\">activeUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(connection.\u003Cspan class=\"hljs-property\">userId\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (user) {\n            user.\u003Cspan class=\"hljs-property\">selection\u003C/span> = selection;\n            user.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span> = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n            \n            \u003Cspan class=\"hljs-comment\">// Broadcast selection update to other users\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(documentId, {\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;selection-update&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">userId\u003C/span>: connection.\u003Cspan class=\"hljs-property\">userId\u003C/span>,\n                selection\n            }, connectionId);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">handleLockRequest\u003C/span>(\u003Cspan class=\"hljs-params\">connectionId, payload\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { documentId, range, lockType = \u003Cspan class=\"hljs-string\">&#x27;edit&#x27;\u003C/span> } = payload;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> connection = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(connectionId);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enableLocking\u003C/span> || !connection) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-variable language_\">document\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(documentId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">document\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lockId = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateId\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lock = {\n            lockId,\n            \u003Cspan class=\"hljs-attr\">userId\u003C/span>: connection.\u003Cspan class=\"hljs-property\">userId\u003C/span>,\n            range,\n            lockType,\n            \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">expiresAt\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>() + (\u003Cspan class=\"hljs-number\">5\u003C/span> * \u003Cspan class=\"hljs-number\">60\u003C/span> * \u003Cspan class=\"hljs-number\">1000\u003C/span>) \u003Cspan class=\"hljs-comment\">// 5 minutes\u003C/span>\n        };\n        \n        \u003Cspan class=\"hljs-comment\">// Check for conflicting locks\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> hasConflict = \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">locks\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>()).\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">existingLock\u003C/span> =&gt;\u003C/span> \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">rangesOverlap\u003C/span>(range, existingLock.\u003Cspan class=\"hljs-property\">range\u003C/span>)\n        );\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!hasConflict) {\n            \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">locks\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(lockId, lock);\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendToConnection\u003C/span>(connectionId, {\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;lock-acquired&#x27;\u003C/span>,\n                lockId,\n                range,\n                lockType\n            });\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(documentId, {\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;lock-created&#x27;\u003C/span>,\n                lock\n            }, connectionId);\n            \n            \u003Cspan class=\"hljs-comment\">// Auto-release lock after expiry\u003C/span>\n            \u003Cspan class=\"hljs-built_in\">setTimeout\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">locks\u003C/span>.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(lockId)) {\n                    \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">locks\u003C/span>.\u003Cspan class=\"hljs-title function_\">delete\u003C/span>(lockId);\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(documentId, {\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;lock-released&#x27;\u003C/span>,\n                        lockId\n                    });\n                }\n            }, lock.\u003Cspan class=\"hljs-property\">expiresAt\u003C/span> - \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>());\n            \n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendError\u003C/span>(connectionId, \u003Cspan class=\"hljs-string\">&#x27;Lock conflict detected&#x27;\u003C/span>);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">handleUnlockRequest\u003C/span>(\u003Cspan class=\"hljs-params\">connectionId, payload\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { documentId, lockId } = payload;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> connection = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(connectionId);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!connection) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-variable language_\">document\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(documentId);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lock = \u003Cspan class=\"hljs-variable language_\">document\u003C/span>?.\u003Cspan class=\"hljs-property\">locks\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(lockId);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (lock &amp;&amp; lock.\u003Cspan class=\"hljs-property\">userId\u003C/span> === connection.\u003Cspan class=\"hljs-property\">userId\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">locks\u003C/span>.\u003Cspan class=\"hljs-title function_\">delete\u003C/span>(lockId);\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(documentId, {\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;lock-released&#x27;\u003C/span>,\n                lockId\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleHeartbeat\u003C/span>(\u003Cspan class=\"hljs-params\">connectionId, payload\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> connection = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(connectionId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (connection) {\n            connection.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span> = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendToConnection\u003C/span>(connectionId, {\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;heartbeat-ack&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">serverTime\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n            });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleDisconnection\u003C/span>(\u003Cspan class=\"hljs-params\">connectionId\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Connection closed: \u003Cspan class=\"hljs-subst\">${connectionId}\u003C/span>`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> connection = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(connectionId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (connection) {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (connection.\u003Cspan class=\"hljs-property\">documentId\u003C/span> &amp;&amp; connection.\u003Cspan class=\"hljs-property\">userId\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">removeUserFromDocument\u003C/span>(\n                    connection.\u003Cspan class=\"hljs-property\">documentId\u003C/span>, \n                    connection.\u003Cspan class=\"hljs-property\">userId\u003C/span>, \n                    connectionId\n                );\n            }\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">delete\u003C/span>(connectionId);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">removeUserFromDocument\u003C/span>(\u003Cspan class=\"hljs-params\">documentId, userId, connectionId\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-variable language_\">document\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(documentId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">document\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> user = \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">activeUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(userId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (user) {\n            \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">activeUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">delete\u003C/span>(userId);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">users\u003C/span>.\u003Cspan class=\"hljs-title function_\">delete\u003C/span>(userId);\n            \n            \u003Cspan class=\"hljs-comment\">// Release any locks held by this user\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> userLocks = \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">locks\u003C/span>.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>())\n                .\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[_, lock]\u003C/span>) =&gt;\u003C/span> lock.\u003Cspan class=\"hljs-property\">userId\u003C/span> === userId);\n            \n            userLocks.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[lockId, _]\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">locks\u003C/span>.\u003Cspan class=\"hljs-title function_\">delete\u003C/span>(lockId);\n            });\n            \n            \u003Cspan class=\"hljs-comment\">// Notify other users\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(documentId, {\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;user-left&#x27;\u003C/span>,\n                userId,\n                \u003Cspan class=\"hljs-attr\">locksReleased\u003C/span>: userLocks.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[lockId]\u003C/span>) =&gt;\u003C/span> lockId)\n            }, connectionId);\n            \n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`User \u003Cspan class=\"hljs-subst\">${userId}\u003C/span> left document \u003Cspan class=\"hljs-subst\">${documentId}\u003C/span>`\u003C/span>);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;user-left&#x27;\u003C/span>, { documentId, userId });\n            \n            \u003Cspan class=\"hljs-comment\">// Clean up empty document\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">activeUsers\u003C/span>.\u003Cspan class=\"hljs-property\">size\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                \u003Cspan class=\"hljs-built_in\">setTimeout\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(documentId) &amp;&amp; \n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(documentId).\u003Cspan class=\"hljs-property\">activeUsers\u003C/span>.\u003Cspan class=\"hljs-property\">size\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) {\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">delete\u003C/span>(documentId);\n                        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Document \u003Cspan class=\"hljs-subst\">${documentId}\u003C/span> cleaned up`\u003C/span>);\n                    }\n                }, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">documentTimeout\u003C/span>);\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">setupOperationalTransform\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">operationTransformer\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">OperationalTransform\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">transformOperation\u003C/span>(\u003Cspan class=\"hljs-params\">\u003Cspan class=\"hljs-variable language_\">document\u003C/span>, operation, clientVersion\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Get operations that happened after client&#x27;s version\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> missedOperations = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getOperationsSince\u003C/span>(\u003Cspan class=\"hljs-variable language_\">document\u003C/span>, clientVersion);\n        \n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> transformedOp = { ...operation };\n        \n        \u003Cspan class=\"hljs-comment\">// Transform against each missed operation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> missedOp \u003Cspan class=\"hljs-keyword\">of\u003C/span> missedOperations) {\n            transformedOp = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">operationTransformer\u003C/span>.\u003Cspan class=\"hljs-title function_\">transform\u003C/span>(\n                transformedOp, \n                missedOp, \n                \u003Cspan class=\"hljs-string\">&#x27;left&#x27;\u003C/span>\n            );\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> transformedOp;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">applyOperation\u003C/span>(\u003Cspan class=\"hljs-params\">\u003Cspan class=\"hljs-variable language_\">document\u003C/span>, operation\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> { type, position, content, length } = operation;\n            \n            \u003Cspan class=\"hljs-keyword\">switch\u003C/span> (type) {\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">insertText\u003C/span>(\n                        \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span>, \n                        position, \n                        content\n                    );\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">deleteText\u003C/span>(\n                        \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span>, \n                        position, \n                        length\n                    );\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;replace&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">replaceText\u003C/span>(\n                        \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span>, \n                        position, \n                        length, \n                        content\n                    );\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-attr\">default\u003C/span>:\n                    \u003Cspan class=\"hljs-keyword\">throw\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Error\u003C/span>(\u003Cspan class=\"hljs-string\">`Unknown operation type: \u003Cspan class=\"hljs-subst\">${type}\u003C/span>`\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// Update version and add to history\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">version\u003C/span>++;\n            operation.\u003Cspan class=\"hljs-property\">version\u003C/span> = \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">version\u003C/span>;\n            \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">operationHistory\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(operation);\n            \n            \u003Cspan class=\"hljs-comment\">// Keep history bounded\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">operationHistory\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">1000\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">operationHistory\u003C/span> = \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">operationHistory\u003C/span>.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(-\u003Cspan class=\"hljs-number\">800\u003C/span>);\n            }\n            \n            \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">lastModified\u003C/span> = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">success\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>, \u003Cspan class=\"hljs-attr\">version\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">version\u003C/span> };\n            \n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> { \u003Cspan class=\"hljs-attr\">success\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>, \u003Cspan class=\"hljs-attr\">error\u003C/span>: error.\u003Cspan class=\"hljs-property\">message\u003C/span> };\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">insertText\u003C/span>(\u003Cspan class=\"hljs-params\">content, position, text\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> content.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, position) + text + content.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(position);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">deleteText\u003C/span>(\u003Cspan class=\"hljs-params\">content, position, length\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> content.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, position) + content.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(position + length);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">replaceText\u003C/span>(\u003Cspan class=\"hljs-params\">content, position, length, newText\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> content.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, position) + newText + content.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(position + length);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getOperationsSince\u003C/span>(\u003Cspan class=\"hljs-params\">\u003Cspan class=\"hljs-variable language_\">document\u003C/span>, version\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">operationHistory\u003C/span>.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">op\u003C/span> =&gt;\u003C/span> op.\u003Cspan class=\"hljs-property\">version\u003C/span> &gt; version);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">initializeDocument\u003C/span>(\u003Cspan class=\"hljs-params\">documentId, initialContent = \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-variable language_\">document\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">id\u003C/span>: documentId,\n            \u003Cspan class=\"hljs-attr\">content\u003C/span>: initialContent,\n            \u003Cspan class=\"hljs-attr\">version\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">operationHistory\u003C/span>: [],\n            \u003Cspan class=\"hljs-attr\">activeUsers\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">locks\u003C/span>: \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">metadata\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">createdAt\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>(),\n                \u003Cspan class=\"hljs-attr\">lastModified\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>(),\n                \u003Cspan class=\"hljs-attr\">title\u003C/span>: \u003Cspan class=\"hljs-string\">`Document \u003Cspan class=\"hljs-subst\">${documentId}\u003C/span>`\u003C/span>\n            }\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(documentId, \u003Cspan class=\"hljs-variable language_\">document\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Load persisted content if available\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enablePersistence\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> persisted = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">loadDocument\u003C/span>(documentId);\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (persisted) {\n                    \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">assign\u003C/span>(\u003Cspan class=\"hljs-variable language_\">document\u003C/span>, persisted);\n                }\n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">warn\u003C/span>(\u003Cspan class=\"hljs-string\">`Failed to load persisted document \u003Cspan class=\"hljs-subst\">${documentId}\u003C/span>:`\u003C/span>, error);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Document \u003Cspan class=\"hljs-subst\">${documentId}\u003C/span> initialized`\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">document\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">persistDocument\u003C/span>(\u003Cspan class=\"hljs-params\">\u003Cspan class=\"hljs-variable language_\">document\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Implementation would depend on chosen storage backend\u003C/span>\n        \u003Cspan class=\"hljs-comment\">// This is a placeholder for persistence logic\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Persisting document \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">document\u003C/span>.id}\u003C/span> version \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">document\u003C/span>.version}\u003C/span>`\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">loadDocument\u003C/span>(\u003Cspan class=\"hljs-params\">documentId\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Implementation would depend on chosen storage backend\u003C/span>\n        \u003Cspan class=\"hljs-comment\">// This is a placeholder for loading logic\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Loading document \u003Cspan class=\"hljs-subst\">${documentId}\u003C/span>`\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">sendToConnection\u003C/span>(\u003Cspan class=\"hljs-params\">connectionId, message\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> connection = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(connectionId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (connection &amp;&amp; connection.\u003Cspan class=\"hljs-property\">ws\u003C/span>.\u003Cspan class=\"hljs-property\">readyState\u003C/span> === \u003Cspan class=\"hljs-number\">1\u003C/span>) { \u003Cspan class=\"hljs-comment\">// WebSocket.OPEN\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                connection.\u003Cspan class=\"hljs-property\">ws\u003C/span>.\u003Cspan class=\"hljs-title function_\">send\u003C/span>(\u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">stringify\u003C/span>(message));\n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">`Failed to send message to \u003Cspan class=\"hljs-subst\">${connectionId}\u003C/span>:`\u003C/span>, error);\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleDisconnection\u003C/span>(connectionId);\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">sendError\u003C/span>(\u003Cspan class=\"hljs-params\">connectionId, error\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendToConnection\u003C/span>(connectionId, {\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>,\n            error,\n            \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(\u003Cspan class=\"hljs-params\">documentId, message, excludeConnection = \u003Cspan class=\"hljs-literal\">null\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-variable language_\">document\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(documentId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">document\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">activeUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">user\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (user.\u003Cspan class=\"hljs-property\">connectionId\u003C/span> !== excludeConnection) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendToConnection\u003C/span>(user.\u003Cspan class=\"hljs-property\">connectionId\u003C/span>, message);\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">rangesOverlap\u003C/span>(\u003Cspan class=\"hljs-params\">range1, range2\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Simple range overlap check\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> start1 = range1.\u003Cspan class=\"hljs-property\">start\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> end1 = range1.\u003Cspan class=\"hljs-property\">end\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> start2 = range2.\u003Cspan class=\"hljs-property\">start\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> end2 = range2.\u003Cspan class=\"hljs-property\">end\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> start1 &lt; end2 &amp;&amp; start2 &lt; end1;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateId\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">random\u003C/span>().\u003Cspan class=\"hljs-title function_\">toString\u003C/span>(\u003Cspan class=\"hljs-number\">36\u003C/span>).\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">2\u003C/span>, \u003Cspan class=\"hljs-number\">15\u003C/span>) + \n               \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">random\u003C/span>().\u003Cspan class=\"hljs-title function_\">toString\u003C/span>(\u003Cspan class=\"hljs-number\">36\u003C/span>).\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">2\u003C/span>, \u003Cspan class=\"hljs-number\">15\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateUserColor\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> colors = [\n            \u003Cspan class=\"hljs-string\">&#x27;#FF6B6B&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;#4ECDC4&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;#45B7D1&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;#96CEB4&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;#FECA57&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;#FF9FF3&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;#54A0FF&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;#5F27CD&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;#00D2D3&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;#FF9F43&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-string\">&#x27;#8395A7&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;#6C5CE7&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;#A29BFE&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;#FD79A8&#x27;\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;#E17055&#x27;\u003C/span>\n        ];\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> colors[\u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">floor\u003C/span>(\u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">random\u003C/span>() * colors.\u003Cspan class=\"hljs-property\">length\u003C/span>)];\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">startHeartbeat\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">heartbeatTimer\u003C/span> = \u003Cspan class=\"hljs-built_in\">setInterval\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> now = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> timeout = \u003Cspan class=\"hljs-number\">60000\u003C/span>; \u003Cspan class=\"hljs-comment\">// 1 minute\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\">// Check for inactive connections\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">connection, connectionId\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (now - connection.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span> &gt; timeout) {\n                    \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Connection \u003Cspan class=\"hljs-subst\">${connectionId}\u003C/span> timed out`\u003C/span>);\n                    connection.\u003Cspan class=\"hljs-property\">ws\u003C/span>.\u003Cspan class=\"hljs-title function_\">terminate\u003C/span>();\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleDisconnection\u003C/span>(connectionId);\n                }\n            });\n            \n            \u003Cspan class=\"hljs-comment\">// Send heartbeat to active connections\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">connection, connectionId\u003C/span>) =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (connection.\u003Cspan class=\"hljs-property\">ws\u003C/span>.\u003Cspan class=\"hljs-property\">readyState\u003C/span> === \u003Cspan class=\"hljs-number\">1\u003C/span>) {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendToConnection\u003C/span>(connectionId, {\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;heartbeat&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">serverTime\u003C/span>: now\n                    });\n                }\n            });\n            \n        }, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">heartbeatInterval\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getDocumentStats\u003C/span>(\u003Cspan class=\"hljs-params\">documentId\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-variable language_\">document\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(documentId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">document\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">id\u003C/span>: documentId,\n            \u003Cspan class=\"hljs-attr\">version\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">version\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">contentLength\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">activeUsers\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">activeUsers\u003C/span>.\u003Cspan class=\"hljs-property\">size\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">activeLocks\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">locks\u003C/span>.\u003Cspan class=\"hljs-property\">size\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">operationCount\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">operationHistory\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">lastModified\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">lastModified\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">metadata\u003C/span>: \u003Cspan class=\"hljs-variable language_\">document\u003C/span>.\u003Cspan class=\"hljs-property\">metadata\u003C/span>\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getServerStats\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">totalDocuments\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-property\">size\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">totalConnections\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-property\">size\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">totalUsers\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">users\u003C/span>.\u003Cspan class=\"hljs-property\">size\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">uptime\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>() - \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">startTime\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">memoryUsage\u003C/span>: process.\u003Cspan class=\"hljs-title function_\">memoryUsage\u003C/span>()\n        };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">shutdown\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Shutting down collaborative engine...&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Clear heartbeat timer\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">heartbeatTimer\u003C/span>) {\n            \u003Cspan class=\"hljs-built_in\">clearInterval\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">heartbeatTimer\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Close all connections\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">connection, connectionId\u003C/span>) =&gt;\u003C/span> {\n            connection.\u003Cspan class=\"hljs-property\">ws\u003C/span>.\u003Cspan class=\"hljs-title function_\">close\u003C/span>(\u003Cspan class=\"hljs-number\">1001\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;Server shutting down&#x27;\u003C/span>);\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Close WebSocket server\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">wss\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">wss\u003C/span>.\u003Cspan class=\"hljs-title function_\">close\u003C/span>();\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Persist all documents\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enablePersistence\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> persistPromises = \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documents\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>())\n                .\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">doc\u003C/span> =&gt;\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">persistDocument\u003C/span>(doc));\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-title class_\">Promise\u003C/span>.\u003Cspan class=\"hljs-title function_\">all\u003C/span>(persistPromises);\n        }\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Collaborative engine shut down complete&#x27;\u003C/span>);\n    }\n}\n\n\u003Cspan class=\"hljs-comment\">// Operational Transform implementation\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">OperationalTransform\u003C/span> {\n    \u003Cspan class=\"hljs-title function_\">transform\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, priority = \u003Cspan class=\"hljs-string\">&#x27;left&#x27;\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Simplified operational transform implementation\u003C/span>\n        \u003Cspan class=\"hljs-comment\">// In production, you&#x27;d use a more sophisticated library like ShareJS or Yjs\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">transformInsertInsert\u003C/span>(op1, op2, priority);\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">transformInsertDelete\u003C/span>(op1, op2);\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">transformDeleteInsert\u003C/span>(op1, op2);\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">transformDeleteDelete\u003C/span>(op1, op2);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> op1; \u003Cspan class=\"hljs-comment\">// Fallback\u003C/span>\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">transformInsertInsert\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, priority\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">position\u003C/span> &lt;= op2.\u003Cspan class=\"hljs-property\">position\u003C/span> || (op1.\u003Cspan class=\"hljs-property\">position\u003C/span> === op2.\u003Cspan class=\"hljs-property\">position\u003C/span> &amp;&amp; priority === \u003Cspan class=\"hljs-string\">&#x27;left&#x27;\u003C/span>)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> op1;\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                ...op1,\n                \u003Cspan class=\"hljs-attr\">position\u003C/span>: op1.\u003Cspan class=\"hljs-property\">position\u003C/span> + op2.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            };\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">transformInsertDelete\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">position\u003C/span> &lt;= op2.\u003Cspan class=\"hljs-property\">position\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> op1;\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">position\u003C/span> &gt;= op2.\u003Cspan class=\"hljs-property\">position\u003C/span> + op2.\u003Cspan class=\"hljs-property\">length\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                ...op1,\n                \u003Cspan class=\"hljs-attr\">position\u003C/span>: op1.\u003Cspan class=\"hljs-property\">position\u003C/span> - op2.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            };\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Insert position is within deleted range\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                ...op1,\n                \u003Cspan class=\"hljs-attr\">position\u003C/span>: op2.\u003Cspan class=\"hljs-property\">position\u003C/span>\n            };\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">transformDeleteInsert\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">position\u003C/span> &gt;= op2.\u003Cspan class=\"hljs-property\">position\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                ...op1,\n                \u003Cspan class=\"hljs-attr\">position\u003C/span>: op1.\u003Cspan class=\"hljs-property\">position\u003C/span> + op2.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            };\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> op1;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">transformDeleteDelete\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">position\u003C/span> &gt;= op2.\u003Cspan class=\"hljs-property\">position\u003C/span> + op2.\u003Cspan class=\"hljs-property\">length\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                ...op1,\n                \u003Cspan class=\"hljs-attr\">position\u003C/span>: op1.\u003Cspan class=\"hljs-property\">position\u003C/span> - op2.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            };\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">position\u003C/span> + op1.\u003Cspan class=\"hljs-property\">length\u003C/span> &lt;= op2.\u003Cspan class=\"hljs-property\">position\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> op1;\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Overlapping deletes - more complex logic needed\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> start1 = op1.\u003Cspan class=\"hljs-property\">position\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> end1 = op1.\u003Cspan class=\"hljs-property\">position\u003C/span> + op1.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> start2 = op2.\u003Cspan class=\"hljs-property\">position\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> end2 = op2.\u003Cspan class=\"hljs-property\">position\u003C/span> + op2.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (start1 &gt;= start2 &amp;&amp; end1 &lt;= end2) {\n                \u003Cspan class=\"hljs-comment\">// op1 is completely within op2, becomes no-op\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> { ...op1, \u003Cspan class=\"hljs-attr\">length\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span> };\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (start2 &gt;= start1 &amp;&amp; end2 &lt;= end1) {\n                \u003Cspan class=\"hljs-comment\">// op2 is completely within op1\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                    ...op1,\n                    \u003Cspan class=\"hljs-attr\">length\u003C/span>: op1.\u003Cspan class=\"hljs-property\">length\u003C/span> - op2.\u003Cspan class=\"hljs-property\">length\u003C/span>\n                };\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                \u003Cspan class=\"hljs-comment\">// Partial overlap - simplified handling\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> newStart = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(start1, start2);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> newEnd = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">min\u003C/span>(end1, end2);\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> overlap = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, newEnd - newStart);\n                \n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                    ...op1,\n                    \u003Cspan class=\"hljs-attr\">length\u003C/span>: \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, op1.\u003Cspan class=\"hljs-property\">length\u003C/span> - overlap),\n                    \u003Cspan class=\"hljs-attr\">position\u003C/span>: \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">min\u003C/span>(op1.\u003Cspan class=\"hljs-property\">position\u003C/span>, op2.\u003Cspan class=\"hljs-property\">position\u003C/span>)\n                };\n            }\n        }\n    }\n}\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = \u003Cspan class=\"hljs-title class_\">CollaborativeMarkdownEngine\u003C/span>;\n\u003C/code>\u003C/pre>\u003Ch3 id=\"client-side-integration\">Client-Side Integration\u003C/h3>\n\u003Cp>Real-time collaborative editing client implementation:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// collaborative-markdown-client.js - Client-side collaboration\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">CollaborativeMarkdownClient\u003C/span> \u003Cspan class=\"hljs-keyword\">extends\u003C/span> \u003Cspan class=\"hljs-title class_ inherited__\">EventEmitter\u003C/span> {\n    \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">options = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">super\u003C/span>();\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">serverUrl\u003C/span>: options.\u003Cspan class=\"hljs-property\">serverUrl\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;ws://localhost:3001&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">reconnectDelay\u003C/span>: options.\u003Cspan class=\"hljs-property\">reconnectDelay\u003C/span> || \u003Cspan class=\"hljs-number\">3000\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">maxReconnectAttempts\u003C/span>: options.\u003Cspan class=\"hljs-property\">maxReconnectAttempts\u003C/span> || \u003Cspan class=\"hljs-number\">10\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">operationBufferSize\u003C/span>: options.\u003Cspan class=\"hljs-property\">operationBufferSize\u003C/span> || \u003Cspan class=\"hljs-number\">100\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enableCursorSync\u003C/span>: options.\u003Cspan class=\"hljs-property\">enableCursorSync\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enableSelectionSync\u003C/span>: options.\u003Cspan class=\"hljs-property\">enableSelectionSync\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">heartbeatInterval\u003C/span>: options.\u003Cspan class=\"hljs-property\">heartbeatInterval\u003C/span> || \u003Cspan class=\"hljs-number\">25000\u003C/span>,\n            ...options\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">ws\u003C/span> = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connectionId\u003C/span> = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentId\u003C/span> = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">userId\u003C/span> = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentVersion\u003C/span> = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isConnected\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isJoined\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">reconnectAttempts\u003C/span> = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">pendingOperations\u003C/span> = [];\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">operationBuffer\u003C/span> = [];\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">remoteUsers\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">activeLocks\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">editor\u003C/span> = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">heartbeatTimer\u003C/span> = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">setupEventHandlers\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">setupEventHandlers\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Buffer operations when disconnected\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">on\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;operation-queued&#x27;\u003C/span>, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">operation\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isConnected\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">pendingOperations\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(operation);\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">connect\u003C/span>(\u003Cspan class=\"hljs-params\">retryAttempt = \u003Cspan class=\"hljs-number\">0\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Promise\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">resolve, reject\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">ws\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">WebSocket\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">serverUrl\u003C/span>);\n                \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">ws\u003C/span>.\u003Cspan class=\"hljs-property\">onopen\u003C/span> = \u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Connected to collaborative server&#x27;\u003C/span>);\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isConnected\u003C/span> = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">reconnectAttempts\u003C/span> = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">startHeartbeat\u003C/span>();\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;connected&#x27;\u003C/span>);\n                    \u003Cspan class=\"hljs-title function_\">resolve\u003C/span>();\n                };\n                \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">ws\u003C/span>.\u003Cspan class=\"hljs-property\">onmessage\u003C/span> = \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">event\u003C/span>) =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleMessage\u003C/span>(event.\u003Cspan class=\"hljs-property\">data\u003C/span>);\n                };\n                \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">ws\u003C/span>.\u003Cspan class=\"hljs-property\">onclose\u003C/span> = \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">event\u003C/span>) =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Disconnected from collaborative server&#x27;\u003C/span>);\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleDisconnection\u003C/span>();\n                };\n                \n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">ws\u003C/span>.\u003Cspan class=\"hljs-property\">onerror\u003C/span> = \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">error\u003C/span>) =&gt;\u003C/span> {\n                    \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;WebSocket error:&#x27;\u003C/span>, error);\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>, error);\n                    \n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (retryAttempt &lt; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">maxReconnectAttempts\u003C/span>) {\n                        \u003Cspan class=\"hljs-built_in\">setTimeout\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n                            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">connect\u003C/span>(retryAttempt + \u003Cspan class=\"hljs-number\">1\u003C/span>);\n                        }, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">reconnectDelay\u003C/span> * \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">pow\u003C/span>(\u003Cspan class=\"hljs-number\">2\u003C/span>, retryAttempt));\n                    } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                        \u003Cspan class=\"hljs-title function_\">reject\u003C/span>(\u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Max reconnection attempts reached&#x27;\u003C/span>));\n                    }\n                };\n                \n            } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n                \u003Cspan class=\"hljs-title function_\">reject\u003C/span>(error);\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">joinDocument\u003C/span>(\u003Cspan class=\"hljs-params\">documentId, userId, userInfo = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isConnected\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">throw\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Not connected to server&#x27;\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentId\u003C/span> = documentId;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">userId\u003C/span> = userId;\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Promise\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">resolve, reject\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> timeout = \u003Cspan class=\"hljs-built_in\">setTimeout\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-title function_\">reject\u003C/span>(\u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Join document timeout&#x27;\u003C/span>));\n            }, \u003Cspan class=\"hljs-number\">10000\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> \u003Cspan class=\"hljs-title function_\">handleDocumentState\u003C/span> = (\u003Cspan class=\"hljs-params\">data\u003C/span>) =&gt; {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (data.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;document-state&#x27;\u003C/span>) {\n                    \u003Cspan class=\"hljs-built_in\">clearTimeout\u003C/span>(timeout);\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">off\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>, handleDocumentState);\n                    \n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentVersion\u003C/span> = data.\u003Cspan class=\"hljs-property\">document\u003C/span>.\u003Cspan class=\"hljs-property\">version\u003C/span>;\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isJoined\u003C/span> = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                    \n                    \u003Cspan class=\"hljs-comment\">// Update remote users\u003C/span>\n                    data.\u003Cspan class=\"hljs-property\">activeUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">user\u003C/span> =&gt;\u003C/span> {\n                        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (user.\u003Cspan class=\"hljs-property\">userId\u003C/span> !== \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">userId\u003C/span>) {\n                            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">remoteUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(user.\u003Cspan class=\"hljs-property\">userId\u003C/span>, user);\n                        }\n                    });\n                    \n                    \u003Cspan class=\"hljs-comment\">// Update locks\u003C/span>\n                    data.\u003Cspan class=\"hljs-property\">locks\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[lockId, lock]\u003C/span>) =&gt;\u003C/span> {\n                        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">activeLocks\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(lockId, lock);\n                    });\n                    \n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;document-joined&#x27;\u003C/span>, data.\u003Cspan class=\"hljs-property\">document\u003C/span>);\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;users-updated&#x27;\u003C/span>, \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">remoteUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>()));\n                    \n                    \u003Cspan class=\"hljs-comment\">// Send pending operations\u003C/span>\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">flushPendingOperations\u003C/span>();\n                    \n                    \u003Cspan class=\"hljs-title function_\">resolve\u003C/span>(data.\u003Cspan class=\"hljs-property\">document\u003C/span>);\n                }\n            };\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">on\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>, handleDocumentState);\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">send\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;join-document&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">payload\u003C/span>: {\n                    documentId,\n                    userId,\n                    userInfo\n                }\n            });\n        });\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">leaveDocument\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isJoined\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">send\u003C/span>({\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;leave-document&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">payload\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">documentId\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentId\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">userId\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">userId\u003C/span>\n            }\n        });\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isJoined\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentId\u003C/span> = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentVersion\u003C/span> = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">remoteUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">clear\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">activeLocks\u003C/span>.\u003Cspan class=\"hljs-title function_\">clear\u003C/span>();\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;document-left&#x27;\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">sendOperation\u003C/span>(\u003Cspan class=\"hljs-params\">operation\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isJoined\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;operation-queued&#x27;\u003C/span>, operation);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> operationWithId = {\n            ...operation,\n            \u003Cspan class=\"hljs-attr\">id\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateOperationId\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">send\u003C/span>({\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;operation&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">payload\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">documentId\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentId\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">operation\u003C/span>: operationWithId,\n                \u003Cspan class=\"hljs-attr\">version\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentVersion\u003C/span>\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Add to buffer for tracking\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">operationBuffer\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(operationWithId);\n        \n        \u003Cspan class=\"hljs-comment\">// Keep buffer size manageable\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">operationBuffer\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">operationBufferSize\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">operationBuffer\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">operationBuffer\u003C/span>.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(-\u003Cspan class=\"hljs-number\">50\u003C/span>);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">sendCursorUpdate\u003C/span>(\u003Cspan class=\"hljs-params\">cursor\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isJoined\u003C/span> || !\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enableCursorSync\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">send\u003C/span>({\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;cursor-update&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">payload\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">documentId\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentId\u003C/span>,\n                cursor\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">sendSelectionUpdate\u003C/span>(\u003Cspan class=\"hljs-params\">selection\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isJoined\u003C/span> || !\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enableSelectionSync\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">send\u003C/span>({\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;selection-update&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">payload\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">documentId\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentId\u003C/span>,\n                selection\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">requestLock\u003C/span>(\u003Cspan class=\"hljs-params\">range, lockType = \u003Cspan class=\"hljs-string\">&#x27;edit&#x27;\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isJoined\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">send\u003C/span>({\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;lock-request&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">payload\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">documentId\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentId\u003C/span>,\n                range,\n                lockType\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">releaseLock\u003C/span>(\u003Cspan class=\"hljs-params\">lockId\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isJoined\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">send\u003C/span>({\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;unlock-request&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">payload\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">documentId\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentId\u003C/span>,\n                lockId\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleMessage\u003C/span>(\u003Cspan class=\"hljs-params\">data\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">try\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> message = \u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">parse\u003C/span>(data);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;message&#x27;\u003C/span>, message);\n            \n            \u003Cspan class=\"hljs-keyword\">switch\u003C/span> (message.\u003Cspan class=\"hljs-property\">type\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;connection-ack&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connectionId\u003C/span> = message.\u003Cspan class=\"hljs-property\">connectionId\u003C/span>;\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;operation&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleRemoteOperation\u003C/span>(message);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;operation-ack&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleOperationAck\u003C/span>(message);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;user-joined&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleUserJoined\u003C/span>(message);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;user-left&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleUserLeft\u003C/span>(message);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;cursor-update&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleCursorUpdate\u003C/span>(message);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;selection-update&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleSelectionUpdate\u003C/span>(message);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;lock-created&#x27;\u003C/span>:\n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;lock-acquired&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleLockCreated\u003C/span>(message);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;lock-released&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleLockReleased\u003C/span>(message);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;heartbeat&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleHeartbeat\u003C/span>(message);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;heartbeat-ack&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleHeartbeatAck\u003C/span>(message);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-keyword\">case\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;error&#x27;\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Server error:&#x27;\u003C/span>, message.\u003Cspan class=\"hljs-property\">error\u003C/span>);\n                    \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;server-error&#x27;\u003C/span>, message.\u003Cspan class=\"hljs-property\">error\u003C/span>);\n                    \u003Cspan class=\"hljs-keyword\">break\u003C/span>;\n                    \n                \u003Cspan class=\"hljs-attr\">default\u003C/span>:\n                    \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">warn\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Unknown message type:&#x27;\u003C/span>, message.\u003Cspan class=\"hljs-property\">type\u003C/span>);\n            }\n        } \u003Cspan class=\"hljs-keyword\">catch\u003C/span> (error) {\n            \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">error\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;Error handling message:&#x27;\u003C/span>, error);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleRemoteOperation\u003C/span>(\u003Cspan class=\"hljs-params\">message\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { operation, version, author, timestamp } = message;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentVersion\u003C/span> = version;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;remote-operation&#x27;\u003C/span>, {\n            operation,\n            version,\n            author,\n            timestamp\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleOperationAck\u003C/span>(\u003Cspan class=\"hljs-params\">message\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { operationId, version, success } = message;\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (success) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentVersion\u003C/span> = version;\n            \n            \u003Cspan class=\"hljs-comment\">// Remove acknowledged operation from buffer\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">operationBuffer\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">operationBuffer\u003C/span>.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\n                \u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">op\u003C/span> =&gt;\u003C/span> op.\u003Cspan class=\"hljs-property\">id\u003C/span> !== operationId\n            );\n        }\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;operation-ack&#x27;\u003C/span>, {\n            operationId,\n            version,\n            success\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleUserJoined\u003C/span>(\u003Cspan class=\"hljs-params\">message\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { user } = message;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">remoteUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(user.\u003Cspan class=\"hljs-property\">userId\u003C/span>, user);\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;user-joined&#x27;\u003C/span>, user);\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;users-updated&#x27;\u003C/span>, \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">remoteUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>()));\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleUserLeft\u003C/span>(\u003Cspan class=\"hljs-params\">message\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { userId, locksReleased } = message;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">remoteUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">delete\u003C/span>(userId);\n        \n        \u003Cspan class=\"hljs-comment\">// Remove locks released by the user\u003C/span>\n        locksReleased?.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">lockId\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">activeLocks\u003C/span>.\u003Cspan class=\"hljs-title function_\">delete\u003C/span>(lockId);\n        });\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;user-left&#x27;\u003C/span>, { userId, locksReleased });\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;users-updated&#x27;\u003C/span>, \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">remoteUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>()));\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;locks-updated&#x27;\u003C/span>, \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">activeLocks\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>()));\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleCursorUpdate\u003C/span>(\u003Cspan class=\"hljs-params\">message\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { userId, cursor } = message;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> user = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">remoteUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(userId);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (user) {\n            user.\u003Cspan class=\"hljs-property\">cursor\u003C/span> = cursor;\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;cursor-updated&#x27;\u003C/span>, { userId, cursor });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleSelectionUpdate\u003C/span>(\u003Cspan class=\"hljs-params\">message\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { userId, selection } = message;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> user = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">remoteUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(userId);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (user) {\n            user.\u003Cspan class=\"hljs-property\">selection\u003C/span> = selection;\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;selection-updated&#x27;\u003C/span>, { userId, selection });\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleLockCreated\u003C/span>(\u003Cspan class=\"hljs-params\">message\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { lock } = message;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">activeLocks\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(lock.\u003Cspan class=\"hljs-property\">lockId\u003C/span>, lock);\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;lock-created&#x27;\u003C/span>, lock);\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;locks-updated&#x27;\u003C/span>, \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">activeLocks\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>()));\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleLockReleased\u003C/span>(\u003Cspan class=\"hljs-params\">message\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { lockId } = message;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">activeLocks\u003C/span>.\u003Cspan class=\"hljs-title function_\">delete\u003C/span>(lockId);\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;lock-released&#x27;\u003C/span>, lockId);\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;locks-updated&#x27;\u003C/span>, \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">activeLocks\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>()));\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleHeartbeat\u003C/span>(\u003Cspan class=\"hljs-params\">message\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">send\u003C/span>({\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;heartbeat&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">payload\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">clientTime\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleHeartbeatAck\u003C/span>(\u003Cspan class=\"hljs-params\">message\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { serverTime } = message;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> clientTime = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> latency = clientTime - (message.\u003Cspan class=\"hljs-property\">clientTime\u003C/span> || clientTime);\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;latency-update&#x27;\u003C/span>, latency);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleDisconnection\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isConnected\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isJoined\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">heartbeatTimer\u003C/span>) {\n            \u003Cspan class=\"hljs-built_in\">clearInterval\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">heartbeatTimer\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;disconnected&#x27;\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Attempt reconnection\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">reconnectAttempts\u003C/span> &lt; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">maxReconnectAttempts\u003C/span>) {\n            \u003Cspan class=\"hljs-built_in\">setTimeout\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">reconnectAttempts\u003C/span>++;\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;reconnecting&#x27;\u003C/span>, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">reconnectAttempts\u003C/span>);\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">connect\u003C/span>();\n            }, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">reconnectDelay\u003C/span>);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">flushPendingOperations\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">pendingOperations\u003C/span>.\u003Cspan class=\"hljs-property\">length\u003C/span> === \u003Cspan class=\"hljs-number\">0\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">console\u003C/span>.\u003Cspan class=\"hljs-title function_\">log\u003C/span>(\u003Cspan class=\"hljs-string\">`Sending \u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.pendingOperations.length}\u003C/span> pending operations`\u003C/span>);\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">pendingOperations\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">operation\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">sendOperation\u003C/span>(operation);\n        });\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">pendingOperations\u003C/span> = [];\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">startHeartbeat\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">heartbeatTimer\u003C/span> = \u003Cspan class=\"hljs-built_in\">setInterval\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isConnected\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">send\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;heartbeat&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">payload\u003C/span>: {\n                        \u003Cspan class=\"hljs-attr\">clientTime\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n                    }\n                });\n            }\n        }, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">heartbeatInterval\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">send\u003C/span>(\u003Cspan class=\"hljs-params\">message\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">ws\u003C/span> &amp;&amp; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">ws\u003C/span>.\u003Cspan class=\"hljs-property\">readyState\u003C/span> === \u003Cspan class=\"hljs-title class_\">WebSocket\u003C/span>.\u003Cspan class=\"hljs-property\">OPEN\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">ws\u003C/span>.\u003Cspan class=\"hljs-title function_\">send\u003C/span>(\u003Cspan class=\"hljs-title class_\">JSON\u003C/span>.\u003Cspan class=\"hljs-title function_\">stringify\u003C/span>(message));\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateOperationId\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.userId}\u003C/span>_\u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-built_in\">Date\u003C/span>.now()}\u003C/span>_\u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-built_in\">Math\u003C/span>.random().toString(\u003Cspan class=\"hljs-number\">36\u003C/span>).substr(\u003Cspan class=\"hljs-number\">2\u003C/span>, \u003Cspan class=\"hljs-number\">9\u003C/span>)}\u003C/span>`\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getRemoteUsers\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">remoteUsers\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>());\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getActiveLocks\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">activeLocks\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>());\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getConnectionInfo\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">connectionId\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">connectionId\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">documentId\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentId\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">userId\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">userId\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">documentVersion\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">documentVersion\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">isConnected\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isConnected\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">isJoined\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isJoined\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">remoteUserCount\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">remoteUsers\u003C/span>.\u003Cspan class=\"hljs-property\">size\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">activeLockCount\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">activeLocks\u003C/span>.\u003Cspan class=\"hljs-property\">size\u003C/span>\n        };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">disconnect\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">isJoined\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">leaveDocument\u003C/span>();\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">heartbeatTimer\u003C/span>) {\n            \u003Cspan class=\"hljs-built_in\">clearInterval\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">heartbeatTimer\u003C/span>);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">ws\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">ws\u003C/span>.\u003Cspan class=\"hljs-title function_\">close\u003C/span>();\n        }\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">emit\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;disconnected&#x27;\u003C/span>);\n    }\n}\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = \u003Cspan class=\"hljs-title class_\">CollaborativeMarkdownClient\u003C/span>;\n\u003C/code>\u003C/pre>\u003Ch2 id=\"advanced-conflict-resolution-strategies\">Advanced Conflict Resolution Strategies\u003C/h2>\n\u003Ch3 id=\"sophisticated-operational-transform\">Sophisticated Operational Transform\u003C/h3>\n\u003Cp>Implementing advanced conflict resolution for complex editing scenarios:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// advanced-operational-transform.js - Sophisticated conflict resolution\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">AdvancedOperationalTransform\u003C/span> {\n    \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">options = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span> = {\n            \u003Cspan class=\"hljs-attr\">enableContentAwareTransform\u003C/span>: options.\u003Cspan class=\"hljs-property\">enableContentAwareTransform\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enableSemanticMerge\u003C/span>: options.\u003Cspan class=\"hljs-property\">enableSemanticMerge\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">enableIntentionPreservation\u003C/span>: options.\u003Cspan class=\"hljs-property\">enableIntentionPreservation\u003C/span> !== \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">conflictResolutionStrategy\u003C/span>: options.\u003Cspan class=\"hljs-property\">conflictResolutionStrategy\u003C/span> || \u003Cspan class=\"hljs-string\">&#x27;automatic&#x27;\u003C/span>,\n            ...options\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">transformationRules\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">contentAnalyzer\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownContentAnalyzer\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">intentionTracker\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">IntentionTracker\u003C/span>();\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">setupTransformationRules\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">setupTransformationRules\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Register transformation rules for different content types\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addTransformRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;heading&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">mergeStrategy\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;structural-aware&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">conflictHandler\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">handleHeadingConflict\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        });\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addTransformRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;list&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">mergeStrategy\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;item-aware&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">conflictHandler\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">handleListConflict\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        });\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addTransformRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;code-block&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">mergeStrategy\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;preserve-syntax&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">conflictHandler\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">handleCodeBlockConflict\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        });\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addTransformRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;link&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">mergeStrategy\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;url-aware&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">conflictHandler\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">handleLinkConflict\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        });\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">addTransformRule\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">priority\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">mergeStrategy\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;cell-aware&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">conflictHandler\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">handleTableConflict\u003C/span>.\u003Cspan class=\"hljs-title function_\">bind\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>)\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">addTransformRule\u003C/span>(\u003Cspan class=\"hljs-params\">contentType, rule\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">transformationRules\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(contentType, rule);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">transform\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, context = {}\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> analysis = \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyzeOperations\u003C/span>(op1, op2, context);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enableContentAwareTransform\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">contentAwareTransform\u003C/span>(op1, op2, analysis);\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">basicTransform\u003C/span>(op1, op2);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">analyzeOperations\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, context\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> analysis = {\n            \u003Cspan class=\"hljs-attr\">op1Content\u003C/span>: \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">contentAnalyzer\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyze\u003C/span>(\n                context.\u003Cspan class=\"hljs-property\">content\u003C/span>, op1.\u003Cspan class=\"hljs-property\">position\u003C/span>, op1.\u003Cspan class=\"hljs-property\">length\u003C/span> || op1.\u003Cspan class=\"hljs-property\">content\u003C/span>?.\u003Cspan class=\"hljs-property\">length\u003C/span> || \u003Cspan class=\"hljs-number\">0\u003C/span>\n            ),\n            \u003Cspan class=\"hljs-attr\">op2Content\u003C/span>: \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">contentAnalyzer\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyze\u003C/span>(\n                context.\u003Cspan class=\"hljs-property\">content\u003C/span>, op2.\u003Cspan class=\"hljs-property\">position\u003C/span>, op2.\u003Cspan class=\"hljs-property\">length\u003C/span> || op2.\u003Cspan class=\"hljs-property\">content\u003C/span>?.\u003Cspan class=\"hljs-property\">length\u003C/span> || \u003Cspan class=\"hljs-number\">0\u003C/span>\n            ),\n            \u003Cspan class=\"hljs-attr\">conflictType\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">detectConflictType\u003C/span>(op1, op2),\n            \u003Cspan class=\"hljs-attr\">semanticContext\u003C/span>: \u003Cspan class=\"hljs-keyword\">await\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractSemanticContext\u003C/span>(context.\u003Cspan class=\"hljs-property\">content\u003C/span>, op1, op2),\n            \u003Cspan class=\"hljs-attr\">userIntentions\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">intentionTracker\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyzeIntentions\u003C/span>(op1, op2, context)\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> analysis;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">detectConflictType\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Determine the type of conflict between operations\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">operationsOverlap\u003C/span>(op1, op2)) {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;concurrent-deletion&#x27;\u003C/span>;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;insert-delete-conflict&#x27;\u003C/span>;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;delete-insert-conflict&#x27;\u003C/span>;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;concurrent-insertion&#x27;\u003C/span>;\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;complex-overlap&#x27;\u003C/span>;\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;no-conflict&#x27;\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">contentAwareTransform\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, analysis\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { op1Content, op2Content, conflictType, semanticContext } = analysis;\n        \n        \u003Cspan class=\"hljs-comment\">// Apply content-specific transformation rules\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1Content.\u003Cspan class=\"hljs-property\">type\u003C/span> &amp;&amp; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">transformationRules\u003C/span>.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(op1Content.\u003Cspan class=\"hljs-property\">type\u003C/span>)) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> rule = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">transformationRules\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(op1Content.\u003Cspan class=\"hljs-property\">type\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-keyword\">await\u003C/span> rule.\u003Cspan class=\"hljs-title function_\">conflictHandler\u003C/span>(op1, op2, analysis);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op2Content.\u003Cspan class=\"hljs-property\">type\u003C/span> &amp;&amp; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">transformationRules\u003C/span>.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(op2Content.\u003Cspan class=\"hljs-property\">type\u003C/span>)) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> rule = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">transformationRules\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(op2Content.\u003Cspan class=\"hljs-property\">type\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-keyword\">await\u003C/span> rule.\u003Cspan class=\"hljs-title function_\">conflictHandler\u003C/span>(op2, op1, analysis);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Apply semantic-aware transformations\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">options\u003C/span>.\u003Cspan class=\"hljs-property\">enableSemanticMerge\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">semanticTransform\u003C/span>(op1, op2, analysis);\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Fallback to basic transformation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">basicTransform\u003C/span>(op1, op2);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">handleHeadingConflict\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, analysis\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { conflictType, semanticContext } = analysis;\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (conflictType === \u003Cspan class=\"hljs-string\">&#x27;concurrent-insertion&#x27;\u003C/span> &amp;&amp; \n            op1.\u003Cspan class=\"hljs-property\">content\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">content\u003C/span> &amp;&amp;\n            op1.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;#&#x27;\u003C/span>) &amp;&amp; op2.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;#&#x27;\u003C/span>)) {\n            \n            \u003Cspan class=\"hljs-comment\">// Both operations are inserting headings\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> level1 = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractHeadingLevel\u003C/span>(op1.\u003Cspan class=\"hljs-property\">content\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> level2 = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractHeadingLevel\u003C/span>(op2.\u003Cspan class=\"hljs-property\">content\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> text1 = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractHeadingText\u003C/span>(op1.\u003Cspan class=\"hljs-property\">content\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> text2 = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractHeadingText\u003C/span>(op2.\u003Cspan class=\"hljs-property\">content\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (level1 === level2 &amp;&amp; text1 !== text2) {\n                \u003Cspan class=\"hljs-comment\">// Same level, different text - merge with conflict markers\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> mergedHeading = \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${\u003Cspan class=\"hljs-string\">&#x27;#&#x27;\u003C/span>.repeat(level1)}\u003C/span> \u003Cspan class=\"hljs-subst\">${text1}\u003C/span> / \u003Cspan class=\"hljs-subst\">${text2}\u003C/span>\\n`\u003C/span>;\n                \n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                    ...op1,\n                    \u003Cspan class=\"hljs-attr\">content\u003C/span>: mergedHeading,\n                    \u003Cspan class=\"hljs-attr\">metadata\u003C/span>: {\n                        \u003Cspan class=\"hljs-attr\">conflictResolved\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">strategy\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;heading-merge&#x27;\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">originalOperations\u003C/span>: [op1, op2]\n                    }\n                };\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">basicTransform\u003C/span>(op1, op2);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">handleListConflict\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, analysis\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { conflictType, semanticContext } = analysis;\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (conflictType === \u003Cspan class=\"hljs-string\">&#x27;concurrent-insertion&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> item1 = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractListItem\u003C/span>(op1.\u003Cspan class=\"hljs-property\">content\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> item2 = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractListItem\u003C/span>(op2.\u003Cspan class=\"hljs-property\">content\u003C/span>);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (item1 &amp;&amp; item2) {\n                \u003Cspan class=\"hljs-comment\">// Merge list items intelligently\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> mergedItems = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">mergeListItems\u003C/span>([item1, item2]);\n                \n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                    ...op1,\n                    \u003Cspan class=\"hljs-attr\">content\u003C/span>: mergedItems,\n                    \u003Cspan class=\"hljs-attr\">metadata\u003C/span>: {\n                        \u003Cspan class=\"hljs-attr\">conflictResolved\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                        \u003Cspan class=\"hljs-attr\">strategy\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;list-item-merge&#x27;\u003C/span>\n                    }\n                };\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">basicTransform\u003C/span>(op1, op2);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">handleCodeBlockConflict\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, analysis\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { conflictType } = analysis;\n        \n        \u003Cspan class=\"hljs-comment\">// Code blocks require careful handling to preserve syntax\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (conflictType === \u003Cspan class=\"hljs-string\">&#x27;concurrent-insertion&#x27;\u003C/span> || conflictType === \u003Cspan class=\"hljs-string\">&#x27;complex-overlap&#x27;\u003C/span>) {\n            \n            \u003Cspan class=\"hljs-comment\">// Attempt to merge if both operations are adding to the same code block\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">areInSameCodeBlock\u003C/span>(op1, op2, analysis.\u003Cspan class=\"hljs-property\">semanticContext\u003C/span>)) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">mergeCodeBlockOperations\u003C/span>(op1, op2, analysis);\n            }\n            \n            \u003Cspan class=\"hljs-comment\">// For conflicting code changes, prefer the most recent or flag for manual resolution\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                ...op1,\n                \u003Cspan class=\"hljs-attr\">metadata\u003C/span>: {\n                    \u003Cspan class=\"hljs-attr\">conflictRequiresManualResolution\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">conflictType\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;code-block-conflict&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">alternativeOperation\u003C/span>: op2\n                }\n            };\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">basicTransform\u003C/span>(op1, op2);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">handleTableConflict\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, analysis\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { conflictType, semanticContext } = analysis;\n        \n        \u003Cspan class=\"hljs-comment\">// Table conflicts need cell-level resolution\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">areInSameTable\u003C/span>(op1, op2, semanticContext)) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> cellInfo1 = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractTableCellInfo\u003C/span>(op1, semanticContext);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> cellInfo2 = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractTableCellInfo\u003C/span>(op2, semanticContext);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (cellInfo1.\u003Cspan class=\"hljs-property\">row\u003C/span> !== cellInfo2.\u003Cspan class=\"hljs-property\">row\u003C/span> || cellInfo1.\u003Cspan class=\"hljs-property\">column\u003C/span> !== cellInfo2.\u003Cspan class=\"hljs-property\">column\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// Different cells, operations can coexist\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">basicTransform\u003C/span>(op1, op2);\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                \u003Cspan class=\"hljs-comment\">// Same cell, need to merge or choose\u003C/span>\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">resolveCellConflict\u003C/span>(op1, op2, cellInfo1);\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">basicTransform\u003C/span>(op1, op2);\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">semanticTransform\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, analysis\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { semanticContext, userIntentions } = analysis;\n        \n        \u003Cspan class=\"hljs-comment\">// Use semantic understanding to make better transformation decisions\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (userIntentions.\u003Cspan class=\"hljs-property\">op1Intent\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;formatting&#x27;\u003C/span> &amp;&amp; userIntentions.\u003Cspan class=\"hljs-property\">op2Intent\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;content&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-comment\">// Formatting changes typically don&#x27;t conflict with content changes\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">mergeFormattingAndContent\u003C/span>(op1, op2);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (userIntentions.\u003Cspan class=\"hljs-property\">op1Intent\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;structure&#x27;\u003C/span> &amp;&amp; userIntentions.\u003Cspan class=\"hljs-property\">op2Intent\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;structure&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-comment\">// Structural changes need careful coordination\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">mergeStructuralChanges\u003C/span>(op1, op2, semanticContext);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">basicTransform\u003C/span>(op1, op2);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">basicTransform\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Standard operational transform algorithm\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">transformInsertInsert\u003C/span>(op1, op2);\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">transformInsertDelete\u003C/span>(op1, op2);\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">transformDeleteInsert\u003C/span>(op1, op2);\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">transformDeleteDelete\u003C/span>(op1, op2);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> op1;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">transformInsertInsert\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">position\u003C/span> &lt;= op2.\u003Cspan class=\"hljs-property\">position\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> op1;\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                ...op1,\n                \u003Cspan class=\"hljs-attr\">position\u003C/span>: op1.\u003Cspan class=\"hljs-property\">position\u003C/span> + (op2.\u003Cspan class=\"hljs-property\">content\u003C/span>?.\u003Cspan class=\"hljs-property\">length\u003C/span> || \u003Cspan class=\"hljs-number\">0\u003C/span>)\n            };\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">transformInsertDelete\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">position\u003C/span> &lt;= op2.\u003Cspan class=\"hljs-property\">position\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> op1;\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">position\u003C/span> &gt;= op2.\u003Cspan class=\"hljs-property\">position\u003C/span> + op2.\u003Cspan class=\"hljs-property\">length\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                ...op1,\n                \u003Cspan class=\"hljs-attr\">position\u003C/span>: op1.\u003Cspan class=\"hljs-property\">position\u003C/span> - op2.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            };\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                ...op1,\n                \u003Cspan class=\"hljs-attr\">position\u003C/span>: op2.\u003Cspan class=\"hljs-property\">position\u003C/span>\n            };\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">transformDeleteInsert\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">position\u003C/span> &gt;= op2.\u003Cspan class=\"hljs-property\">position\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                ...op1,\n                \u003Cspan class=\"hljs-attr\">position\u003C/span>: op1.\u003Cspan class=\"hljs-property\">position\u003C/span> + (op2.\u003Cspan class=\"hljs-property\">content\u003C/span>?.\u003Cspan class=\"hljs-property\">length\u003C/span> || \u003Cspan class=\"hljs-number\">0\u003C/span>)\n            };\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> op1;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">transformDeleteDelete\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">position\u003C/span> &gt;= op2.\u003Cspan class=\"hljs-property\">position\u003C/span> + op2.\u003Cspan class=\"hljs-property\">length\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                ...op1,\n                \u003Cspan class=\"hljs-attr\">position\u003C/span>: op1.\u003Cspan class=\"hljs-property\">position\u003C/span> - op2.\u003Cspan class=\"hljs-property\">length\u003C/span>\n            };\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">position\u003C/span> + op1.\u003Cspan class=\"hljs-property\">length\u003C/span> &lt;= op2.\u003Cspan class=\"hljs-property\">position\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> op1;\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n            \u003Cspan class=\"hljs-comment\">// Handle overlapping deletes\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> start1 = op1.\u003Cspan class=\"hljs-property\">position\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> end1 = op1.\u003Cspan class=\"hljs-property\">position\u003C/span> + op1.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> start2 = op2.\u003Cspan class=\"hljs-property\">position\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> end2 = op2.\u003Cspan class=\"hljs-property\">position\u003C/span> + op2.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            \n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> overlapStart = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(start1, start2);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> overlapEnd = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">min\u003C/span>(end1, end2);\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> overlapLength = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, overlapEnd - overlapStart);\n            \n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                ...op1,\n                \u003Cspan class=\"hljs-attr\">position\u003C/span>: \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">min\u003C/span>(start1, start2),\n                \u003Cspan class=\"hljs-attr\">length\u003C/span>: \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, op1.\u003Cspan class=\"hljs-property\">length\u003C/span> - overlapLength)\n            };\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">operationsOverlap\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> start1 = op1.\u003Cspan class=\"hljs-property\">position\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> end1 = op1.\u003Cspan class=\"hljs-property\">position\u003C/span> + (op1.\u003Cspan class=\"hljs-property\">length\u003C/span> || op1.\u003Cspan class=\"hljs-property\">content\u003C/span>?.\u003Cspan class=\"hljs-property\">length\u003C/span> || \u003Cspan class=\"hljs-number\">0\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> start2 = op2.\u003Cspan class=\"hljs-property\">position\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> end2 = op2.\u003Cspan class=\"hljs-property\">position\u003C/span> + (op2.\u003Cspan class=\"hljs-property\">length\u003C/span> || op2.\u003Cspan class=\"hljs-property\">content\u003C/span>?.\u003Cspan class=\"hljs-property\">length\u003C/span> || \u003Cspan class=\"hljs-number\">0\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> start1 &lt; end2 &amp;&amp; start2 &lt; end1;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">extractHeadingLevel\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> match = content.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(#+)/\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> match ? match[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span> : \u003Cspan class=\"hljs-number\">1\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">extractHeadingText\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> content.\u003Cspan class=\"hljs-title function_\">replace\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^#+\\s*/\u003C/span>, \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>).\u003Cspan class=\"hljs-title function_\">trim\u003C/span>();\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">extractListItem\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> match = content.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(\\s*)([-*+]|\\d+\\.)\\s*(.+)/\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> match ? {\n            \u003Cspan class=\"hljs-attr\">indent\u003C/span>: match[\u003Cspan class=\"hljs-number\">1\u003C/span>],\n            \u003Cspan class=\"hljs-attr\">marker\u003C/span>: match[\u003Cspan class=\"hljs-number\">2\u003C/span>],\n            \u003Cspan class=\"hljs-attr\">text\u003C/span>: match[\u003Cspan class=\"hljs-number\">3\u003C/span>]\n        } : \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">mergeListItems\u003C/span>(\u003Cspan class=\"hljs-params\">items\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Merge list items intelligently\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> items.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">item\u003C/span> =&gt;\u003C/span> \u003Cspan class=\"hljs-string\">`\u003Cspan class=\"hljs-subst\">${item.indent}\u003C/span>\u003Cspan class=\"hljs-subst\">${item.marker}\u003C/span> \u003Cspan class=\"hljs-subst\">${item.text}\u003C/span>`\u003C/span>).\u003Cspan class=\"hljs-title function_\">join\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">areInSameCodeBlock\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, semanticContext\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Check if operations are within the same code block\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> semanticContext.\u003Cspan class=\"hljs-property\">codeBlocks\u003C/span>?.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">block\u003C/span> =&gt;\u003C/span> \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isPositionInRange\u003C/span>(op1.\u003Cspan class=\"hljs-property\">position\u003C/span>, block.\u003Cspan class=\"hljs-property\">range\u003C/span>) &amp;&amp;\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isPositionInRange\u003C/span>(op2.\u003Cspan class=\"hljs-property\">position\u003C/span>, block.\u003Cspan class=\"hljs-property\">range\u003C/span>)\n        );\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">areInSameTable\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, semanticContext\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Check if operations are within the same table\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> semanticContext.\u003Cspan class=\"hljs-property\">tables\u003C/span>?.\u003Cspan class=\"hljs-title function_\">some\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">table\u003C/span> =&gt;\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isPositionInRange\u003C/span>(op1.\u003Cspan class=\"hljs-property\">position\u003C/span>, table.\u003Cspan class=\"hljs-property\">range\u003C/span>) &amp;&amp;\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">isPositionInRange\u003C/span>(op2.\u003Cspan class=\"hljs-property\">position\u003C/span>, table.\u003Cspan class=\"hljs-property\">range\u003C/span>)\n        );\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">isPositionInRange\u003C/span>(\u003Cspan class=\"hljs-params\">position, range\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> position &gt;= range.\u003Cspan class=\"hljs-property\">start\u003C/span> &amp;&amp; position &lt;= range.\u003Cspan class=\"hljs-property\">end\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">extractSemanticContext\u003C/span>(\u003Cspan class=\"hljs-params\">content, op1, op2\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Extract semantic information about the content around the operations\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">contentAnalyzer\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractSemanticContext\u003C/span>(content, [op1.\u003Cspan class=\"hljs-property\">position\u003C/span>, op2.\u003Cspan class=\"hljs-property\">position\u003C/span>]);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">mergeCodeBlockOperations\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, analysis\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Attempt to merge operations within a code block\u003C/span>\n        \u003Cspan class=\"hljs-comment\">// This is simplified - in practice would need more sophisticated logic\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (op1.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span> &amp;&amp; op2.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-comment\">// Try to merge insertions in a way that preserves code syntax\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n                ...op1,\n                \u003Cspan class=\"hljs-attr\">metadata\u003C/span>: {\n                    \u003Cspan class=\"hljs-attr\">mergedOperation\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">requiresSyntaxCheck\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n                }\n            };\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">basicTransform\u003C/span>(op1, op2);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">extractTableCellInfo\u003C/span>(\u003Cspan class=\"hljs-params\">operation, semanticContext\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Extract which table cell an operation affects\u003C/span>\n        \u003Cspan class=\"hljs-comment\">// This is a placeholder - would need proper table parsing\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">row\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">table\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">resolveCellConflict\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, cellInfo\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Resolve conflicts within the same table cell\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            ...op1,\n            \u003Cspan class=\"hljs-attr\">metadata\u003C/span>: {\n                \u003Cspan class=\"hljs-attr\">cellConflictResolved\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">conflictStrategy\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;last-writer-wins&#x27;\u003C/span> \u003Cspan class=\"hljs-comment\">// or other strategies\u003C/span>\n            }\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">mergeFormattingAndContent\u003C/span>(\u003Cspan class=\"hljs-params\">formattingOp, contentOp\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Merge formatting operation with content operation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">basicTransform\u003C/span>(formattingOp, contentOp);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">mergeStructuralChanges\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, semanticContext\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Handle conflicts between structural changes\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">basicTransform\u003C/span>(op1, op2);\n    }\n}\n\n\u003Cspan class=\"hljs-comment\">// Content analyzer for semantic understanding\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">MarkdownContentAnalyzer\u003C/span> {\n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">analyze\u003C/span>(\u003Cspan class=\"hljs-params\">content, position, length\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> context = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">extractContext\u003C/span>(content, position, length);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">detectContentType\u003C/span>(context),\n            \u003Cspan class=\"hljs-attr\">structure\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyzeStructure\u003C/span>(context),\n            \u003Cspan class=\"hljs-attr\">formatting\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyzeFormatting\u003C/span>(context),\n            \u003Cspan class=\"hljs-attr\">semantics\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyzeSemantics\u003C/span>(context)\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">extractContext\u003C/span>(\u003Cspan class=\"hljs-params\">content, position, length\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> start = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">max\u003C/span>(\u003Cspan class=\"hljs-number\">0\u003C/span>, position - \u003Cspan class=\"hljs-number\">100\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> end = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">min\u003C/span>(content.\u003Cspan class=\"hljs-property\">length\u003C/span>, position + length + \u003Cspan class=\"hljs-number\">100\u003C/span>);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">before\u003C/span>: content.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(start, position),\n            \u003Cspan class=\"hljs-attr\">target\u003C/span>: content.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(position, position + length),\n            \u003Cspan class=\"hljs-attr\">after\u003C/span>: content.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(position + length, end),\n            \u003Cspan class=\"hljs-attr\">full\u003C/span>: content.\u003Cspan class=\"hljs-title function_\">slice\u003C/span>(start, end)\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">detectContentType\u003C/span>(\u003Cspan class=\"hljs-params\">context\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { before, target, after, full } = context;\n        \n        \u003Cspan class=\"hljs-comment\">// Detect if we&#x27;re in a heading\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^#+\\s/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(target) || \u003Cspan class=\"hljs-regexp\">/\\n#+\\s/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(before)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;heading&#x27;\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Detect if we&#x27;re in a list\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^(\\s*)([-*+]|\\d+\\.)\\s/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(target) || \u003Cspan class=\"hljs-regexp\">/\\n(\\s*)([-*+]|\\d+\\.)\\s/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(before)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;list&#x27;\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Detect if we&#x27;re in a code block\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/```/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(before) &amp;&amp; \u003Cspan class=\"hljs-regexp\">/```/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(after)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;code-block&#x27;\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Detect if we&#x27;re in inline code\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/`[^`]*$/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(before) &amp;&amp; \u003Cspan class=\"hljs-regexp\">/^[^`]*`/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(after)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;inline-code&#x27;\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Detect if we&#x27;re in a link\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/\\[([^\\]]*$)/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(before) &amp;&amp; \u003Cspan class=\"hljs-regexp\">/^([^\\]]*)\\]\\([^)]*\\)/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(after)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;link&#x27;\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-comment\">// Detect if we&#x27;re in a table\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/\\|/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(full)) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;text&#x27;\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">analyzeStructure\u003C/span>(\u003Cspan class=\"hljs-params\">context\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Analyze structural elements\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">indentLevel\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">calculateIndentLevel\u003C/span>(context.\u003Cspan class=\"hljs-property\">before\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">blockType\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">identifyBlockType\u003C/span>(context.\u003Cspan class=\"hljs-property\">full\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">nesting\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">analyzeNesting\u003C/span>(context.\u003Cspan class=\"hljs-property\">full\u003C/span>)\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">analyzeFormatting\u003C/span>(\u003Cspan class=\"hljs-params\">context\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Analyze formatting elements\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">bold\u003C/span>: \u003Cspan class=\"hljs-regexp\">/\\*\\*/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(context.\u003Cspan class=\"hljs-property\">full\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">italic\u003C/span>: \u003Cspan class=\"hljs-regexp\">/\\*/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(context.\u003Cspan class=\"hljs-property\">full\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">emphasis\u003C/span>: \u003Cspan class=\"hljs-regexp\">/_/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(context.\u003Cspan class=\"hljs-property\">full\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">strikethrough\u003C/span>: \u003Cspan class=\"hljs-regexp\">/~~/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(context.\u003Cspan class=\"hljs-property\">full\u003C/span>)\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">analyzeSemantics\u003C/span>(\u003Cspan class=\"hljs-params\">context\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Basic semantic analysis\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">purpose\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">inferPurpose\u003C/span>(context.\u003Cspan class=\"hljs-property\">full\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">importance\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">assessImportance\u003C/span>(context.\u003Cspan class=\"hljs-property\">full\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">relationships\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">identifyRelationships\u003C/span>(context.\u003Cspan class=\"hljs-property\">full\u003C/span>)\n        };\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">async\u003C/span> \u003Cspan class=\"hljs-title function_\">extractSemanticContext\u003C/span>(\u003Cspan class=\"hljs-params\">content, positions\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Extract semantic context around multiple positions\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> context = {\n            \u003Cspan class=\"hljs-attr\">headings\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">findHeadings\u003C/span>(content),\n            \u003Cspan class=\"hljs-attr\">lists\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">findLists\u003C/span>(content),\n            \u003Cspan class=\"hljs-attr\">codeBlocks\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">findCodeBlocks\u003C/span>(content),\n            \u003Cspan class=\"hljs-attr\">tables\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">findTables\u003C/span>(content),\n            \u003Cspan class=\"hljs-attr\">links\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">findLinks\u003C/span>(content)\n        };\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> context;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">findHeadings\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> headings = [];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = content.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> match = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(#+)\\s+(.+)/\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (match) {\n                headings.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">level\u003C/span>: match[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">text\u003C/span>: match[\u003Cspan class=\"hljs-number\">2\u003C/span>],\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: index,\n                    \u003Cspan class=\"hljs-attr\">range\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">calculateLineRange\u003C/span>(content, index)\n                });\n            }\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> headings;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">findLists\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Find list structures\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lists = [];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = content.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> currentList = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> match = line.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/^(\\s*)([-*+]|\\d+\\.)\\s+(.+)/\u003C/span>);\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (match) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> indent = match[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span>;\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!currentList || currentList.\u003Cspan class=\"hljs-property\">indent\u003C/span> !== indent) {\n                    \u003Cspan class=\"hljs-keyword\">if\u003C/span> (currentList) {\n                        lists.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(currentList);\n                    }\n                    currentList = {\n                        \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-regexp\">/\\d+\\./\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(match[\u003Cspan class=\"hljs-number\">2\u003C/span>]) ? \u003Cspan class=\"hljs-string\">&#x27;ordered&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;unordered&#x27;\u003C/span>,\n                        indent,\n                        \u003Cspan class=\"hljs-attr\">items\u003C/span>: [],\n                        \u003Cspan class=\"hljs-attr\">startLine\u003C/span>: index,\n                        \u003Cspan class=\"hljs-attr\">range\u003C/span>: { \u003Cspan class=\"hljs-attr\">start\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">calculateLineRange\u003C/span>(content, index).\u003Cspan class=\"hljs-property\">start\u003C/span>, \u003Cspan class=\"hljs-attr\">end\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span> }\n                    };\n                }\n                \n                currentList.\u003Cspan class=\"hljs-property\">items\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                    \u003Cspan class=\"hljs-attr\">text\u003C/span>: match[\u003Cspan class=\"hljs-number\">3\u003C/span>],\n                    \u003Cspan class=\"hljs-attr\">line\u003C/span>: index\n                });\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (currentList &amp;&amp; line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() === \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// Continue current list\u003C/span>\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (currentList) {\n                \u003Cspan class=\"hljs-comment\">// End current list\u003C/span>\n                currentList.\u003Cspan class=\"hljs-property\">range\u003C/span>.\u003Cspan class=\"hljs-property\">end\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">calculateLineRange\u003C/span>(content, index - \u003Cspan class=\"hljs-number\">1\u003C/span>).\u003Cspan class=\"hljs-property\">end\u003C/span>;\n                lists.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(currentList);\n                currentList = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n            }\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (currentList) {\n            currentList.\u003Cspan class=\"hljs-property\">range\u003C/span>.\u003Cspan class=\"hljs-property\">end\u003C/span> = content.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            lists.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(currentList);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> lists;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">findCodeBlocks\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> codeBlocks = [];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = content.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> inCodeBlock = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> currentBlock = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-title function_\">startsWith\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>)) {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!inCodeBlock) {\n                    \u003Cspan class=\"hljs-comment\">// Start of code block\u003C/span>\n                    inCodeBlock = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                    currentBlock = {\n                        \u003Cspan class=\"hljs-attr\">language\u003C/span>: line.\u003Cspan class=\"hljs-title function_\">substring\u003C/span>(\u003Cspan class=\"hljs-number\">3\u003C/span>).\u003Cspan class=\"hljs-title function_\">trim\u003C/span>(),\n                        \u003Cspan class=\"hljs-attr\">startLine\u003C/span>: index,\n                        \u003Cspan class=\"hljs-attr\">range\u003C/span>: { \u003Cspan class=\"hljs-attr\">start\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">calculateLineRange\u003C/span>(content, index).\u003Cspan class=\"hljs-property\">start\u003C/span>, \u003Cspan class=\"hljs-attr\">end\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span> },\n                        \u003Cspan class=\"hljs-attr\">content\u003C/span>: []\n                    };\n                } \u003Cspan class=\"hljs-keyword\">else\u003C/span> {\n                    \u003Cspan class=\"hljs-comment\">// End of code block\u003C/span>\n                    inCodeBlock = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                    currentBlock.\u003Cspan class=\"hljs-property\">range\u003C/span>.\u003Cspan class=\"hljs-property\">end\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">calculateLineRange\u003C/span>(content, index).\u003Cspan class=\"hljs-property\">end\u003C/span>;\n                    codeBlocks.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(currentBlock);\n                    currentBlock = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n                }\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inCodeBlock) {\n                currentBlock.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(line);\n            }\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> codeBlocks;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">findTables\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Simple table detection\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> tables = [];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = content.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> inTable = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> currentTable = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n        \n        lines.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">line, index\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (line.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>) &amp;&amp; line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() !== \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!inTable) {\n                    inTable = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n                    currentTable = {\n                        \u003Cspan class=\"hljs-attr\">startLine\u003C/span>: index,\n                        \u003Cspan class=\"hljs-attr\">range\u003C/span>: { \u003Cspan class=\"hljs-attr\">start\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">calculateLineRange\u003C/span>(content, index).\u003Cspan class=\"hljs-property\">start\u003C/span>, \u003Cspan class=\"hljs-attr\">end\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span> },\n                        \u003Cspan class=\"hljs-attr\">rows\u003C/span>: []\n                    };\n                }\n                currentTable.\u003Cspan class=\"hljs-property\">rows\u003C/span>.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>());\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inTable &amp;&amp; line.\u003Cspan class=\"hljs-title function_\">trim\u003C/span>() === \u003Cspan class=\"hljs-string\">&#x27;&#x27;\u003C/span>) {\n                \u003Cspan class=\"hljs-comment\">// Continue table (empty line)\u003C/span>\n            } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (inTable) {\n                \u003Cspan class=\"hljs-comment\">// End table\u003C/span>\n                inTable = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n                currentTable.\u003Cspan class=\"hljs-property\">range\u003C/span>.\u003Cspan class=\"hljs-property\">end\u003C/span> = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">calculateLineRange\u003C/span>(content, index - \u003Cspan class=\"hljs-number\">1\u003C/span>).\u003Cspan class=\"hljs-property\">end\u003C/span>;\n                tables.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(currentTable);\n                currentTable = \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n            }\n        });\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (currentTable) {\n            currentTable.\u003Cspan class=\"hljs-property\">range\u003C/span>.\u003Cspan class=\"hljs-property\">end\u003C/span> = content.\u003Cspan class=\"hljs-property\">length\u003C/span>;\n            tables.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(currentTable);\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> tables;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">findLinks\u003C/span>(\u003Cspan class=\"hljs-params\">content\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> links = [];\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> linkPattern = \u003Cspan class=\"hljs-regexp\">/\\[([^\\]]+)\\]\\(([^)]+)\\)/g\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n        \n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = linkPattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(content)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n            links.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">text\u003C/span>: match[\u003Cspan class=\"hljs-number\">1\u003C/span>],\n                \u003Cspan class=\"hljs-attr\">url\u003C/span>: match[\u003Cspan class=\"hljs-number\">2\u003C/span>],\n                \u003Cspan class=\"hljs-attr\">position\u003C/span>: match.\u003Cspan class=\"hljs-property\">index\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">length\u003C/span>: match[\u003Cspan class=\"hljs-number\">0\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span>\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> links;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">calculateLineRange\u003C/span>(\u003Cspan class=\"hljs-params\">content, lineIndex\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> lines = content.\u003Cspan class=\"hljs-title function_\">split\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;\\n&#x27;\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> start = \u003Cspan class=\"hljs-number\">0\u003C/span>;\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> i = \u003Cspan class=\"hljs-number\">0\u003C/span>; i &lt; lineIndex; i++) {\n            start += lines[i].\u003Cspan class=\"hljs-property\">length\u003C/span> + \u003Cspan class=\"hljs-number\">1\u003C/span>; \u003Cspan class=\"hljs-comment\">// +1 for newline\u003C/span>\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            start,\n            \u003Cspan class=\"hljs-attr\">end\u003C/span>: start + (lines[lineIndex] ? lines[lineIndex].\u003Cspan class=\"hljs-property\">length\u003C/span> : \u003Cspan class=\"hljs-number\">0\u003C/span>)\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">calculateIndentLevel\u003C/span>(\u003Cspan class=\"hljs-params\">text\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> match = text.\u003Cspan class=\"hljs-title function_\">match\u003C/span>(\u003Cspan class=\"hljs-regexp\">/\\n(\\s*)$/\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> match ? match[\u003Cspan class=\"hljs-number\">1\u003C/span>].\u003Cspan class=\"hljs-property\">length\u003C/span> : \u003Cspan class=\"hljs-number\">0\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">identifyBlockType\u003C/span>(\u003Cspan class=\"hljs-params\">text\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Simple block type identification\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (text.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;code-block&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (text.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;|&#x27;\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;table&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^\\s*[-*+]\\s/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(text)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;list&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^\\s*\\d+\\.\\s/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(text)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;ordered-list&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^#+\\s/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(text)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;heading&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;paragraph&#x27;\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">analyzeNesting\u003C/span>(\u003Cspan class=\"hljs-params\">text\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Analyze nesting level and structure\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">level\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">calculateIndentLevel\u003C/span>(text),\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;flat&#x27;\u003C/span> \u003Cspan class=\"hljs-comment\">// simplified\u003C/span>\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">inferPurpose\u003C/span>(\u003Cspan class=\"hljs-params\">text\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Simple purpose inference\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (text.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;TODO&#x27;\u003C/span>) || text.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;FIXME&#x27;\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;task&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (text.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;```&#x27;\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;code-example&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (text.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;http&#x27;\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;reference&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;content&#x27;\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">assessImportance\u003C/span>(\u003Cspan class=\"hljs-params\">text\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Simple importance assessment\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^#+\\s/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(text)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/\\*\\*/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(text)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;normal&#x27;\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">identifyRelationships\u003C/span>(\u003Cspan class=\"hljs-params\">text\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Identify relationships with other content\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">references\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">findReferences\u003C/span>(text),\n            \u003Cspan class=\"hljs-attr\">dependencies\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">findDependencies\u003C/span>(text)\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">findReferences\u003C/span>(\u003Cspan class=\"hljs-params\">text\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Find references to other sections, files, etc.\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> references = [];\n        \n        \u003Cspan class=\"hljs-comment\">// Look for internal links\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> internalLinkPattern = \u003Cspan class=\"hljs-regexp\">/\\[([^\\]]+)\\]\\(#([^)]+)\\)/g\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">let\u003C/span> match;\n        \u003Cspan class=\"hljs-keyword\">while\u003C/span> ((match = internalLinkPattern.\u003Cspan class=\"hljs-title function_\">exec\u003C/span>(text)) !== \u003Cspan class=\"hljs-literal\">null\u003C/span>) {\n            references.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;internal&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">target\u003C/span>: match[\u003Cspan class=\"hljs-number\">2\u003C/span>],\n                \u003Cspan class=\"hljs-attr\">text\u003C/span>: match[\u003Cspan class=\"hljs-number\">1\u003C/span>]\n            });\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> references;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">findDependencies\u003C/span>(\u003Cspan class=\"hljs-params\">text\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Find content that this depends on\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> []; \u003Cspan class=\"hljs-comment\">// Simplified\u003C/span>\n    }\n}\n\n\u003Cspan class=\"hljs-comment\">// Intention tracker for understanding user goals\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">IntentionTracker\u003C/span> {\n    \u003Cspan class=\"hljs-title function_\">analyzeIntentions\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, context\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">op1Intent\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">classifyIntent\u003C/span>(op1, context),\n            \u003Cspan class=\"hljs-attr\">op2Intent\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">classifyIntent\u003C/span>(op2, context),\n            \u003Cspan class=\"hljs-attr\">conflictLikelihood\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">assessConflictLikelihood\u003C/span>(op1, op2),\n            \u003Cspan class=\"hljs-attr\">userGoals\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">inferUserGoals\u003C/span>(op1, op2, context)\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">classifyIntent\u003C/span>(\u003Cspan class=\"hljs-params\">operation, context\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Classify the intention behind an operation\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (operation.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;insert&#x27;\u003C/span> &amp;&amp; operation.\u003Cspan class=\"hljs-property\">content\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/^#+\\s/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(operation.\u003Cspan class=\"hljs-property\">content\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;structure&#x27;\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/\\*\\*/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(operation.\u003Cspan class=\"hljs-property\">content\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;formatting&#x27;\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-regexp\">/```/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(operation.\u003Cspan class=\"hljs-property\">content\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;code-example&#x27;\u003C/span>;\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;content&#x27;\u003C/span>;\n        } \u003Cspan class=\"hljs-keyword\">else\u003C/span> \u003Cspan class=\"hljs-keyword\">if\u003C/span> (operation.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;editing&#x27;\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;unknown&#x27;\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">assessConflictLikelihood\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Assess how likely the operations are to conflict\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">abs\u003C/span>(op1.\u003Cspan class=\"hljs-property\">position\u003C/span> - op2.\u003Cspan class=\"hljs-property\">position\u003C/span>) &lt; \u003Cspan class=\"hljs-number\">10\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (\u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">abs\u003C/span>(op1.\u003Cspan class=\"hljs-property\">position\u003C/span> - op2.\u003Cspan class=\"hljs-property\">position\u003C/span>) &lt; \u003Cspan class=\"hljs-number\">100\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;low&#x27;\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">inferUserGoals\u003C/span>(\u003Cspan class=\"hljs-params\">op1, op2, context\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Infer what users are trying to accomplish\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">op1Goal\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">inferGoal\u003C/span>(op1, context),\n            \u003Cspan class=\"hljs-attr\">op2Goal\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">inferGoal\u003C/span>(op2, context)\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">inferGoal\u003C/span>(\u003Cspan class=\"hljs-params\">operation, context\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Simple goal inference\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (operation.\u003Cspan class=\"hljs-property\">content\u003C/span> &amp;&amp; operation.\u003Cspan class=\"hljs-property\">content\u003C/span>.\u003Cspan class=\"hljs-title function_\">includes\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;TODO&#x27;\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;task-management&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (operation.\u003Cspan class=\"hljs-property\">content\u003C/span> &amp;&amp; \u003Cspan class=\"hljs-regexp\">/^#+\\s/\u003C/span>.\u003Cspan class=\"hljs-title function_\">test\u003C/span>(operation.\u003Cspan class=\"hljs-property\">content\u003C/span>)) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;organization&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (operation.\u003Cspan class=\"hljs-property\">type\u003C/span> === \u003Cspan class=\"hljs-string\">&#x27;delete&#x27;\u003C/span>) \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;cleanup&#x27;\u003C/span>;\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-string\">&#x27;content-creation&#x27;\u003C/span>;\n    }\n}\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = { \u003Cspan class=\"hljs-title class_\">AdvancedOperationalTransform\u003C/span>, \u003Cspan class=\"hljs-title class_\">MarkdownContentAnalyzer\u003C/span>, \u003Cspan class=\"hljs-title class_\">IntentionTracker\u003C/span> };\n\u003C/code>\u003C/pre>\u003Ch2 id=\"integration-with-modern-development-workflows\">Integration with Modern Development Workflows\u003C/h2>\n\u003Cp>Collaborative Markdown editing integrates seamlessly with comprehensive documentation ecosystems. When combined with \u003Ca href=\"/blog/markdown-workflow-automation-and-productivity-complete-guide\">automated workflow systems and content generation\u003C/a>, real-time collaboration enables teams to work simultaneously on automated content pipelines while maintaining synchronized editing experiences across complex documentation projects.\u003C/p>\n\u003Cp>For sophisticated team management, collaborative editing works effectively with \u003Ca href=\"/blog/markdown-version-control-git-integration-complete-guide\">version control and Git integration systems\u003C/a> by providing real-time editing capabilities that complement traditional version control workflows, enabling teams to collaborate in real-time while maintaining comprehensive change history and branch management.\u003C/p>\n\u003Cp>When building scalable documentation platforms, collaborative editing complements \u003Ca href=\"/blog/markdown-dynamic-content-generation-complete-guide\">dynamic content generation systems\u003C/a> by allowing teams to collaboratively edit templates, data sources, and generated content simultaneously, creating dynamic workflows where content generation and human collaboration work together seamlessly.\u003C/p>\n\u003Ch2 id=\"advanced-collaboration-features\">Advanced Collaboration Features\u003C/h2>\n\u003Ch3 id=\"user-presence-and-awareness\">User Presence and Awareness\u003C/h3>\n\u003Cp>Implementing sophisticated user presence systems for enhanced collaboration:\u003C/p>\n\u003Cpre>\u003Ccode class=\"hljs language-javascript\">\u003Cspan class=\"hljs-comment\">// collaborative-presence-system.js - Advanced user presence and awareness\u003C/span>\n\u003Cspan class=\"hljs-keyword\">class\u003C/span> \u003Cspan class=\"hljs-title class_\">CollaborativePresenceSystem\u003C/span> {\n    \u003Cspan class=\"hljs-title function_\">constructor\u003C/span>(\u003Cspan class=\"hljs-params\">collaborativeEngine\u003C/span>) {\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">engine\u003C/span> = collaborativeEngine;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>(); \u003Cspan class=\"hljs-comment\">// userId -&gt; PresenceInfo\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">awarenessFeatures\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">activityTrackers\u003C/span> = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">setupPresenceFeatures\u003C/span>();\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">setupAwarenessTracking\u003C/span>();\n        \n        \u003Cspan class=\"hljs-comment\">// Listen to engine events\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">engine\u003C/span>.\u003Cspan class=\"hljs-title function_\">on\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;user-joined&#x27;\u003C/span>, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">data\u003C/span>) =&gt;\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleUserJoined\u003C/span>(data));\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">engine\u003C/span>.\u003Cspan class=\"hljs-title function_\">on\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;user-left&#x27;\u003C/span>, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">data\u003C/span>) =&gt;\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleUserLeft\u003C/span>(data));\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">engine\u003C/span>.\u003Cspan class=\"hljs-title function_\">on\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;document-changed&#x27;\u003C/span>, \u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">data\u003C/span>) =&gt;\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">handleDocumentChanged\u003C/span>(data));\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">setupPresenceFeatures\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Real-time cursor tracking\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">awarenessFeatures\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;cursors&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">enabled\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">updateInterval\u003C/span>: \u003Cspan class=\"hljs-number\">100\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">showCursorLabels\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">showTypingIndicator\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Selection highlighting\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">awarenessFeatures\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;selections&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">enabled\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">highlightColor\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">showSelectionUser\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">fadeTimeout\u003C/span>: \u003Cspan class=\"hljs-number\">3000\u003C/span>\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Activity indicators\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">awarenessFeatures\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;activity&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">enabled\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">showActiveUsers\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">showLastActivity\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">idleTimeout\u003C/span>: \u003Cspan class=\"hljs-number\">300000\u003C/span> \u003Cspan class=\"hljs-comment\">// 5 minutes\u003C/span>\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Focus tracking\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">awarenessFeatures\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;focus&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">enabled\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">showFocusedSection\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">highlightActiveSection\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Typing awareness\u003C/span>\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">awarenessFeatures\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;typing&#x27;\u003C/span>, {\n            \u003Cspan class=\"hljs-attr\">enabled\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">showTypingUsers\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">typingTimeout\u003C/span>: \u003Cspan class=\"hljs-number\">2000\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">showTypingLocation\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">setupAwarenessTracking\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Set up periodic presence updates\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">setInterval\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">updatePresenceData\u003C/span>();\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">cleanupIdleUsers\u003C/span>();\n        }, \u003Cspan class=\"hljs-number\">5000\u003C/span>);\n        \n        \u003Cspan class=\"hljs-comment\">// Set up typing indicator cleanup\u003C/span>\n        \u003Cspan class=\"hljs-built_in\">setInterval\u003C/span>(\u003Cspan class=\"hljs-function\">() =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">cleanupTypingIndicators\u003C/span>();\n        }, \u003Cspan class=\"hljs-number\">1000\u003C/span>);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleUserJoined\u003C/span>(\u003Cspan class=\"hljs-params\">data\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { documentId, userId, userInfo } = data;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(userId, {\n            userId,\n            userInfo,\n            documentId,\n            \u003Cspan class=\"hljs-attr\">joinedAt\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">lastActivity\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>(),\n            \u003Cspan class=\"hljs-attr\">cursor\u003C/span>: { \u003Cspan class=\"hljs-attr\">line\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span>, \u003Cspan class=\"hljs-attr\">column\u003C/span>: \u003Cspan class=\"hljs-number\">0\u003C/span> },\n            \u003Cspan class=\"hljs-attr\">selection\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">isTyping\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">typingAt\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">focusedSection\u003C/span>: \u003Cspan class=\"hljs-literal\">null\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">isActive\u003C/span>: \u003Cspan class=\"hljs-literal\">true\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">isIdle\u003C/span>: \u003Cspan class=\"hljs-literal\">false\u003C/span>\n        });\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastPresenceUpdate\u003C/span>(documentId);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleUserLeft\u003C/span>(\u003Cspan class=\"hljs-params\">data\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { userId } = data;\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">delete\u003C/span>(userId);\n        \n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (data.\u003Cspan class=\"hljs-property\">documentId\u003C/span>) {\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastPresenceUpdate\u003C/span>(data.\u003Cspan class=\"hljs-property\">documentId\u003C/span>);\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">handleDocumentChanged\u003C/span>(\u003Cspan class=\"hljs-params\">data\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> { documentId, author } = data;\n        \n        \u003Cspan class=\"hljs-comment\">// Update author&#x27;s activity\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> presence = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(author);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (presence) {\n            presence.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span> = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n            presence.\u003Cspan class=\"hljs-property\">isActive\u003C/span> = \u003Cspan class=\"hljs-literal\">true\u003C/span>;\n            presence.\u003Cspan class=\"hljs-property\">isIdle\u003C/span> = \u003Cspan class=\"hljs-literal\">false\u003C/span>;\n        }\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastPresenceUpdate\u003C/span>(documentId);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">updateCursor\u003C/span>(\u003Cspan class=\"hljs-params\">userId, documentId, cursor\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> presence = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(userId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (presence &amp;&amp; presence.\u003Cspan class=\"hljs-property\">documentId\u003C/span> === documentId) {\n            presence.\u003Cspan class=\"hljs-property\">cursor\u003C/span> = cursor;\n            presence.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span> = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n            \n            \u003Cspan class=\"hljs-comment\">// Broadcast cursor update\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">engine\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(documentId, {\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;presence-update&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">subtype\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;cursor&#x27;\u003C/span>,\n                userId,\n                cursor,\n                \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n            }, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getConnectionId\u003C/span>(userId));\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">updateSelection\u003C/span>(\u003Cspan class=\"hljs-params\">userId, documentId, selection\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> presence = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(userId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (presence &amp;&amp; presence.\u003Cspan class=\"hljs-property\">documentId\u003C/span> === documentId) {\n            presence.\u003Cspan class=\"hljs-property\">selection\u003C/span> = selection;\n            presence.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span> = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n            \n            \u003Cspan class=\"hljs-comment\">// Broadcast selection update\u003C/span>\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">engine\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(documentId, {\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;presence-update&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">subtype\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;selection&#x27;\u003C/span>,\n                userId,\n                selection,\n                \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: presence.\u003Cspan class=\"hljs-property\">userInfo\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n            }, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getConnectionId\u003C/span>(userId));\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">updateTypingStatus\u003C/span>(\u003Cspan class=\"hljs-params\">userId, documentId, isTyping, position = \u003Cspan class=\"hljs-literal\">null\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> presence = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(userId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (presence &amp;&amp; presence.\u003Cspan class=\"hljs-property\">documentId\u003C/span> === documentId) {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> wasTyping = presence.\u003Cspan class=\"hljs-property\">isTyping\u003C/span>;\n            presence.\u003Cspan class=\"hljs-property\">isTyping\u003C/span> = isTyping;\n            presence.\u003Cspan class=\"hljs-property\">typingAt\u003C/span> = isTyping ? (position || presence.\u003Cspan class=\"hljs-property\">cursor\u003C/span>) : \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n            presence.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span> = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n            \n            \u003Cspan class=\"hljs-comment\">// Only broadcast if typing status changed\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (wasTyping !== isTyping) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">engine\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(documentId, {\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;presence-update&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">subtype\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;typing&#x27;\u003C/span>,\n                    userId,\n                    isTyping,\n                    \u003Cspan class=\"hljs-attr\">typingAt\u003C/span>: presence.\u003Cspan class=\"hljs-property\">typingAt\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: presence.\u003Cspan class=\"hljs-property\">userInfo\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n                }, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getConnectionId\u003C/span>(userId));\n            }\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">updateFocusedSection\u003C/span>(\u003Cspan class=\"hljs-params\">userId, documentId, section\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> presence = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(userId);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (presence &amp;&amp; presence.\u003Cspan class=\"hljs-property\">documentId\u003C/span> === documentId) {\n            presence.\u003Cspan class=\"hljs-property\">focusedSection\u003C/span> = section;\n            presence.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span> = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n            \n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">engine\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(documentId, {\n                \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;presence-update&#x27;\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">subtype\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;focus&#x27;\u003C/span>,\n                userId,\n                \u003Cspan class=\"hljs-attr\">focusedSection\u003C/span>: section,\n                \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: presence.\u003Cspan class=\"hljs-property\">userInfo\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n            }, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getConnectionId\u003C/span>(userId));\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">updatePresenceData\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> now = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">presence, userId\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> timeSinceActivity = now - presence.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span>;\n            \n            \u003Cspan class=\"hljs-comment\">// Update idle status\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> wasIdle = presence.\u003Cspan class=\"hljs-property\">isIdle\u003C/span>;\n            presence.\u003Cspan class=\"hljs-property\">isIdle\u003C/span> = timeSinceActivity &gt; \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">awarenessFeatures\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;activity&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">idleTimeout\u003C/span>;\n            \n            \u003Cspan class=\"hljs-comment\">// Update active status\u003C/span>\n            presence.\u003Cspan class=\"hljs-property\">isActive\u003C/span> = timeSinceActivity &lt; \u003Cspan class=\"hljs-number\">60000\u003C/span>; \u003Cspan class=\"hljs-comment\">// Active within 1 minute\u003C/span>\n            \n            \u003Cspan class=\"hljs-comment\">// Broadcast if idle status changed\u003C/span>\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (wasIdle !== presence.\u003Cspan class=\"hljs-property\">isIdle\u003C/span>) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">engine\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(presence.\u003Cspan class=\"hljs-property\">documentId\u003C/span>, {\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;presence-update&#x27;\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">subtype\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;idle&#x27;\u003C/span>,\n                    userId,\n                    \u003Cspan class=\"hljs-attr\">isIdle\u003C/span>: presence.\u003Cspan class=\"hljs-property\">isIdle\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: presence.\u003Cspan class=\"hljs-property\">userInfo\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: now\n                }, \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">getConnectionId\u003C/span>(userId));\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">cleanupIdleUsers\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> now = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> maxIdleTime = \u003Cspan class=\"hljs-number\">3600000\u003C/span>; \u003Cspan class=\"hljs-comment\">// 1 hour\u003C/span>\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> idleUsers = [];\n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">presence, userId\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (now - presence.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span> &gt; maxIdleTime) {\n                idleUsers.\u003Cspan class=\"hljs-title function_\">push\u003C/span>(userId);\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Remove idle users\u003C/span>\n        idleUsers.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">userId\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">const\u003C/span> presence = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(userId);\n            \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">delete\u003C/span>(userId);\n            \n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (presence) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">engine\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(presence.\u003Cspan class=\"hljs-property\">documentId\u003C/span>, {\n                    \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;user-idle-removed&#x27;\u003C/span>,\n                    userId,\n                    \u003Cspan class=\"hljs-attr\">reason\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;idle-timeout&#x27;\u003C/span>\n                });\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">cleanupTypingIndicators\u003C/span>(\u003Cspan class=\"hljs-params\">\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> now = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> typingTimeout = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">awarenessFeatures\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(\u003Cspan class=\"hljs-string\">&#x27;typing&#x27;\u003C/span>).\u003Cspan class=\"hljs-property\">typingTimeout\u003C/span>;\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">presence, userId\u003C/span>) =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (presence.\u003Cspan class=\"hljs-property\">isTyping\u003C/span> &amp;&amp; presence.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span> &lt; now - typingTimeout) {\n                \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">updateTypingStatus\u003C/span>(userId, presence.\u003Cspan class=\"hljs-property\">documentId\u003C/span>, \u003Cspan class=\"hljs-literal\">false\u003C/span>);\n            }\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">broadcastPresenceUpdate\u003C/span>(\u003Cspan class=\"hljs-params\">documentId\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> documentUsers = \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>())\n            .\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">p\u003C/span> =&gt;\u003C/span> p.\u003Cspan class=\"hljs-property\">documentId\u003C/span> === documentId);\n        \n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> presenceSummary = {\n            \u003Cspan class=\"hljs-attr\">totalUsers\u003C/span>: documentUsers.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">activeUsers\u003C/span>: documentUsers.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">p\u003C/span> =&gt;\u003C/span> p.\u003Cspan class=\"hljs-property\">isActive\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">typingUsers\u003C/span>: documentUsers.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">p\u003C/span> =&gt;\u003C/span> p.\u003Cspan class=\"hljs-property\">isTyping\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">users\u003C/span>: documentUsers.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">p\u003C/span> =&gt;\u003C/span> ({\n                \u003Cspan class=\"hljs-attr\">userId\u003C/span>: p.\u003Cspan class=\"hljs-property\">userId\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: p.\u003Cspan class=\"hljs-property\">userInfo\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">cursor\u003C/span>: p.\u003Cspan class=\"hljs-property\">cursor\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">selection\u003C/span>: p.\u003Cspan class=\"hljs-property\">selection\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">isTyping\u003C/span>: p.\u003Cspan class=\"hljs-property\">isTyping\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">typingAt\u003C/span>: p.\u003Cspan class=\"hljs-property\">typingAt\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">focusedSection\u003C/span>: p.\u003Cspan class=\"hljs-property\">focusedSection\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">isActive\u003C/span>: p.\u003Cspan class=\"hljs-property\">isActive\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">isIdle\u003C/span>: p.\u003Cspan class=\"hljs-property\">isIdle\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">lastActivity\u003C/span>: p.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span>\n            }))\n        };\n        \n        \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">engine\u003C/span>.\u003Cspan class=\"hljs-title function_\">broadcastToDocument\u003C/span>(documentId, {\n            \u003Cspan class=\"hljs-attr\">type\u003C/span>: \u003Cspan class=\"hljs-string\">&#x27;presence-summary&#x27;\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">presence\u003C/span>: presenceSummary,\n            \u003Cspan class=\"hljs-attr\">timestamp\u003C/span>: \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>()\n        });\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getConnectionId\u003C/span>(\u003Cspan class=\"hljs-params\">userId\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Helper to get connection ID from user ID\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">const\u003C/span> [connectionId, connection] \u003Cspan class=\"hljs-keyword\">of\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">engine\u003C/span>.\u003Cspan class=\"hljs-property\">connections\u003C/span>) {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (connection.\u003Cspan class=\"hljs-property\">userId\u003C/span> === userId) {\n                \u003Cspan class=\"hljs-keyword\">return\u003C/span> connectionId;\n            }\n        }\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateUserAwarenessData\u003C/span>(\u003Cspan class=\"hljs-params\">documentId\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> documentUsers = \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>())\n            .\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">p\u003C/span> =&gt;\u003C/span> p.\u003Cspan class=\"hljs-property\">documentId\u003C/span> === documentId);\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">activeUsers\u003C/span>: documentUsers.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">p\u003C/span> =&gt;\u003C/span> p.\u003Cspan class=\"hljs-property\">isActive\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">typingUsers\u003C/span>: documentUsers.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">p\u003C/span> =&gt;\u003C/span> p.\u003Cspan class=\"hljs-property\">isTyping\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">idleUsers\u003C/span>: documentUsers.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">p\u003C/span> =&gt;\u003C/span> p.\u003Cspan class=\"hljs-property\">isIdle\u003C/span>),\n            \u003Cspan class=\"hljs-attr\">cursorPositions\u003C/span>: documentUsers.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">p\u003C/span> =&gt;\u003C/span> ({\n                \u003Cspan class=\"hljs-attr\">userId\u003C/span>: p.\u003Cspan class=\"hljs-property\">userId\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: p.\u003Cspan class=\"hljs-property\">userInfo\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">cursor\u003C/span>: p.\u003Cspan class=\"hljs-property\">cursor\u003C/span>,\n                \u003Cspan class=\"hljs-attr\">selection\u003C/span>: p.\u003Cspan class=\"hljs-property\">selection\u003C/span>\n            })),\n            \u003Cspan class=\"hljs-attr\">focusAreas\u003C/span>: documentUsers\n                .\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">p\u003C/span> =&gt;\u003C/span> p.\u003Cspan class=\"hljs-property\">focusedSection\u003C/span>)\n                .\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">p\u003C/span> =&gt;\u003C/span> ({\n                    \u003Cspan class=\"hljs-attr\">userId\u003C/span>: p.\u003Cspan class=\"hljs-property\">userId\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: p.\u003Cspan class=\"hljs-property\">userInfo\u003C/span>,\n                    \u003Cspan class=\"hljs-attr\">section\u003C/span>: p.\u003Cspan class=\"hljs-property\">focusedSection\u003C/span>\n                })),\n            \u003Cspan class=\"hljs-attr\">collaborationMetrics\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">generateCollaborationMetrics\u003C/span>(documentUsers)\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">generateCollaborationMetrics\u003C/span>(\u003Cspan class=\"hljs-params\">users\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> now = \u003Cspan class=\"hljs-title class_\">Date\u003C/span>.\u003Cspan class=\"hljs-title function_\">now\u003C/span>();\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> {\n            \u003Cspan class=\"hljs-attr\">totalCollaborators\u003C/span>: users.\u003Cspan class=\"hljs-property\">length\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">currentlyActive\u003C/span>: users.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">u\u003C/span> =&gt;\u003C/span> u.\u003Cspan class=\"hljs-property\">isActive\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">currentlyTyping\u003C/span>: users.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">u\u003C/span> =&gt;\u003C/span> u.\u003Cspan class=\"hljs-property\">isTyping\u003C/span>).\u003Cspan class=\"hljs-property\">length\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">averageSessionDuration\u003C/span>: users.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">0\u003C/span> ? \n                users.\u003Cspan class=\"hljs-title function_\">reduce\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">sum, u\u003C/span>) =&gt;\u003C/span> sum + (now - u.\u003Cspan class=\"hljs-property\">joinedAt\u003C/span>), \u003Cspan class=\"hljs-number\">0\u003C/span>) / users.\u003Cspan class=\"hljs-property\">length\u003C/span> : \u003Cspan class=\"hljs-number\">0\u003C/span>,\n            \u003Cspan class=\"hljs-attr\">mostActiveUser\u003C/span>: users.\u003Cspan class=\"hljs-title function_\">reduce\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">most, current\u003C/span>) =&gt;\u003C/span> \n                !most || (now - current.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span>) &lt; (now - most.\u003Cspan class=\"hljs-property\">lastActivity\u003C/span>) ? current : most, \u003Cspan class=\"hljs-literal\">null\u003C/span>\n            ),\n            \u003Cspan class=\"hljs-attr\">collaborationHotspots\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">identifyCollaborationHotspots\u003C/span>(users),\n            \u003Cspan class=\"hljs-attr\">concurrentEditing\u003C/span>: \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-title function_\">detectConcurrentEditing\u003C/span>(users)\n        };\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">identifyCollaborationHotspots\u003C/span>(\u003Cspan class=\"hljs-params\">users\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Identify areas where multiple users are working\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> hotspots = \u003Cspan class=\"hljs-keyword\">new\u003C/span> \u003Cspan class=\"hljs-title class_\">Map\u003C/span>();\n        \n        users.\u003Cspan class=\"hljs-title function_\">forEach\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">user\u003C/span> =&gt;\u003C/span> {\n            \u003Cspan class=\"hljs-keyword\">if\u003C/span> (user.\u003Cspan class=\"hljs-property\">cursor\u003C/span>) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> line = user.\u003Cspan class=\"hljs-property\">cursor\u003C/span>.\u003Cspan class=\"hljs-property\">line\u003C/span>;\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> region = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">floor\u003C/span>(line / \u003Cspan class=\"hljs-number\">10\u003C/span>) * \u003Cspan class=\"hljs-number\">10\u003C/span>; \u003Cspan class=\"hljs-comment\">// Group by 10-line regions\u003C/span>\n                \n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (!hotspots.\u003Cspan class=\"hljs-title function_\">has\u003C/span>(region)) {\n                    hotspots.\u003Cspan class=\"hljs-title function_\">set\u003C/span>(region, []);\n                }\n                hotspots.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(region).\u003Cspan class=\"hljs-title function_\">push\u003C/span>(user);\n            }\n        });\n        \n        \u003Cspan class=\"hljs-comment\">// Return regions with multiple users\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(hotspots.\u003Cspan class=\"hljs-title function_\">entries\u003C/span>())\n            .\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[region, userList]\u003C/span>) =&gt;\u003C/span> userList.\u003Cspan class=\"hljs-property\">length\u003C/span> &gt; \u003Cspan class=\"hljs-number\">1\u003C/span>)\n            .\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">(\u003Cspan class=\"hljs-params\">[region, userList]\u003C/span>) =&gt;\u003C/span> ({\n                \u003Cspan class=\"hljs-attr\">region\u003C/span>: { \u003Cspan class=\"hljs-attr\">startLine\u003C/span>: region, \u003Cspan class=\"hljs-attr\">endLine\u003C/span>: region + \u003Cspan class=\"hljs-number\">9\u003C/span> },\n                \u003Cspan class=\"hljs-attr\">users\u003C/span>: userList.\u003Cspan class=\"hljs-title function_\">map\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">u\u003C/span> =&gt;\u003C/span> ({ \u003Cspan class=\"hljs-attr\">userId\u003C/span>: u.\u003Cspan class=\"hljs-property\">userId\u003C/span>, \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: u.\u003Cspan class=\"hljs-property\">userInfo\u003C/span> }))\n            }));\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">detectConcurrentEditing\u003C/span>(\u003Cspan class=\"hljs-params\">users\u003C/span>) {\n        \u003Cspan class=\"hljs-comment\">// Detect when users are editing in close proximity\u003C/span>\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> activeUsers = users.\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">u\u003C/span> =&gt;\u003C/span> u.\u003Cspan class=\"hljs-property\">isActive\u003C/span> &amp;&amp; u.\u003Cspan class=\"hljs-property\">cursor\u003C/span>);\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> concurrent = [];\n        \n        \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> i = \u003Cspan class=\"hljs-number\">0\u003C/span>; i &lt; activeUsers.\u003Cspan class=\"hljs-property\">length\u003C/span>; i++) {\n            \u003Cspan class=\"hljs-keyword\">for\u003C/span> (\u003Cspan class=\"hljs-keyword\">let\u003C/span> j = i + \u003Cspan class=\"hljs-number\">1\u003C/span>; j &lt; activeUsers.\u003Cspan class=\"hljs-property\">length\u003C/span>; j++) {\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> user1 = activeUsers[i];\n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> user2 = activeUsers[j];\n                \n                \u003Cspan class=\"hljs-keyword\">const\u003C/span> distance = \u003Cspan class=\"hljs-title class_\">Math\u003C/span>.\u003Cspan class=\"hljs-title function_\">abs\u003C/span>(user1.\u003Cspan class=\"hljs-property\">cursor\u003C/span>.\u003Cspan class=\"hljs-property\">line\u003C/span> - user2.\u003Cspan class=\"hljs-property\">cursor\u003C/span>.\u003Cspan class=\"hljs-property\">line\u003C/span>);\n                \u003Cspan class=\"hljs-keyword\">if\u003C/span> (distance &lt;= \u003Cspan class=\"hljs-number\">5\u003C/span>) { \u003Cspan class=\"hljs-comment\">// Within 5 lines\u003C/span>\n                    concurrent.\u003Cspan class=\"hljs-title function_\">push\u003C/span>({\n                        \u003Cspan class=\"hljs-attr\">users\u003C/span>: [\n                            { \u003Cspan class=\"hljs-attr\">userId\u003C/span>: user1.\u003Cspan class=\"hljs-property\">userId\u003C/span>, \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: user1.\u003Cspan class=\"hljs-property\">userInfo\u003C/span>, \u003Cspan class=\"hljs-attr\">cursor\u003C/span>: user1.\u003Cspan class=\"hljs-property\">cursor\u003C/span> },\n                            { \u003Cspan class=\"hljs-attr\">userId\u003C/span>: user2.\u003Cspan class=\"hljs-property\">userId\u003C/span>, \u003Cspan class=\"hljs-attr\">userInfo\u003C/span>: user2.\u003Cspan class=\"hljs-property\">userInfo\u003C/span>, \u003Cspan class=\"hljs-attr\">cursor\u003C/span>: user2.\u003Cspan class=\"hljs-property\">cursor\u003C/span> }\n                        ],\n                        distance,\n                        \u003Cspan class=\"hljs-attr\">conflictRisk\u003C/span>: distance &lt;= \u003Cspan class=\"hljs-number\">2\u003C/span> ? \u003Cspan class=\"hljs-string\">&#x27;high&#x27;\u003C/span> : \u003Cspan class=\"hljs-string\">&#x27;medium&#x27;\u003C/span>\n                    });\n                }\n            }\n        }\n        \n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> concurrent;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getPresenceForUser\u003C/span>(\u003Cspan class=\"hljs-params\">userId\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(userId) || \u003Cspan class=\"hljs-literal\">null\u003C/span>;\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">getDocumentPresence\u003C/span>(\u003Cspan class=\"hljs-params\">documentId\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">return\u003C/span> \u003Cspan class=\"hljs-title class_\">Array\u003C/span>.\u003Cspan class=\"hljs-title function_\">from\u003C/span>(\u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">presenceData\u003C/span>.\u003Cspan class=\"hljs-title function_\">values\u003C/span>())\n            .\u003Cspan class=\"hljs-title function_\">filter\u003C/span>(\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-params\">p\u003C/span> =&gt;\u003C/span> p.\u003Cspan class=\"hljs-property\">documentId\u003C/span> === documentId);\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">enableFeature\u003C/span>(\u003Cspan class=\"hljs-params\">featureName, enabled = \u003Cspan class=\"hljs-literal\">true\u003C/span>\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> feature = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">awarenessFeatures\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(featureName);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (feature) {\n            feature.\u003Cspan class=\"hljs-property\">enabled\u003C/span> = enabled;\n        }\n    }\n    \n    \u003Cspan class=\"hljs-title function_\">configureFeature\u003C/span>(\u003Cspan class=\"hljs-params\">featureName, config\u003C/span>) {\n        \u003Cspan class=\"hljs-keyword\">const\u003C/span> feature = \u003Cspan class=\"hljs-variable language_\">this\u003C/span>.\u003Cspan class=\"hljs-property\">awarenessFeatures\u003C/span>.\u003Cspan class=\"hljs-title function_\">get\u003C/span>(featureName);\n        \u003Cspan class=\"hljs-keyword\">if\u003C/span> (feature) {\n            \u003Cspan class=\"hljs-title class_\">Object\u003C/span>.\u003Cspan class=\"hljs-title function_\">assign\u003C/span>(feature, config);\n        }\n    }\n}\n\n\u003Cspan class=\"hljs-variable language_\">module\u003C/span>.\u003Cspan class=\"hljs-property\">exports\u003C/span> = \u003Cspan class=\"hljs-title class_\">CollaborativePresenceSystem\u003C/span>;\n\u003C/code>\u003C/pre>\u003Ch2 id=\"conclusion\">Conclusion\u003C/h2>\n\u003Cp>Collaborative Markdown editing with real-time synchronization represents a fundamental advancement in documentation workflows that enables teams to work together seamlessly while maintaining document integrity and quality. By implementing sophisticated operational transformation algorithms, conflict resolution mechanisms, and user presence systems, organizations can create collaborative editing environments that support productive parallel workflows without sacrificing the simplicity and portability that makes Markdown such an effective content creation format.\u003C/p>\n\u003Cp>The key to successful collaborative editing lies in balancing real-time responsiveness with conflict prevention, ensuring that automated synchronization serves user productivity rather than creating complexity. Whether you&#39;re building team documentation platforms, collaborative writing tools, or integrated development environments, the techniques covered in this guide provide the foundation for creating robust, scalable collaborative editing systems that enhance team productivity while maintaining content quality.\u003C/p>\n\u003Cp>Remember to implement comprehensive testing strategies for collaborative scenarios, establish clear conflict resolution policies that align with your team&#39;s workflows, and continuously monitor system performance to ensure that real-time collaboration remains smooth and responsive as usage scales. With proper implementation of advanced collaborative editing techniques, your Markdown documentation workflows can achieve unprecedented levels of team coordination and productivity while preserving the accessibility and maintainability that makes Markdown an ideal choice for collaborative content creation.\u003C/p>\n",[15,19,22,25,28,31],{"id":16,"text":17,"level":18},"why-master-collaborative-markdown-editing","Why Master Collaborative Markdown Editing?",2,{"id":20,"text":21,"level":18},"foundation-collaborative-architecture","Foundation Collaborative Architecture",{"id":23,"text":24,"level":18},"advanced-conflict-resolution-strategies","Advanced Conflict Resolution Strategies",{"id":26,"text":27,"level":18},"integration-with-modern-development-workflows","Integration with Modern Development Workflows",{"id":29,"text":30,"level":18},"advanced-collaboration-features","Advanced Collaboration Features",{"id":32,"text":33,"level":18},"conclusion","Conclusion",[],[36,44,52],{"slug":37,"title":38,"description":39,"excerpt":40,"date":41,"category":9,"author":10,"keywords":42,"readingMinutes":43},"markdown-content-validation-automated-quality-assurance","Markdown Content Validation and Automated Quality Assurance: Complete Guide for Documentation Excellence and Team Workflows","Master automated Markdown content validation with comprehensive quality assurance systems. Learn validation rules, automated testing, CI/CD integration, and quality metrics for professional documentation workflows.","Automated Markdown content validation and quality assurance systems enable professional documentation teams to maintain consistency, accuracy, and excellence across large content repositories…","2025-10-11","markdown validation, content quality assurance, automated markdown testing, documentation QA, markdown linting, content validation tools, documentation quality metrics, markdown CI/CD",27,{"slug":45,"title":46,"description":47,"excerpt":48,"date":49,"category":9,"author":10,"keywords":50,"readingMinutes":51},"markdown-version-control-git-integration-complete-guide","Markdown Version Control and Git Integration: Complete Guide for Documentation Workflows and Collaborative Content Management","Master Markdown version control with Git integration for collaborative documentation workflows, automated content management, and efficient technical writing processes. Learn Git hooks, merge strategies, and workflow optimization.","Advanced Markdown version control and Git integration enables sophisticated collaborative documentation workflows that maintain content quality, track changes systematically, and automate content…","2025-09-29","markdown version control, git markdown integration, documentation git workflows, markdown collaboration, git hooks markdown, version control documentation, markdown git best practices, collaborative writing git",22,{"slug":53,"title":54,"description":55,"excerpt":56,"date":57,"category":9,"author":10,"keywords":58,"readingMinutes":59},"markdown-automation-workflows-complete-guide","Markdown Automation Workflows: Complete Guide for CI/CD, Publishing, and Documentation Generation","Master automated Markdown workflows for continuous documentation, publishing pipelines, and content generation. Learn GitHub Actions, automated testing, deployment strategies, and integration with modern development tools.","Automated Markdown workflows enable seamless integration of documentation and content creation into modern development processes, providing continuous integration capabilities for technical…","2025-09-25","markdown automation, markdown ci cd, automated documentation, markdown workflows, markdown publishing automation, documentation generation, markdown testing, automated content publishing",29,1792184943251]