{"_id":"socialcalc","_rev":"27-4dc50c30aca6106b9cc96eafab0811a2","name":"socialcalc","dist-tags":{"latest":"3.2.0"},"versions":{"2.0.0":{"name":"socialcalc","version":"2.0.0","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@2.0.0","maintainers":[{"name":"marcelklehr","email":"mklehr@gmx.net"}],"homepage":"https://github.com/marcelklehr/socialcalc#readme","bugs":{"url":"https://github.com/marcelklehr/socialcalc/issues"},"dist":{"shasum":"e734ca550992b872feb7d007b8f7c6780642c22e","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-2.0.0.tgz","integrity":"sha512-3WqGxVOZn4sRs160py+U33rLaRBTq5HdnuoMXLPlMR7oO6rWapvSMwWMaieZvsdEVi0yzBb8y21YDopuva20Pg==","signatures":[{"sig":"MEQCIApOC6hQe4dzR3HYof4aciwlCD+m8TlsueHm8scuyoMYAiBYMnabMkzOb9PKxCRHL2tzX69IZeCEqJ1OCk4PTw8XYw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"SocialCalc.js","_from":".","_shasum":"e734ca550992b872feb7d007b8f7c6780642c22e","gitHead":"e2991beade2354985fe06634f30366466e854f5d","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"marcelklehr","email":"mklehr@gmx.net"},"repository":{"url":"git+https://github.com/marcelklehr/socialcalc.git","type":"git"},"_npmVersion":"3.8.2","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"5.6.0","_npmOperationalInternal":{"tmp":"tmp/socialcalc-2.0.0.tgz_1459687550977_0.44681838247925043","host":"packages-12-west.internal.npmjs.com"}},"2.0.1":{"name":"socialcalc","version":"2.0.1","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@2.0.1","maintainers":[{"name":"marcelklehr","email":"mklehr@gmx.net"}],"homepage":"https://github.com/marcelklehr/socialcalc#readme","bugs":{"url":"https://github.com/marcelklehr/socialcalc/issues"},"dist":{"shasum":"fe5c24dce5d24c0870d1ab62bad36f3236e6e7b2","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-2.0.1.tgz","integrity":"sha512-vmZF9usAfrFDPCxCEuGUpEZb8VJN+Yemk4V1CjkunqMzluRxq2FaM9GT6AuEswWDCeqacvhdliZF0o+O9ZUGYw==","signatures":[{"sig":"MEYCIQDQVTIDklTIzNp6gdvipm8scpjOmJPSisy3G9aAT1FdwgIhAL/oztU0rooT5fUKLGZias8a1ymoebSUhz92d/d8GbUW","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"SocialCalc.js","_from":".","_shasum":"fe5c24dce5d24c0870d1ab62bad36f3236e6e7b2","gitHead":"2af4d4338da8508501b4cf37c4b45c68d36ddee8","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"marcelklehr","email":"mklehr@gmx.net"},"repository":{"url":"git+https://github.com/marcelklehr/socialcalc.git","type":"git"},"_npmVersion":"3.8.2","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"5.6.0","_npmOperationalInternal":{"tmp":"tmp/socialcalc-2.0.1.tgz_1459696367239_0.2396886341739446","host":"packages-12-west.internal.npmjs.com"}},"2.0.2":{"name":"socialcalc","version":"2.0.2","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@2.0.2","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"}],"homepage":"https://github.com/marcelklehr/socialcalc#readme","bugs":{"url":"https://github.com/marcelklehr/socialcalc/issues"},"dist":{"shasum":"0b3a885b0a46e9153aee358b6e9e742bddfa21d5","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-2.0.2.tgz","integrity":"sha512-9OQeL+2UHKbJ71SWUvCW1PFKOGexjhVLOTpz6hNUNfA9LPA9Ni5PixFHPZ0+2PWDICdnq7ksTlRB/QUbd4OV0w==","signatures":[{"sig":"MEUCIQDRQ6G2IoxYoNu48+/kRhvi/qOmsT3r7rTu7lE8ydI1SQIgeBOcEherer/y3Z+S9gsnz5T17UkYE/Kq2qEQY5LI380=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"SocialCalc.js","_from":".","_shasum":"0b3a885b0a46e9153aee358b6e9e742bddfa21d5","gitHead":"d72571be498d3953693088cfe4e34f04bac877aa","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"marcelklehr","email":"mklehr@gmx.net"},"repository":{"url":"git+https://github.com/marcelklehr/socialcalc.git","type":"git"},"_npmVersion":"3.8.2","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"5.6.0","_npmOperationalInternal":{"tmp":"tmp/socialcalc-2.0.2.tgz_1459769290901_0.02637305809184909","host":"packages-12-west.internal.npmjs.com"}},"2.0.3":{"name":"socialcalc","version":"2.0.3","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@2.0.3","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"}],"homepage":"https://github.com/marcelklehr/socialcalc#readme","bugs":{"url":"https://github.com/marcelklehr/socialcalc/issues"},"dist":{"shasum":"dfd5bad29c9c7b9caa801541f4eaf22e84245e9b","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-2.0.3.tgz","integrity":"sha512-vxufOy7oaS3pr/0PEfVH51vWbib3I5ip0oq2+dO9lJQ03GgBogxD0Swrr+gLX3e7+pFUy0KbwSj7ixCcln6U7g==","signatures":[{"sig":"MEUCIQCTrDaovOmKgO1ZIllK5HvdS5kbzq1dPVX/VTSzZgdkzQIgAJFNYPJRMRZoOY3eZWdH+ZEkGdh2kabRRfOfO4uaJq4=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"SocialCalc.js","_from":".","_shasum":"dfd5bad29c9c7b9caa801541f4eaf22e84245e9b","gitHead":"bf1b552cb734eba61334c01acc0a53c3c6d0446c","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"marcelklehr","email":"mklehr@gmx.net"},"repository":{"url":"git+https://github.com/marcelklehr/socialcalc.git","type":"git"},"_npmVersion":"3.8.2","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"5.6.0","_npmOperationalInternal":{"tmp":"tmp/socialcalc-2.0.3.tgz_1459771632809_0.16508679743856192","host":"packages-12-west.internal.npmjs.com"}},"2.0.4":{"name":"socialcalc","version":"2.0.4","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@2.0.4","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"}],"homepage":"https://github.com/marcelklehr/socialcalc#readme","bugs":{"url":"https://github.com/marcelklehr/socialcalc/issues"},"dist":{"shasum":"80943f8a3852b4e3ad27474393699f24410f869d","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-2.0.4.tgz","integrity":"sha512-Q2EUHx2wiIDTU0FZBuApdaVWH3DkjW6Hdafuvx2+WrIIgPiyoxfhxBb2QVW6PDCC6FzSBAEGWl5xNwrKjz84wg==","signatures":[{"sig":"MEMCIHjyJ/3PxXHeGIDsU+oDW7yaEF/JYXNyjOypXxRMjUiCAh8ONEB2k5r6poU1UC030VSIBQbjRsUB9HwZ8QXRb+AF","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"SocialCalc.js","_from":".","_shasum":"80943f8a3852b4e3ad27474393699f24410f869d","gitHead":"7f1929b6d3cecc90f3a94cf9303bb6f6cc65f0cf","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"marcelklehr","email":"mklehr@gmx.net"},"repository":{"url":"git+https://github.com/marcelklehr/socialcalc.git","type":"git"},"_npmVersion":"3.8.2","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"5.6.0","_npmOperationalInternal":{"tmp":"tmp/socialcalc-2.0.4.tgz_1459772308022_0.7718327736947685","host":"packages-12-west.internal.npmjs.com"}},"2.0.5":{"name":"socialcalc","version":"2.0.5","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@2.0.5","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"}],"homepage":"https://github.com/marcelklehr/socialcalc#readme","bugs":{"url":"https://github.com/marcelklehr/socialcalc/issues"},"dist":{"shasum":"09cd65798f695fe6630797b3583cec536828f43e","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-2.0.5.tgz","integrity":"sha512-6kYi5cwn9peU3AY5o3J7iH5H8XuKzJmGf0Fjdo0Ib7zj+IzFj80jPLBLVFaiiWxaAOlZUeEU7CD5Jo5piYjGXQ==","signatures":[{"sig":"MEQCICOzkFWlAW09t7hx5TRWeatA0o3ITcw91Qk1FPaj3nTdAiB+Nblv/s+LNWYdElsiKBmN0CYTJcqBsFdn/731pk/Raw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"SocialCalc.js","_from":".","_shasum":"09cd65798f695fe6630797b3583cec536828f43e","gitHead":"c1b53b92c9c38a7c73ff10328cd80b562421677c","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"marcelklehr","email":"mklehr@gmx.net"},"repository":{"url":"git+https://github.com/marcelklehr/socialcalc.git","type":"git"},"_npmVersion":"3.8.2","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"5.6.0","_npmOperationalInternal":{"tmp":"tmp/socialcalc-2.0.5.tgz_1459777182178_0.12723811785690486","host":"packages-12-west.internal.npmjs.com"}},"2.0.6":{"name":"socialcalc","version":"2.0.6","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@2.0.6","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"}],"homepage":"https://github.com/marcelklehr/socialcalc#readme","bugs":{"url":"https://github.com/marcelklehr/socialcalc/issues"},"dist":{"shasum":"60bcdfbd78d0864472ebb070beb3b4651191335d","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-2.0.6.tgz","integrity":"sha512-X3IbvnCJ3EmpTxmcwn4s02X0PF90nYQivh8wlO1lBjIgQS7mRKCb8esBfPkYsBEwq5e7Omm3+5CXMJXtN9O23w==","signatures":[{"sig":"MEQCIGX6NbEiH76jeJklbKeLqu3jeVXaMl8/4yaM4fvse2xvAiAdUBOVXx0i79fgkNqNnDc5+dXDfuh/St4jWTGb6sr1cA==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"SocialCalc.js","_from":".","_shasum":"60bcdfbd78d0864472ebb070beb3b4651191335d","gitHead":"8557aaa3dda1fa0ec54c5d691894f9920f4aa14f","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"marcelklehr","email":"mklehr@gmx.net"},"repository":{"url":"git+https://github.com/marcelklehr/socialcalc.git","type":"git"},"_npmVersion":"3.8.2","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"5.6.0","_npmOperationalInternal":{"tmp":"tmp/socialcalc-2.0.6.tgz_1459812102745_0.15305305551737547","host":"packages-12-west.internal.npmjs.com"}},"2.0.7":{"name":"socialcalc","version":"2.0.7","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@2.0.7","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"}],"homepage":"https://github.com/marcelklehr/socialcalc#readme","bugs":{"url":"https://github.com/marcelklehr/socialcalc/issues"},"dist":{"shasum":"781864d214838c7fc5ba3b5635ef3e148e8c98fe","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-2.0.7.tgz","integrity":"sha512-Sld/hE8Se5ffnNqPMHAMarQTfzt89mzaKKbYs30zk64Q8ZpHoGg2emrRA5k+hJaOKPFFio/6Fo/MBCl8pdBaew==","signatures":[{"sig":"MEUCIQCUpYuws/1IfDafH0lM0GVnMyTLeb3Y1BaUAqDMZJe9ggIgJHMCGs6GmDb0VLMlfCtWtLsk+3PGdyH4zcI+Epf31Kk=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"SocialCalc.js","_from":".","_shasum":"781864d214838c7fc5ba3b5635ef3e148e8c98fe","gitHead":"e164e2a81e23fb5c4e9d07ebedac29c1cf21ef66","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"marcelklehr","email":"mklehr@gmx.net"},"repository":{"url":"git+https://github.com/marcelklehr/socialcalc.git","type":"git"},"_npmVersion":"3.8.2","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"5.6.0","_npmOperationalInternal":{"tmp":"tmp/socialcalc-2.0.7.tgz_1459867169134_0.9124277681112289","host":"packages-12-west.internal.npmjs.com"}},"2.0.8":{"name":"socialcalc","version":"2.0.8","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@2.0.8","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"}],"homepage":"https://github.com/marcelklehr/socialcalc#readme","bugs":{"url":"https://github.com/marcelklehr/socialcalc/issues"},"dist":{"shasum":"98408d3894a212a4a9f8bf02e9bcddc2568bcdfb","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-2.0.8.tgz","integrity":"sha512-iGKPCnePAbJ5lQybM1653z7ebU8PEnb6KL+pwmJ7A+orM58xkWPt8M7XmNt90+mM8N1CpnaV4MlUlnhlpq4cFA==","signatures":[{"sig":"MEYCIQCsy5yE2dTSTyyvP4f3DGKSI+hXxWL3R5DLahcBvdnYLAIhANNTmdKoCOchYrT0mH8NpRn0Ws7R+B0CBZi7DeUwo8/Q","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"SocialCalc.js","_from":".","_shasum":"98408d3894a212a4a9f8bf02e9bcddc2568bcdfb","gitHead":"51378b23c4bfac5324707a5b9b62f1038f992fe9","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"marcelklehr","email":"mklehr@gmx.net"},"repository":{"url":"git+https://github.com/marcelklehr/socialcalc.git","type":"git"},"_npmVersion":"3.8.2","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"5.6.0","_npmOperationalInternal":{"tmp":"tmp/socialcalc-2.0.8.tgz_1464811790755_0.28461027052253485","host":"packages-16-east.internal.npmjs.com"}},"2.1.0":{"name":"socialcalc","version":"2.1.0","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@2.1.0","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"}],"homepage":"https://github.com/marcelklehr/socialcalc#readme","bugs":{"url":"https://github.com/marcelklehr/socialcalc/issues"},"dist":{"shasum":"f42644ff78daf17cacf0b5c53a24aa55dfac6daa","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-2.1.0.tgz","integrity":"sha512-cqzMB6+HE16LA6XRZXa3QIHAHQaLAJlgdCE7iYU8jqINDcbydQ6Pb0R3HgFgxBqqXYhvmcDMVo/aB4CAib4w5w==","signatures":[{"sig":"MEUCIEHZ85roCXo4bl9TnhYOmNA0FiVnSLIgE4qgVTpIgK5KAiEA7v773sTpPmWDIZFjPTqz85ogE4gtcnjmF1rjK6hLkYE=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"SocialCalc.js","_from":".","_shasum":"f42644ff78daf17cacf0b5c53a24aa55dfac6daa","gitHead":"0e912b2a0d3866824d1503ebb83be0b08400f557","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"marcelklehr","email":"mklehr@gmx.net"},"repository":{"url":"git+https://github.com/marcelklehr/socialcalc.git","type":"git"},"_npmVersion":"3.8.2","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"5.6.0","_npmOperationalInternal":{"tmp":"tmp/socialcalc-2.1.0.tgz_1464955059129_0.06710141990333796","host":"packages-12-west.internal.npmjs.com"}},"2.2.0":{"name":"socialcalc","version":"2.2.0","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@2.2.0","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"}],"homepage":"https://github.com/marcelklehr/socialcalc#readme","bugs":{"url":"https://github.com/marcelklehr/socialcalc/issues"},"dist":{"shasum":"d08d3211e6b5df8a905e322c781d4fc1f80da6ce","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-2.2.0.tgz","integrity":"sha512-mE/ivi0Ga2GHCSWdeL0Yv3bgLQvF1DgwI7EX5wqLJQXQLBgUiCWYLtS4nYdW4ikrp+PoEoqTJJZFOScL190bBw==","signatures":[{"sig":"MEQCIHvbf4ZiNfNKcB2BG5p7QKSHj44uOmjT88XWxCWciflmAiAL0BDlQEP0SB31J6bTjLIED/Ch7GCI/NeJDCLDhaaqyw==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}]},"main":"SocialCalc.js","_from":".","_shasum":"d08d3211e6b5df8a905e322c781d4fc1f80da6ce","gitHead":"8632f56e7ec8a1ad2dd7cc5650c21fce1fa6e9c1","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"_npmUser":{"name":"marcelklehr","email":"mklehr@gmx.net"},"repository":{"url":"git+https://github.com/marcelklehr/socialcalc.git","type":"git"},"_npmVersion":"3.9.5","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"6.2.2","_npmOperationalInternal":{"tmp":"tmp/socialcalc-2.2.0.tgz_1469549935430_0.5330070951022208","host":"packages-12-west.internal.npmjs.com"}},"2.3.0":{"name":"socialcalc","version":"2.3.0","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@2.3.0","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"eddyparkinson","email":"eddyponline-adelaide@yahoo.co.uk"},{"name":"marcelklehr","email":"mklehr@gmx.net"}],"homepage":"https://github.com/marcelklehr/socialcalc#readme","bugs":{"url":"https://github.com/marcelklehr/socialcalc/issues"},"dist":{"shasum":"f901df8584fd599775731b2a17e65b7e89908a5a","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-2.3.0.tgz","fileCount":97,"integrity":"sha512-hkK5c7eRRGzOiRNPFCQ/kzv2wqOSFaD4AtYag962r0jV0mlyhTQ7xvs3r14MB3Xbo2hAWq5AKYddrtqvuWvDAA==","signatures":[{"sig":"MEYCIQDb0vzw79VVkUGHUBkKdWZ3q3Y+nS/YHQ3clxaXDZFM6QIhAKbt/PDhHpYHOvjs4+v8HwPAdADJfb01OPPmOJL8mkJU","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":2091249,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbgFiSCRA9TVsSAnZWagAA6ocP/iq5KlM5hF+Jz8cZEzQU\nIBWr7iC5JxUlwNQTnTTHJm5BTdwqLDSXHCw4+4yiroFZuHMwxJnje4/oHqtA\nd2SN609O339b0nQAspyOYXU9k6ED/N+jO0yBaZUo1b3djLbft+xDMYjMJfyj\nb9J8QX6QsazUX9CaFbfwpAKoGIz6pBhw+eMKDre2I0M8YyErHMiPfpZT+Ykm\nThD5h6c9LA2CphjEQ8+Q34QqvaEmdvo8W7mM+fGtnmfb1ppqvoi2LmDh8APR\nrybSQNnYQOGID2ZYo67omPHWynXBrulnUIun0mHT3aXVcs78nEhcdP3zXj8L\npHd1okTF17B48CIovNjPQ9Dtt3rkspOJbjfPW+2kP5HkzgK+FDtEBj/BbOOa\nBfYVnjha9BJPk3j/EIyI8KwuBsMNewqKT7YrCp+TbVYxrr5RJmNSJVuNK9M9\ndfX/wDHH3DFJHFXtc2S8zORf5czy+L7rBsvMMIHM6BcMvm7zCsqLCS/shunm\nlgdPAIjYSsJbze3X2BH6d9qGPponn2Ymw49jY7PW7JG4BW44os+mnTiEC6ZR\n2BLWr3sofLhnXLeNTLJWdKY5QatRvCbH22HJJvbgYhJdnAvBIATpV0eNaTMZ\na//4a9qL62zLm7Uwt0PFET9kzFNTA57p458tSs9D+fXcWI/pDqA/g2ygxZHO\nPA8E\r\n=/MVZ\r\n-----END PGP SIGNATURE-----\r\n"},"main":"dist/SocialCalc.js","gitHead":"1c9e056593b7dc1cab5ca0d2ffe43606ccdd585a","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"gulp"},"_npmUser":{"name":"marcelklehr","email":"mklehr@gmx.net"},"repository":{"url":"git+https://github.com/marcelklehr/socialcalc.git","type":"git"},"_npmVersion":"6.1.0","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"10.2.1","_hasShrinkwrap":false,"devDependencies":{"gulp":"^3.9.1","jshint":"^2.9.5","files-exist":"^1.0.2","gulp-concat":"^2.6.1","gulp-jshint":"^2.0.4","gulp-uglify":"^3.0.0","jshint-stylish":"^2.2.1"},"_npmOperationalInternal":{"tmp":"tmp/socialcalc_2.3.0_1535137937315_0.6524076457467078","host":"s3://npm-registry-packages"}},"3.0.0":{"name":"socialcalc","version":"3.0.0","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@3.0.0","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"},{"name":"eddyparkinson","email":"eddyponline-adelaide@yahoo.co.uk"}],"homepage":"https://github.com/audreyt/socialcalc#readme","bugs":{"url":"https://github.com/audreyt/socialcalc/issues"},"dist":{"shasum":"25f174f97c877baf6470cd825adb5788310990cb","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-3.0.0.tgz","fileCount":16,"integrity":"sha512-8cLHMuhPPNT+WHxrA3UlfQkEcU4jagkLsiQ5+Czw5B+OtA+jHIDaZpqYfuR9ZWngpHHjHSpxS8NHf/kjRTSyQw==","signatures":[{"sig":"MEQCIDQor+1zP0snZ387mr1Ur6Eoyrr25JUlUBF9okWrP92LAiB3jUPcxg+ug2YOcxhWGIqWU6eWDJ+D9SHNvcYmJzy0hA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1169893},"main":"dist/SocialCalc.js","type":"module","types":"dist/SocialCalc.d.ts","gitHead":"9c8da9dbf3bb7fce264badbe2d7dffc201314daa","scripts":{"docs":"typedoc","test":"bun run build.ts && bun test --parallel","build":"bun run build.ts","mutate":"stryker run","build:min":"bun run build.ts --minify","typecheck":"tsgo --noEmit","docs:watch":"typedoc --watch","mutate:file":"bun run stryker-file.mjs","mutate:sheet":"bun run stryker-file.mjs js/socialcalc-3.js","mutate:format":"bun run stryker-file.mjs js/formatnumber2.js","test:coverage":"bun run build.ts && bun test --coverage --coverage-reporter=text --coverage-reporter=lcov","mutate:formula":"bun run stryker-file.mjs js/formula1.js","typecheck:strict":"tsgo --noEmit -p tsconfig.strict.json"},"_npmUser":{"name":"au","email":"audreyt@audreyt.org"},"repository":{"url":"git+https://github.com/audreyt/socialcalc.git","type":"git"},"_npmVersion":"11.11.0","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"typedoc":"^0.28.19","@types/bun":"latest","typescript":"^6.0.3","@stryker-mutator/core":"^9.6.1","@typescript/native-preview":"^7.0.0-dev.20260419.1"},"_npmOperationalInternal":{"tmp":"tmp/socialcalc_3.0.0_1776749141492_0.8210519412334434","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"socialcalc","version":"3.0.1","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@3.0.1","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"},{"name":"eddyparkinson","email":"eddyponline-adelaide@yahoo.co.uk"}],"homepage":"https://github.com/audreyt/socialcalc#readme","bugs":{"url":"https://github.com/audreyt/socialcalc/issues"},"dist":{"shasum":"bfac73c0f309aabc7e3f7d5016193abf728d6b6d","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-3.0.1.tgz","fileCount":16,"integrity":"sha512-hyk6699Dt7TPA51PA3WfWSH4QkQ6M2STFQk5W4+My407t36Lv6KLT/ek4lYcEX0+U6ZGNaW343rYLgrWDPadsQ==","signatures":[{"sig":"MEYCIQDP82UVlCc7ucmA7BPa0en92rv/79rGasaGpiI5QMnRiAIhALe6V5NRHf/XyUFtZ7Q7izHw0c9g5k/HeWnivof2Rjbg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1170370},"main":"dist/SocialCalc.js","type":"module","types":"dist/SocialCalc.d.ts","gitHead":"4bb47b88030df7308c8c2f90695f5e4da9a551d5","scripts":{"test":"bun run build.ts && bun test --parallel","build":"bun run build.ts","mutate":"bunx stryker run","build:min":"bun run build.ts --minify","typecheck":"tsgo --noEmit","mutate:file":"bun run stryker-file.mjs","mutate:sheet":"bun run stryker-file.mjs js/socialcalc-3.js","mutate:format":"bun run stryker-file.mjs js/formatnumber2.js","test:coverage":"bun run build.ts && bun test --coverage --coverage-reporter=text --coverage-reporter=lcov","mutate:formula":"bun run stryker-file.mjs js/formula1.js","typecheck:strict":"tsgo --noEmit -p tsconfig.strict.json"},"_npmUser":{"name":"au","email":"audreyt@audreyt.org"},"repository":{"url":"git+https://github.com/audreyt/socialcalc.git","type":"git"},"_npmVersion":"11.11.0","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","@stryker-mutator/core":"^9.6.1","@typescript/native-preview":"^7.0.0-dev.20260421.2"},"_npmOperationalInternal":{"tmp":"tmp/socialcalc_3.0.1_1781235498714_0.9607711031446524","host":"s3://npm-registry-packages-npm-production"}},"3.0.2":{"name":"socialcalc","version":"3.0.2","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@3.0.2","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"},{"name":"eddyparkinson","email":"eddyponline-adelaide@yahoo.co.uk"}],"homepage":"https://github.com/audreyt/socialcalc#readme","bugs":{"url":"https://github.com/audreyt/socialcalc/issues"},"dist":{"shasum":"3011ec19660004b3a860f012219e0e05293a80c8","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-3.0.2.tgz","fileCount":16,"integrity":"sha512-yn5daiUsxwLny6WbtzSbLtZqLphjJJDibnjg/n60ABwJb86KZ07ZNphXktql7fv5XpiqRhxzTlTvrgTaMMwdOA==","signatures":[{"sig":"MEYCIQDJ/H/Gx/0uYzCRQI9rIb19Zr7M0FDfMeQ5NTaksSxAgwIhAOYnTE6VsvwvGNas70GkL5WIuNeKNzQ2dpHh7xzf9mCe","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1172321},"main":"dist/SocialCalc.js","type":"module","types":"dist/SocialCalc.d.ts","gitHead":"8030411eeb37548738bff710db0967c4af01e067","scripts":{"test":"bun run build.ts && bun test --parallel","build":"bun run build.ts","mutate":"bunx stryker run","build:min":"bun run build.ts --minify","typecheck":"tsgo --noEmit","mutate:file":"bun run stryker-file.mjs","mutate:sheet":"bun run stryker-file.mjs js/socialcalc-3.js","mutate:format":"bun run stryker-file.mjs js/formatnumber2.js","test:coverage":"bun run build.ts && bun test --coverage --coverage-reporter=text --coverage-reporter=lcov","mutate:formula":"bun run stryker-file.mjs js/formula1.js","typecheck:strict":"tsgo --noEmit -p tsconfig.strict.json"},"_npmUser":{"name":"au","email":"audreyt@audreyt.org"},"repository":{"url":"git+https://github.com/audreyt/socialcalc.git","type":"git"},"_npmVersion":"11.11.0","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","@stryker-mutator/core":"^9.6.1","@typescript/native-preview":"^7.0.0-dev.20260421.2"},"_npmOperationalInternal":{"tmp":"tmp/socialcalc_3.0.2_1781236908921_0.2830801891467414","host":"s3://npm-registry-packages-npm-production"}},"3.0.3":{"name":"socialcalc","version":"3.0.3","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@3.0.3","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"},{"name":"eddyparkinson","email":"eddyponline-adelaide@yahoo.co.uk"}],"homepage":"https://github.com/audreyt/socialcalc#readme","bugs":{"url":"https://github.com/audreyt/socialcalc/issues"},"dist":{"shasum":"d6c11fb194cdc7acef0798c4f1934d93f3999b0e","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-3.0.3.tgz","fileCount":16,"integrity":"sha512-fms2jwsQaIngDrGZJvMwuWn+Tvp8byEMmXAX4VDlvnH/Ys7nqsJRRUQ3B+h88OazvX79MxEGIpCF6R9tbze7oQ==","signatures":[{"sig":"MEUCIC70hb0joiv6gIoy1vFQbVJ80JUTP+wut5pU5bP3YVgNAiEAlrDDbPBC6N3lkhzle8izzOZRsEd9+UaTZ6tOAQ0D5Ck=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1173497},"main":"dist/SocialCalc.js","type":"module","types":"dist/SocialCalc.d.ts","gitHead":"338fff751fd7856bb34c5e9611479b186536d1c3","scripts":{"test":"bun run build.ts && bun test --parallel","build":"bun run build.ts","mutate":"bunx stryker run","build:min":"bun run build.ts --minify","typecheck":"tsgo --noEmit","mutate:file":"bun run stryker-file.mjs","mutate:sheet":"bun run stryker-file.mjs js/socialcalc-3.js","mutate:format":"bun run stryker-file.mjs js/formatnumber2.js","test:coverage":"bun run build.ts && bun test --coverage --coverage-reporter=text --coverage-reporter=lcov","mutate:formula":"bun run stryker-file.mjs js/formula1.js","typecheck:strict":"tsgo --noEmit -p tsconfig.strict.json"},"_npmUser":{"name":"au","email":"audreyt@audreyt.org"},"repository":{"url":"git+https://github.com/audreyt/socialcalc.git","type":"git"},"_npmVersion":"11.11.0","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","@stryker-mutator/core":"^9.6.1","@typescript/native-preview":"^7.0.0-dev.20260421.2"},"_npmOperationalInternal":{"tmp":"tmp/socialcalc_3.0.3_1781238073912_0.5497973513414913","host":"s3://npm-registry-packages-npm-production"}},"3.0.4":{"name":"socialcalc","version":"3.0.4","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@3.0.4","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"},{"name":"eddyparkinson","email":"eddyponline-adelaide@yahoo.co.uk"}],"homepage":"https://github.com/audreyt/socialcalc#readme","bugs":{"url":"https://github.com/audreyt/socialcalc/issues"},"dist":{"shasum":"a04639a36ad2ebf9682f85fc5cff5527a2f72e26","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-3.0.4.tgz","fileCount":16,"integrity":"sha512-7RBWF2Ph5HgRwGA69zxTYeH/JMXF7IJ1JP0NGKb2inIEqxaqITG3PAtRU4mk3ldb5F9Gg0aeWM+PpwS/DFMuKg==","signatures":[{"sig":"MEUCIHqLtwNSghrtG3R2DY+3jz367uA990seOL8lzQkmzc1JAiEAv5TzuW9U+3l34ecwnjlDzNFdfbWJpJH7xcnBPkjv/E0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1174040},"main":"dist/SocialCalc.js","type":"module","types":"dist/SocialCalc.d.ts","gitHead":"0ccebb886b2eaf31ff9c77674f6ca0150b43401e","scripts":{"test":"bun run build.ts && bun test --parallel","build":"bun run build.ts","mutate":"bunx stryker run","build:min":"bun run build.ts --minify","typecheck":"tsgo --noEmit","mutate:file":"bun run stryker-file.mjs","mutate:sheet":"bun run stryker-file.mjs js/socialcalc-3.js","mutate:format":"bun run stryker-file.mjs js/formatnumber2.js","test:coverage":"bun run build.ts && bun test --coverage --coverage-reporter=text --coverage-reporter=lcov","mutate:formula":"bun run stryker-file.mjs js/formula1.js","typecheck:strict":"tsgo --noEmit -p tsconfig.strict.json"},"_npmUser":{"name":"au","email":"audreyt@audreyt.org"},"repository":{"url":"git+https://github.com/audreyt/socialcalc.git","type":"git"},"_npmVersion":"11.11.0","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","@stryker-mutator/core":"^9.6.1","@typescript/native-preview":"^7.0.0-dev.20260421.2"},"_npmOperationalInternal":{"tmp":"tmp/socialcalc_3.0.4_1781239995361_0.5667487340286703","host":"s3://npm-registry-packages-npm-production"}},"3.0.5":{"name":"socialcalc","version":"3.0.5","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@3.0.5","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"},{"name":"eddyparkinson","email":"eddyponline-adelaide@yahoo.co.uk"}],"homepage":"https://github.com/audreyt/socialcalc#readme","bugs":{"url":"https://github.com/audreyt/socialcalc/issues"},"dist":{"shasum":"b9bb3f4308bef23988f2eec5573ebe452afc08ea","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-3.0.5.tgz","fileCount":16,"integrity":"sha512-xPB8MquVYWY0qmCT7mkhF9mbvaDmYn/PQc6jhjtPCcp5RbNer/E34kj46QXZ/W6fEC2VWm+WsI+ou59sNWdB0g==","signatures":[{"sig":"MEUCIAC9h3ITiGVxMIjkckHgwI8iStFw+5OSqPe+AWGhopIgAiEAyqGA0VoeSADGLSp9M3XF8H/AlCjbp0A3Y+z2kAI1jbA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1178006},"main":"dist/SocialCalc.js","type":"module","types":"dist/SocialCalc.d.ts","gitHead":"33add144bf1c887fd61ed0b7556c9d91deebf7e8","scripts":{"test":"bun run build.ts && bun test --parallel","build":"bun run build.ts","mutate":"bunx stryker run","build:min":"bun run build.ts --minify","typecheck":"tsgo --noEmit","mutate:file":"bun run stryker-file.mjs","mutate:sheet":"bun run stryker-file.mjs js/socialcalc-3.js","mutate:format":"bun run stryker-file.mjs js/formatnumber2.js","test:coverage":"bun run build.ts && bun test --coverage --coverage-reporter=text --coverage-reporter=lcov","mutate:formula":"bun run stryker-file.mjs js/formula1.js","typecheck:strict":"tsgo --noEmit -p tsconfig.strict.json"},"_npmUser":{"name":"au","email":"audreyt@audreyt.org"},"repository":{"url":"git+https://github.com/audreyt/socialcalc.git","type":"git"},"_npmVersion":"11.11.0","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"25.8.1","_hasShrinkwrap":false,"devDependencies":{"binaryen":"130.0.0","@types/bun":"latest","@stryker-mutator/core":"^9.6.1","@typescript/native-preview":"^7.0.0-dev.20260421.2"},"_npmOperationalInternal":{"tmp":"tmp/socialcalc_3.0.5_1783241080848_0.9583637368377129","host":"s3://npm-registry-packages-npm-production"}},"3.0.8":{"name":"socialcalc","version":"3.0.8","keywords":["spreadsheet","socialcalc","ethercalc","excel","calc","table","grid","cells","office","spreadsheets","editor"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@3.0.8","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"},{"name":"eddyparkinson","email":"eddyponline-adelaide@yahoo.co.uk"}],"homepage":"https://github.com/audreyt/socialcalc#readme","bugs":{"url":"https://github.com/audreyt/socialcalc/issues"},"dist":{"shasum":"d36ed7d4fac3203d5996af56a4da39e553f363a5","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-3.0.8.tgz","fileCount":16,"integrity":"sha512-2XdnQttQpNQWCJARP7cHIzzi9xo0MEAcmb3gCxM4SjmdBmia6mJZsJ4SCR5lR6kI0cb7jpq6GtaTQJEyR3ZJqw==","signatures":[{"sig":"MEUCIQDeUY/379eMh5CD2/plza3a6clbQVwP2KoY83xcwfmsxwIgBHl+bx5WQGPljU9ywr2nVlGTDVxRLW/G6Cpo5Q99dkg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":919291},"main":"dist/SocialCalc.js","types":"dist/SocialCalc.d.ts","gitHead":"952d7037f7c39f4ddd56e6d719ca7008c668769b","scripts":{"test":"bun run build.ts && bun test --parallel","build":"bun run build.ts","mutate":"bunx stryker run","verify":"lsc check --backend=dafny","build:min":"bun run build.ts --minify","typecheck":"tsc --noEmit","mutate:file":"bun run stryker-file.mjs","verify:both":"bun run verify:dafny && bun run verify:lean","verify:lean":"bun run verify:lean:gen && test -s lemma/a1.types.lean && test -s lemma/a1.def.lean && test -s lemma/a1.proof.lean && test -s lemma/eval-ops.types.lean && test -s lemma/eval-ops.def.lean && test -s lemma/eval-ops.proof.lean && test -s lemma/lookup-result.types.lean && test -s lemma/lookup-result.def.lean && test -s lemma/lookup-result.proof.lean","mutate:sheet":"bun run stryker-file.mjs js/socialcalc-3.ts","verify:dafny":"lsc check --backend=dafny","mutate:format":"bun run stryker-file.mjs js/formatnumber2.ts","test:coverage":"bun run build.ts && bun test --coverage --coverage-reporter=text --coverage-reporter=lcov","mutate:formula":"bun run stryker-file.mjs js/formula1.ts","verify:lean:gen":"lsc gen --backend=lean lemma/a1.ts && lsc gen --backend=lean lemma/eval-ops.ts && lsc gen --backend=lean lemma/lookup-result.ts","typecheck:strict":"tsc --noEmit -p tsconfig.strict.json","verify:dafny:gen":"lsc gen --backend=dafny","verify:lean:build":"lake build","verify:dafny:regen":"lsc regen --backend=dafny lemma/a1.ts && lsc regen --backend=dafny lemma/eval-ops.ts && lsc regen --backend=dafny lemma/lookup-result.ts"},"_npmUser":{"name":"au","email":"audreyt@audreyt.org"},"repository":{"url":"git+https://github.com/audreyt/socialcalc.git","type":"git"},"_npmVersion":"11.4.2","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"24.4.1","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"latest","typescript":"^7.0.2","lemmascript":"0.5.13","@stryker-mutator/core":"^9.6.1"},"_npmOperationalInternal":{"tmp":"tmp/socialcalc_3.0.8_1783600823409_0.4585545893700371","host":"s3://npm-registry-packages-npm-production"}},"3.1.0":{"name":"socialcalc","version":"3.1.0","keywords":["calc","cells","editor","ethercalc","excel","grid","office","socialcalc","spreadsheet","spreadsheets","table"],"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","_id":"socialcalc@3.1.0","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"},{"name":"eddyparkinson","email":"eddyponline-adelaide@yahoo.co.uk"}],"homepage":"https://github.com/audreyt/socialcalc#readme","bugs":{"url":"https://github.com/audreyt/socialcalc/issues"},"dist":{"shasum":"fe5ff22fb8361ec9e69002c60dc7673c4e5336f3","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-3.1.0.tgz","fileCount":17,"integrity":"sha512-bBaT/RiRNeL9Hlw1QCL3UGa6vzRq480JaNBFQez0kcpMh4+4pp8xXGOWjsQ9K3iHIy29dgiPNGAksfm1mddvLg==","signatures":[{"sig":"MEUCIEmswFPsTOv1cyM2BCX8a5JsqibE92A3PXu7JQZM/ixjAiEAs0ND7pnb2ppRgwsCnFKmo569eS3zd7lZtLW+VRseV2g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/socialcalc@3.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1408422},"main":"dist/SocialCalc.js","type":"commonjs","_from":"file:dist-release/socialcalc-3.1.0.tgz","types":"dist/SocialCalc.d.ts","engines":{"node":">=22"},"scripts":{"test":"vp build && vp test","build":"vp build","mutate":"vp exec stryker run","verify":"lsc check --backend=dafny","prepack":"vp build --minify","test:bun":"SOCIALCALC_COVERAGE_ISTANBUL=1 vp build && SOCIALCALC_COVERAGE_ISTANBUL=1 bun test ./test --isolate --parallel=4","build:min":"vp build --minify","typecheck":"tsc --noEmit","mutate:all":"node scripts/mutate-all.mjs","mutate:file":"node stryker-file.mjs","verify:both":"vp run verify:dafny && vp run verify:lean","verify:lean":"vp run verify:lean:gen && test -s lemma/a1.types.lean && test -s lemma/a1.def.lean && test -s lemma/a1.proof.lean && test -s lemma/eval-ops.types.lean && test -s lemma/eval-ops.def.lean && test -s lemma/eval-ops.proof.lean && test -s lemma/lookup-result.types.lean && test -s lemma/lookup-result.def.lean && test -s lemma/lookup-result.proof.lean","mutate:sheet":"node stryker-file.mjs js/socialcalc-3.ts","test:browser":"vp exec playwright test","verify:dafny":"lsc check --backend=dafny","mutate:format":"node stryker-file.mjs js/formatnumber2.ts","test:coverage":"SOCIALCALC_COVERAGE=1 vp build && SOCIALCALC_COVERAGE=1 vp test --coverage","mutate:formula":"node stryker-file.mjs js/formula1.ts","verify:lean:gen":"lsc gen --backend=lean lemma/a1.ts && lsc gen --backend=lean lemma/eval-ops.ts && lsc gen --backend=lean lemma/lookup-result.ts","typecheck:strict":"tsc --noEmit -p tsconfig.strict.json","verify:dafny:gen":"lsc gen --backend=dafny","verify:lean:build":"lake build","verify:dafny:regen":"lsc regen --backend=dafny lemma/a1.ts && lsc regen --backend=dafny lemma/eval-ops.ts && lsc regen --backend=dafny lemma/lookup-result.ts","mutate:release-gate":"node scripts/mutate-release-gate.mjs","test:coverage:merged":"rm -rf coverage-browser-v8 coverage-merged && SOCIALCALC_COVERAGE=1 vp build --minify && SOCIALCALC_COVERAGE=1 vp test --coverage && SOCIALCALC_BROWSER_COVERAGE_TEST=1 vp test test/browser-coverage-mapping.test.ts test/merge-browser-coverage-guard.test.ts --run && SOCIALCALC_BROWSER_COVERAGE=1 vp exec playwright test && node scripts/merge-browser-coverage.mjs","test:browser:coverage":"SOCIALCALC_BROWSER_COVERAGE=1 vp exec playwright test","test:ethercalc-canary":"node scripts/verify-ethercalc-canary.mjs","test:package-contract":"node scripts/verify-package-contract.mjs","check:test-credibility":"node scripts/check-test-credibility.mjs","test:coverage:istanbul":"vp test","test:mutation-workflow":"vp exec node scripts/verify-mutation-workflow.mjs","test:mutation-disposition":"vp exec node scripts/verify-mutation-disposition.mjs","check:coverage-attribution":"node scripts/verify-coverage-attribution.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c47c0e1c-3bac-4073-a2aa-a9c54a36d7c2"}},"_resolved":"/home/runner/work/socialcalc/socialcalc/dist-release/socialcalc-3.1.0.tgz","overrides":{"qs":"6.15.3","fast-uri":"3.1.3","@babel/core":"7.29.7"},"_integrity":"sha512-bBaT/RiRNeL9Hlw1QCL3UGa6vzRq480JaNBFQez0kcpMh4+4pp8xXGOWjsQ9K3iHIy29dgiPNGAksfm1mddvLg==","devEngines":{"runtime":{"name":"node","onFail":"error"},"packageManager":{"name":"bun","onFail":"ignore","version":"1.3.14"}},"repository":{"url":"git+https://github.com/audreyt/socialcalc.git","type":"git"},"_npmVersion":"11.16.0","description":"Collaborative spreadsheet editor","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"devDependencies":{"jquery":"^4.0.0","vite-plus":"^0.2.4","typescript":"^7.0.2","@types/node":"24","lemmascript":"0.5.13","@babel/parser":"7.29.2","@playwright/test":"^1.61.1","@vitest/coverage-v8":"4.1.10","@stryker-mutator/core":"^9.6.1","@jridgewell/gen-mapping":"0.3.13","istanbul-lib-instrument":"^6.0.3","@jridgewell/trace-mapping":"0.3.31","@vitest/coverage-istanbul":"4.1.10","@stryker-mutator/vitest-runner":"^9.6.1"},"_npmOperationalInternal":{"tmp":"tmp/socialcalc_3.1.0_1784154688293_0.26667358167082167","host":"s3://npm-registry-packages-npm-production"}},"3.2.0":{"name":"socialcalc","version":"3.2.0","description":"Collaborative spreadsheet editor","keywords":["calc","cells","editor","ethercalc","excel","grid","office","socialcalc","spreadsheet","spreadsheets","table"],"homepage":"https://github.com/audreyt/socialcalc#readme","bugs":{"url":"https://github.com/audreyt/socialcalc/issues"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","author":{"name":"Dan Bricklin"},"repository":{"type":"git","url":"git+https://github.com/audreyt/socialcalc.git"},"type":"commonjs","main":"dist/SocialCalc.js","types":"dist/SocialCalc.d.ts","scripts":{"build":"vp build","build:min":"vp build --minify","prepack":"vp build --minify","typecheck":"tsc --noEmit","typecheck:strict":"tsc --noEmit -p tsconfig.strict.json","test":"vp build && vp test","test:coverage":"SOCIALCALC_COVERAGE=1 vp build && SOCIALCALC_COVERAGE=1 vp test --coverage","test:coverage:istanbul":"vp test","test:bun":"SOCIALCALC_COVERAGE_ISTANBUL=1 vp build && SOCIALCALC_COVERAGE_ISTANBUL=1 bun test ./test --isolate --parallel=4","check:coverage-attribution":"node scripts/verify-coverage-attribution.mjs","test:package-contract":"node scripts/verify-package-contract.mjs","check:test-credibility":"node scripts/check-test-credibility.mjs","test:ethercalc-canary":"node scripts/verify-ethercalc-canary.mjs","test:browser":"vp exec playwright test","mutate":"vp exec stryker run","mutate:file":"node stryker-file.mjs","mutate:format":"node stryker-file.mjs js/formatnumber2.ts","mutate:sheet":"node stryker-file.mjs js/socialcalc-3.ts","mutate:formula":"node stryker-file.mjs js/formula1.ts","mutate:all":"node scripts/mutate-all.mjs","mutate:release-gate":"node scripts/mutate-release-gate.mjs","test:mutation-workflow":"vp exec node scripts/verify-mutation-workflow.mjs","test:mutation-disposition":"vp exec node scripts/verify-mutation-disposition.mjs","verify":"lsc check --backend=dafny","verify:dafny":"lsc check --backend=dafny","verify:dafny:gen":"lsc gen --backend=dafny","verify:dafny:regen":"node scripts/lemmascript-manifest.mjs regen","verify:lean:gen":"node scripts/lemmascript-manifest.mjs lean-gen","verify:lean":"vp run verify:lean:gen && node scripts/lemmascript-manifest.mjs assert-lean","verify:lean:build":"lake build","verify:both":"vp run verify:dafny && vp run verify:lean","test:coverage:merged":"rm -rf coverage-browser-v8 coverage-merged && SOCIALCALC_COVERAGE=1 vp build --minify && SOCIALCALC_COVERAGE=1 vp test --coverage && SOCIALCALC_BROWSER_COVERAGE_TEST=1 vp test test/browser-coverage-mapping.test.ts test/merge-browser-coverage-guard.test.ts --run && SOCIALCALC_BROWSER_COVERAGE=1 vp exec playwright test && node scripts/merge-browser-coverage.mjs","test:browser:coverage":"SOCIALCALC_BROWSER_COVERAGE=1 vp exec playwright test"},"devDependencies":{"@babel/parser":"7.29.2","@jridgewell/gen-mapping":"0.3.13","@jridgewell/trace-mapping":"0.3.31","@playwright/test":"^1.61.1","@stryker-mutator/core":"^9.6.1","@stryker-mutator/vitest-runner":"^9.6.1","@types/node":"24","@vitest/coverage-istanbul":"4.1.10","@vitest/coverage-v8":"4.1.10","istanbul-lib-instrument":"^6.0.3","jquery":"^4.0.0","lemmascript":"0.5.13","typescript":"^7.0.2","vite-plus":"^0.2.4"},"overrides":{"@babel/core":"7.29.7","brace-expansion":"5.0.8","fast-uri":"3.1.4","minimatch":"10.2.5","postcss":"8.5.18","qs":"6.15.3"},"devEngines":{"packageManager":{"name":"bun","version":"1.3.14","onFail":"ignore"},"runtime":{"name":"node","onFail":"error"}},"engines":{"node":">=22"},"_id":"socialcalc@3.2.0","_integrity":"sha512-g64gwN/H7tR/i3PuS01qi8jr92bofUdDFrwpIVgglaYS73sNSKDuDTYCpotLiyuacyi/MKOscWlULPxmPIvpFQ==","_resolved":"/home/runner/work/socialcalc/socialcalc/dist-release/socialcalc-3.2.0.tgz","_from":"file:dist-release/socialcalc-3.2.0.tgz","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-g64gwN/H7tR/i3PuS01qi8jr92bofUdDFrwpIVgglaYS73sNSKDuDTYCpotLiyuacyi/MKOscWlULPxmPIvpFQ==","shasum":"d644b9e8cda409a90880bba5ca8313cc90ded056","tarball":"https://registry.npmjs.org/socialcalc/-/socialcalc-3.2.0.tgz","fileCount":21,"unpackedSize":2175586,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/socialcalc@3.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC/r2AuxsxG7coHkyl7ohZjBq6+QmK4FLeVVHCL+LetawIhAPGj5iO5caHQ9CcpUfx9pM89RwvLosNvoH5ZDXb7Ek7e"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c47c0e1c-3bac-4073-a2aa-a9c54a36d7c2"}},"directories":{},"maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"},{"name":"eddyparkinson","email":"eddyponline-adelaide@yahoo.co.uk"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/socialcalc_3.2.0_1785075959147_0.9673931329394241"},"_hasShrinkwrap":false}},"time":{"created":"2016-04-03T12:45:53.588Z","modified":"2026-07-26T14:25:59.682Z","2.0.0":"2016-04-03T12:45:53.588Z","2.0.1":"2016-04-03T15:12:50.083Z","2.0.2":"2016-04-04T11:28:13.428Z","2.0.3":"2016-04-04T12:07:15.693Z","2.0.4":"2016-04-04T12:18:31.000Z","2.0.5":"2016-04-04T13:39:44.614Z","2.0.6":"2016-04-04T23:21:45.622Z","2.0.7":"2016-04-05T14:39:31.727Z","2.0.8":"2016-06-01T20:09:52.040Z","2.1.0":"2016-06-03T11:57:42.166Z","2.2.0":"2016-07-26T16:18:58.014Z","2.3.0":"2018-08-24T19:12:17.484Z","3.0.0":"2026-04-21T05:25:41.712Z","3.0.1":"2026-06-12T03:38:18.894Z","3.0.2":"2026-06-12T04:01:49.126Z","3.0.3":"2026-06-12T04:21:14.113Z","3.0.4":"2026-06-12T04:53:15.609Z","3.0.5":"2026-07-05T08:44:40.990Z","3.0.8":"2026-07-09T12:40:23.565Z","3.1.0":"2026-07-15T22:31:28.445Z","3.2.0":"2026-07-26T14:25:59.304Z"},"bugs":{"url":"https://github.com/audreyt/socialcalc/issues"},"author":{"name":"Dan Bricklin"},"license":"(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)","homepage":"https://github.com/audreyt/socialcalc#readme","keywords":["calc","cells","editor","ethercalc","excel","grid","office","socialcalc","spreadsheet","spreadsheets","table"],"repository":{"type":"git","url":"git+https://github.com/audreyt/socialcalc.git"},"description":"Collaborative spreadsheet editor","maintainers":[{"name":"au","email":"audreyt@audreyt.org"},{"name":"marcelklehr","email":"mklehr@gmx.net"},{"name":"eddyparkinson","email":"eddyponline-adelaide@yahoo.co.uk"}],"readme":"# SocialCalc\n\nSocialCalc is an in-browser spreadsheet engine and editor with formula evaluation,\nformatting, sheet commands, save/load support, and the UI used by\n[EtherCalc](https://github.com/audreyt/ethercalc). This repository publishes the\n`socialcalc` npm package.\n\nSee it in action at [ethercalc.net](https://ethercalc.net/).\n\n## Install and requirements\n\n```bash\nnpm install socialcalc jquery\n```\n\n- Browser rendering requires jQuery supplied by the host application.\n- Node.js consumers require Node **22 or newer**. CI exercises packed release\n  tarballs under Node 22 and 24; older releases are best-effort only.\n- The package is CommonJS. Native ESM consumers use its default export.\n\n## Usage\n\n### CommonJS\n\n```js\nconst SocialCalc = require(\"socialcalc\");\n\nconst control = new SocialCalc.SpreadsheetControl();\ncontrol.InitializeSpreadsheetControl(element /*, height, width, spacebelow */);\n```\n\n### Native ESM\n\n```js\nimport SocialCalc from \"socialcalc\";\n\nconst control = new SocialCalc.SpreadsheetControl();\n```\n\nThe supported ESM surface is the **default import**. Do not depend on native\nnamed imports: the UMD bundle assigns `module.exports` dynamically, so Node's\nstatic CommonJS named-export detection cannot discover those names reliably.\n\n### Browser global\n\n```html\n<script src=\"node_modules/jquery/dist/jquery.min.js\"></script>\n<script src=\"node_modules/socialcalc/dist/SocialCalc.js\"></script>\n<script>\n  const control = new SocialCalc.SpreadsheetControl();\n</script>\n```\n\nFor production browser delivery, `socialcalc/dist/SocialCalc.min.js` exposes the\nsame `SocialCalc` global and CommonJS value.\n\nThe formula, command, and save/load APIs also work without a DOM in Node.js.\n`InitializeSpreadsheetControl` is only needed for rendering the editor.\n\n### Dynamic arrays\n\nDynamic arrays are a deliberate first-class spill substrate, not merely a set\nof commands. The supported formulas are:\n\n- `SORT(range_or_array, [sort_column], [is_ascending], [sort_column2, is_ascending2, ...])`\n  Omitted column and direction default to the first column ascending; negative\n  directions sort descending.\n- `UNIQUE(range_or_array, [by_column], [exactly_once])`\n- `FILTER(array, include, [if_empty])` `include`'s height or width must match\n  `array`; a nonzero/error `include` element keeps/propagates, a zero or\n  blank element drops. An empty result returns `if_empty`, or `#CALC!` if\n  `if_empty` was omitted.\n- `SEQUENCE(rows, [columns], [start], [step])` `columns`/`start`/`step`\n  default to 1; `rows`/`columns` must be positive integers.\n- `TRANSPOSE(array)`\n- `SORTBY(array, by_array1, [sort_order1], [by_array2, sort_order2, ...])`\n  Each `by_array` must match `array`'s row or column count (all key pairs\n  share one orientation); omitted `sort_order` defaults to ascending (`1`),\n  `-1` descends, and ties preserve source order.\n- `CHOOSECOLS(array, col_num1, [col_num2, ...])` /\n  `CHOOSEROWS(array, row_num1, [row_num2, ...])` Negative indices count from\n  the end; `0` or an out-of-range index is `#VALUE!`.\n- `TAKE(array, rows, [columns])` / `DROP(array, rows, [columns])` Negative\n  counts operate from the end. `TAKE` clamps to the available extent; `DROP`\n  returns `#CALC!` if it would remove every row/column on an axis.\n- `HSTACK(array1, [array2, ...])` / `VSTACK(array1, [array2, ...])` Pads\n  shorter columns/rows with `#N/A`; bare scalars are accepted alongside\n  ranges.\n- `TOCOL(array, [ignore], [scan_by_column])` /\n  `TOROW(array, [ignore], [scan_by_column])` `ignore` is `0` (keep all),\n  `1` (skip blanks), `2` (skip errors), or `3` (skip both); `scan_by_column`\n  reads column-first when true.\n- `WRAPROWS(vector, wrap_count, [pad_with])` /\n  `WRAPCOLS(vector, wrap_count, [pad_with])` `vector` must be a single row\n  or column; the final wrap is padded with `pad_with` (default `#N/A`).\n- `EXPAND(array, rows, [columns], [pad_with])` `rows`/`columns` must each be\n  at least `array`'s corresponding extent; new cells are padded with\n  `pad_with` (default `#N/A`).\n\nEach result spills from its anchor. A collision with a non-empty, merged, or\nuser-owned cell returns `#SPILL!` and preserves the blocking cells. Spills are\nlimited to the `ZZ` column, 65,536 rows, and 100,000 cells. Spill children can\nbe selected and rendered, but are formula-owned and not directly editable.\nSet, paste, fill, sort, move, and merge operations protect spill ownership;\nstructural inserts and deletes rebuild spills. Full saves preserve spill state.\nCopying a range copies an anchor and re-spills it, while copying a spill child\ncopies its scalar value. For `UNIQUE(..., ..., TRUE)`, no matching result\nfollows the existing `#N/A` policy.\n\n### Conditional formatting\n\n`sheet.condfmtRules` is an ordered array of rules (index 0 = highest\npriority) attached to a range, evaluated in priority order for every\ncandidate cell. Supported rule types:\n\n- `cellis` — numeric/lexical comparison against `value1` (or `value1`..`value2`\n  for `op: \"between\"`) using operators `gt`, `ge`, `lt`, `le`, `eq`, `ne`,\n  `between`.\n- `textcontains`, `textbegins`, `textends` — substring match against `value1`.\n- `blank`, `nonblank` — cell value-type test.\n- `duplicate`, `unique` — occurrence count within the rule's own range.\n- `formula` — a custom boolean formula, relative-adjusted per target cell the\n  same way a copied/filled formula would be (via `OffsetFormulaCoords`), using\n  the rule's range top-left as the anchor.\n\nEach rule's `style` is `{font, color, bgcolor, bt, br, bb, bl}` — the same\npalette-index fields as a cell's own `font`/`color`/`bgcolor`/border\nattributes (`0` means unset), resolved only through `sheet.fonts`/\n`sheet.colors`/`sheet.borderstyles`. Style values are never raw CSS text.\n\nA rule with `stopIfTrue: true` halts evaluation for that cell once matched;\na rule with `stopIfTrue: false` still contributes any style field a\nhigher-priority matching rule left unset, and evaluation continues to the\nnext rule. Rendering overlays the resolved style onto the cell's computed\nCSS without mutating the underlying cell object, so it never interferes with\nthe cell's own persisted formatting and re-evaluates automatically on every\nrecalc/value change and re-render.\n\nRules are managed with the `condfmt` sheet command:\n\n- `condfmt add <id> <range>\\t<type>\\t<op>\\t<value1>\\t<value2>\\t<formula>\\t<stopIfTrue>\\t<font>\\t<color>\\t<bgcolor>\\t<bt>\\t<br>\\t<bb>\\t<bl>`\n- `condfmt update <id> <same tab-delimited fields>`\n- `condfmt delete <id>`\n- `condfmt move <id> up|down`\n\nAll four are full undo/redo-integrated commands, and a rule's `range` and\n`formula` are rewritten automatically by copy/fill/insert/delete/move\noperations, exactly like a cell's own formula. Rules persist through\nsave/load as `condfmt:` lines, with palette references translated through\nthe same compaction pass as cell/sheet style attributes. The bundled\n`SpreadsheetControl`'s \"Conditional Formatting\" toolbar tab provides a rule\nlist plus an add/edit/delete/reorder editor form built entirely on this\ncommand surface.\n\n### LET, LAMBDA, and lambda-array functions\n\n`LET` and `LAMBDA` add Excel-compatible local bindings and user-defined\nfunctions on top of the existing formula engine, with real lexical scope,\nclosures, and callable named lambdas:\n\n- `LET(name1, value1, [name2, value2, ...], calculation)` binds one or more\n  names to values sequentially (each later value/the final `calculation` can\n  reference every earlier name), evaluates each value exactly once, and\n  returns `calculation`. A later name of the same spelling shadows the\n  earlier one (innermost binding wins). Names may not be blank, a reserved\n  builtin function name used as the sole occupant of a scope frame without a\n  call, or shaped like a cell coordinate (`A1`, `$B$2`, ...) — the latter\n  keeps every formula-reference rewrite (copy/fill/move/insert/delete)\n  coord-only, so a bound name is never mistaken for a cell reference.\n- `LAMBDA([param1, param2, ...], calculation)` defines a function value.\n  Called immediately as `LAMBDA(...)(arg1, arg2, ...)`, bound to a name via\n  `LET` and invoked through that name (`LET(f, LAMBDA(x,x*x), f(4))`), or\n  stored in a workbook name (Name Manager / `sheet.names`) and called as\n  `MYFUNC(arg1, ...)` from any formula. A `LAMBDA` closes over its defining\n  `LET` scope, so nested/recursive/mutually-recursive definitions work\n  (`=LAMBDA(n,IF(n<=1,1,n*FACT(n-1)))` bound to the name `FACT`). Calling\n  with the wrong number of arguments is `#VALUE!`; a `LAMBDA` written as a\n  cell's entire formula without ever being invoked is also `#VALUE!` (it\n  isn't a plottable/storable scalar). Recursion depth is bounded (fails fast\n  with `#NUM!` well before the host JS call stack) rather than unbounded.\n- `MAP(array1, [array2, ...], lambda)` applies `lambda` element-wise across\n  one or more same-shaped arrays/ranges, producing a result of the same\n  shape.\n- `REDUCE(initial_value, array, lambda)` accumulates `lambda(accumulator,\nvalue)` left-to-right/top-to-bottom over `array`, starting from\n  `initial_value`, and returns the final accumulator.\n- `SCAN(initial_value, array, lambda)` is `REDUCE` but returns every\n  intermediate accumulator as an array the same shape as `array`, instead of\n  only the final value.\n- `BYROW(array, lambda)` / `BYCOL(array, lambda)` apply `lambda` to each row\n  (as a 1-row array) or column (as a 1-column array) of `array` and return a\n  single column/row of per-row/per-column results.\n- `MAKEARRAY(rows, cols, lambda)` builds a `rows` x `cols` array by calling\n  `lambda(row, col)` (1-based) for every cell. `rows`/`cols` must be positive\n  integers.\n\nEvery lambda-array function's result is a dynamic array and flows through\nthe same spill pipeline as `SORT`/`UNIQUE` above (anchor cell, `#SPILL!` on\ncollision, formula-owned spill children, save/copy/move semantics).\n\n## Trust boundary and host security\n\nSocialCalc has two rendering modes. The legacy mode preserves historical output\nfor trusted workbooks; the opt-in mode applies a security policy to content from\nuntrusted or third-party sheets.\n\n### Legacy mode: trusted workbooks only\n\n`SocialCalc.Callbacks.untrustedContent` defaults to `false`. In this mode,\nSocialCalc preserves pre-3.1.0 rendering behavior:\n\n- `text-html` and the `@r` custom-format placeholder can emit raw HTML.\n- `Callbacks.expand_wiki` / `Callbacks.expand_markup` output and text-custom\n  format templates can emit markup.\n- `text-url`, `text-image`, `text-link`, and the `@u` custom placeholder can\n  create links or images without scheme validation.\n\nTreat workbook cells and save strings as hostile input unless the host has\nalready established their trust. Legacy mode is not safe for arbitrary uploads,\nshared documents, or API-provided sheets.\n\n### Opt-in untrusted-content mode\n\nEnable the policy before rendering an untrusted workbook:\n\n```js\nSocialCalc.Callbacks.untrustedContent = true;\n```\n\nWith the policy enabled:\n\n- Raw-HTML sinks are escaped by default.\n- A host-supplied `sanitizeHtml` callback may return safe rich HTML.\n- Non-`data:` link and image URLs are checked against\n  `allowedUrlSchemes`, whose default is `['http:', 'https:', 'mailto:']`.\n- `data:` URLs are checked separately and only against\n  `allowedDataMimeTypes`, whose default is `[]`; therefore all `data:` URLs\n  are rejected until the host explicitly allows MIME types.\n- The formula-widget `cell_html` path is disabled because its sheet-authored,\n  event-capable markup cannot be safely escaped field by field.\n\nExample host policy:\n\n```js\nSocialCalc.Callbacks.untrustedContent = true;\nSocialCalc.Callbacks.securityPolicy = {\n  allowedUrlSchemes: [\"http:\", \"https:\", \"mailto:\"],\n  allowedDataMimeTypes: [\"image/png\", \"image/jpeg\"],\n  sanitizeHtml(html) {\n    return DOMPurify.sanitize(html);\n  },\n};\n```\n\nThe sanitizer contract is `(html: string) => string`. SocialCalc does not bundle\nor validate a sanitizer; the host owns its correctness. The sanitizer is used\nonly for raw-HTML sinks while untrusted-content mode is active. URL validation\nremains separate.\n\n`SocialCalc.SafeUrlForRender(rawurl, policy?)` and\n`SocialCalc.EscapeUntrustedHtml(html, policy?)` are exported for host-created\nmarkup. `SafeUrlForRender` returns an **HTML-attribute-escaped** string: for\nexample, `&` becomes `&amp;`. Use that result only inside markup that an HTML\nparser will parse. Do not persist it in a sheet or assign it directly to\n`Element.href` / `Element.src`, where the entity would remain literal.\n\nThe complete sink inventory and policy disposition live in\n[`docs/security-sink-inventory.md`](docs/security-sink-inventory.md). Regardless\nof mode, the host must still apply an appropriate Content Security Policy and\nsanitize any content rendered outside SocialCalc's enumerated sinks.\n\n## Package and distribution contract\n\n`package.json` declares `\"type\": \"commonjs\"`, with:\n\n- `main`: `dist/SocialCalc.js`\n- `types`: `dist/SocialCalc.d.ts`\n- normal and minified UMD bundles\n- the generated stylesheet and source stylesheet\n- public declaration files\n- license and README files\n\n`prepack` always runs `vp build --minify`; a package archive never relies on a\nstale local minified bundle. `dist/SocialCalc.min.js` is generated and\nGit-ignored. The tracked `dist/SocialCalc.js` and `dist/socialcalc.css` are also\ngenerated artifacts: change their `js/` or `css/` inputs, then regenerate them\nrather than editing generated output by hand.\n\n`vp run test:package-contract` packs a fresh tarball and checks the pinned\n21-member allowlist, package-size ceilings, declaration consumption, and\nbehavior/API-shape parity across:\n\n1. root CommonJS `require(\"socialcalc\")`;\n2. deep minified CommonJS loading;\n3. native ESM default import;\n4. normal browser-global execution; and\n5. minified browser-global execution.\n\nThe release workflow packs twice and requires byte-identical archives before it\nretains one candidate artifact.\n\n## Development\n\n### Prerequisites\n\n- [`vp` (Vite+)](https://viteplus.dev/) for dependency management, builds,\n  Vitest, formatting, linting, and the managed Node/Bun toolchain.\n- Install the lockfile with `vp install --frozen-lockfile` for release-equivalent\n  work, or `vp install` during ordinary local development.\n- Bun 1.3.14 is pinned by `bun.lock` and managed by Vite+; use `vp install`,\n  `vp add`, `vp remove`, and `vp update` instead of direct `bun` package commands.\n- Dafny on `PATH` for Dafny checks; CI uses Dafny 4.9.0.\n- Full Lean builds additionally need Lean 4.24.0 and sibling checkouts at\n  `../velvet`, `../loom`, and `../LemmaScript`. Lake pins Z3 4.15.4 and cvc5\n  1.3.1.\n\n### Common commands\n\n| Command                             | Contract                                                                                                                                                                           |\n| ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `vp build`                          | Build the ordered UMD bundle and CSS; canonicalize tracked `dist/SocialCalc.js`.                                                                                                   |\n| `vp build --minify`                 | Build normal and minified UMD bundles.                                                                                                                                             |\n| `vp check --fix`                    | Apply repository formatting and safe lint fixes, then typecheck.                                                                                                                   |\n| `vp check`                          | Check formatting, warning-free type-aware lint, and types without modifying files.                                                                                                 |\n| `vp dev`                            | Open the local browser workbench at the repository root. It uses tracked `dist/SocialCalc.js`, so run `vp build` after changing JavaScript source before refreshing the workbench. |\n| `vp run typecheck:strict`           | Check the narrower strict build configuration.                                                                                                                                     |\n| `vp test`                           | Build a fresh instrumented UMD, run Vitest, and enforce 100/100/100/100 Istanbul coverage.                                                                                         |\n| `vp run test`                       | Build the plain shipping bundle first, then run the default Istanbul test gate.                                                                                                    |\n| `bun run test:bun`                  | Run the same corpus in isolated native Bun workers; no authoritative coverage aggregate.                                                                                           |\n| `vp run check:test-credibility`     | Reject tautologies and unexplained code-free catches in tracked Vitest and Playwright tests.                                                                                       |\n| `vp run check:coverage-attribution` | Prove source-map attribution remains monotonic and does not duplicate the bundle.                                                                                                  |\n| `vp run test:coverage`              | Run the explicit source-attributed V8 diagnostic with shared release floors.                                                                                                       |\n| `vp run test:coverage:merged`       | Merge unit V8 coverage with real Chromium V8 coverage and enforce the merged floors.                                                                                               |\n| `vp run test:browser`               | Run Playwright against Chromium, Firefox, and WebKit.                                                                                                                              |\n| `vp run test:package-contract`      | Pack and exercise the exact npm consumer contract.                                                                                                                                 |\n| `vp run test:ethercalc-canary`      | Networked release-only canary against the pinned EtherCalc checkout.                                                                                                               |\n| `vp pm pack --out <file.tgz>`       | Run `prepack` and create the candidate npm archive.                                                                                                                                |\n\nFor the local workbench, run `vp build` and then `vp dev`. The root page opens\nthe editable spreadsheet workbench and loads the tracked `dist/SocialCalc.js`;\nrebuild with `vp build` after JavaScript source changes before using `vp dev`\nagain.\n\n### Source and build model\n\nThe shipping implementation under `js/` is **global-script TypeScript**, not an\nES-module graph. All files share the factory-local `SocialCalc` namespace.\n`build.ts` exports the Vite plugin configured by `vite.config.ts`, owns the\nordered source list, prefers `.ts` implementations, strips types with Oxc,\npreserves license preambles, and wraps the result as UMD. Its wrapper strings\nare inline because they are not standalone source modules.\n\nDefault `vp test` global setup builds `dist/SocialCalc.instrumented.js` from\nthe current source tree before workers start. The shared loader executes that\nUMD through `vm.Script`; Istanbul collects its source counters and enforces\n**100 / 100 / 100 / 100** statements, branches, functions, and lines across\nall sixteen shipping modules and the twenty LemmaScript facades.\n\n`vp run test:coverage` remains the explicit V8 diagnostic. Its build appends a\nsource-map reference to the generated UMD so V8 ranges can be attributed back\nto `js/*.ts`; plain builds remove stale coverage maps and instrumented bundles.\nThe V8 and merged-browser thresholds live in `coverage-thresholds.mjs`:\n\n- unit V8 global floors: **98 / 80 / 98 / 98**;\n- merged unit + Chromium floors: **98 / 84 / 98 / 98**;\n- per-file floors for the seven critical shipping sources listed there.\n\nBun runs the complete corpus through `bun run test:bun`, but Bun's native\ncoverage does not collect the `vm.Script` UMD and has no statement or branch\nmetrics. It is an execution-compatibility check, not the release coverage gate.\n\n### Test architecture\n\nVitest files import from `vite-plus/test`. `test/helpers/socialcalc.ts` compiles\nthe generated UMD bundle once per isolated test worker and shares one SocialCalc\ninstance within that file. Default runs load the fresh instrumented UMD; explicit\n`SOCIALCALC_COVERAGE=1` V8 runs load the plain UMD plus its sourcemap. Tests must\ninstall and restore mutable state in their own hooks. Do not restore\ncache-busting dynamic imports: Vite transforms each query as another copy of the\nroughly 720 KB bundle and can exhaust worker memory.\n\nUse the narrowest layer that proves the behavior:\n\n- Pure helpers: direct unit tests.\n- Sheet commands and undo/redo: `ScheduleSheetCommands` / `loadSocialCalc()`\n  scenarios with observable cells, formulas, names, and status transitions.\n- DOM behavior that the fake DOM models faithfully: Vitest UI helpers.\n- Layout, native browser parsing, active-content safety, keyboard/mouse\n  interaction, and normal/minified parity: Playwright.\n- Cross-version compatibility: the pinned, offline\n  `test/fixtures/oracle-3.0.8` fixture. Tests never fetch the oracle at runtime.\n- Package delivery: the tarball-first package contract and EtherCalc canary.\n\nThe credibility guard scans tracked `test/**/*.test.ts` and\ne2e `e2e/**/*.spec.ts`. A cleanup-only catch may contain comments only when the\ncomment gives a real explanation; a placeholder annotation is not an escape\nhatch.\n\n## Formula-reference compatibility\n\n`js/formula-ref.ts` is the shipping implementation for\n`OffsetFormulaCoords`, `AdjustFormulaCoords`, `ReplaceFormulaCoords`, and A1\ncoordinate algebra. Unless a command-level spreadsheet scenario proves a bug,\ncurrent SocialCalc behavior is the compatibility oracle.\n\nRequired matrix for formula-reference changes:\n\n```bash\nvp build\nvp test run test/formula-rewrite-cases.test.ts test/formula-rewrite-regressions.test.ts\nvp check\n```\n\nCompatibility rules:\n\n- `$` markers lock copy/fill movement, not structural insert/delete.\n- Sheet-qualified ranges intentionally keep `sheetref` sticky through `:`.\n- The supported maximum column is `ZZ` (702); shifts past it become `#REF!`.\n- Rectangular fills increment independently per row or column.\n- Interactive fills must capture `range2` before clearing it.\n- Delete undo restores changed named-reference definitions as well as formulas.\n- Command behavior requires command-level tests; helper-only assertions are not\n  sufficient evidence.\n\nThe primary fixtures and regressions are:\n\n- `test/fixtures/formula-rewrite-cases.json`\n- `test/formula-rewrite-cases.test.ts`\n- `test/formula-rewrite-regressions.test.ts`\n- `test/command-boundary-regressions.test.ts`\n- `test/filldown-persistence.test.ts`\n- `test/sheet-coverage-b.test.ts`\n\n## LemmaScript verification\n\nShipping global scripts cannot be extracted directly by LemmaScript. The\nexported `lemma/*.ts` facades mirror selected pure behavior, Dafny/Lean reason\nabout those facades, and Vitest compares them with the shipping bundle. This is\na formal boundary around the named policies, not a proof of the full DOM or\ncommand system.\n\n| Facade                   | Verified surface                                                         | Dafny VCs |\n| ------------------------ | ------------------------------------------------------------------------ | --------: |\n| `lemma/a1.ts`            | A1 clamp/coordinate algebra, absolute references, overflow `#REF!`       |        26 |\n| `lemma/eval-ops.ts`      | `/` and `&` type/error propagation                                       |         4 |\n| `lemma/lookup-result.ts` | exact-before-wildcard-before-miss lookup precedence                      |         3 |\n| `lemma/spill.ts`         | dynamic-array spill rectangle/claim/resize/UNIQUE/SORT policies          |        15 |\n| `lemma/protect.ts`       | sheet/cell protection editability policy (readonly, protected, unlocked) |         2 |\n\nTotal: **50 Dafny verification conditions**. The complete lookup table row scan\nremains runtime-tested.\n| Facade | Verified surface | Dafny VCs |\n| ------------------------ | ------------------------------------------------------------------ | --------: |\n| `lemma/a1.ts` | A1 clamp/coordinate algebra, absolute references, overflow `#REF!` | 26 |\n| `lemma/eval-ops.ts` | `/` and `&` type/error propagation | 4 |\n| `lemma/lookup-result.ts` | exact-before-wildcard-before-miss lookup precedence | 3 |\n| `lemma/spill.ts` | dynamic-array spill rectangle/claim/resize/UNIQUE/SORT policies | 15 |\n| `lemma/condfmt.ts` | conditional-formatting rule match and ordered stop/precedence | 8 |\n\nTotal: **56 Dafny verification conditions**. The complete lookup table row\nscan and rule-scanning/formula-evaluation runtime remain runtime-tested.\n\n| Command                     | Purpose                                                             |\n| --------------------------- | ------------------------------------------------------------------- |\n| `vp run verify:dafny:gen`   | Generate `.dfy.gen` models.                                         |\n| `vp run verify:dafny:regen` | Three-way merge regenerated models into proof-bearing `.dfy` files. |\n| `vp run verify:dafny`       | Check all manifest facades with Dafny.                              |\n| `vp run verify:lean`        | Generate Lean artifacts and assert the required set is non-empty.   |\n| `vp run verify:lean:build`  | Run `lake build`; requires sibling repositories and solvers.        |\n| `vp run verify:both`        | Dafny check plus Lean generation smoke; not a full Lake build.      |\n\nHand-maintained artifacts are `lemma/*.ts`, `lemma/*.dfy`,\n`lemma/*.proof.lean`, and `lemma/a1.spec.lean`. Files ending in `.dfy.gen`,\n`.types.lean`, and `.def.lean` are generated. Do not copy generated Dafny files\nover proof-bearing models; use the regeneration command so proof bodies survive.\n\n## Mutation testing\n\nStryker mutates thirteen of the sixteen shipping modules with no mutator\nexclusions. `js/workbook.ts`, `js/socialcalcdatavalidation.ts`, and\n`js/workbook-ui.ts` ship in the bundle but carry no measured baseline yet.\nString, regex, CSS, and format-table mutations remain observable behavior and\nare scored rather than filtered.\n\nStryker builds one all-mutant UMD in each sandbox. The native Vitest runner\nkeeps isolated workers alive and uses per-test coverage for runtime mutants.\n`formatnumber2.ts` and `socialcalcconstants.ts` use isolated command runs so\neach active mutant re-evaluates their top-level tables and defaults in a fresh\ntest process without rebuilding or racing on the bundle. Because shipping\nsources are concatenated into a `vm.Script` bundle, source-to-test selection\ncomes from `stryker-file.mjs`, not Vitest's import graph.\n\nModes:\n\n- `MUTATE_SCOPE=critical vp run mutate`: PR gate for `formula-parse.ts`,\n  `formula-operand.ts`, and `formula-ref.ts` against a deterministic test set.\n- `MUTATE_TARGET=js/<module>.ts vp run mutate`: one module with its owned tests.\n- `vp run mutate:all`: all thirteen modules sequentially.\n- `vp run mutate:file js/<module>.ts [start-end]`: sandboxed local iteration.\n  A line-range run writes to `<module>-partial`, uses an exact-range cache,\n  disables the full-module break floor, and cannot be release evidence.\n- `vp run mutate:release-gate`: validate fresh reports and measured baselines\n  for every module.\n\nCurrent registered baselines (exact-module measurements on 2026-07-13,\n2026-07-14, 2026-07-19, 2026-07-22, or 2026-07-23):\n\n| Module                            |   Score | Floor | Mutants |\n| --------------------------------- | ------: | ----: | ------: |\n| `socialcalcconstants.ts`          | 100.00% |   100 |     679 |\n| `formula-parse.ts`                |  97.80% |    97 |     636 |\n| `formula-ref.ts`                  |  97.22% |    97 |     467 |\n| `formula-operand.ts`              |  94.36% |    94 |     337 |\n| `formatnumber2.ts`                |  93.78% |    93 |   1,399 |\n| `pivot.ts`                        |  78.96% |    78 |   1,022 |\n| `formula1.ts`                     |  78.11% |    78 |  13,766 |\n| `socialcalcviewer.ts`             |  73.33% |    73 |     375 |\n| `socialcalcpopup.ts`              |  61.90% |    61 |     937 |\n| `socialcalc-3.ts`                 |  57.39% |    57 |   7,273 |\n| `socialcalcspreadsheetcontrol.ts` |  53.80% |    53 |   2,987 |\n| `socialcalctableeditor.ts`        |  45.28% |    45 |   5,711 |\n\nThe corrected build-once lifecycle initially invalidated the prior\n`formula1.ts` floor of 95: its 2026-07-14 exact report scored 61.44% under a\nnarrower owned-test map. On 2026-07-23 an expanded ownership map remeasured the\nfull module at 78.11% (13,766 mutants) from two complementary line-range shards\nwith no survivors filtered or dispositioned away; the floor ratchets to 78.\n\nFloors are the integer floor of a real isolated measurement. `minimumMutants`\npins each report's complete-module denominator, so a narrowed report cannot\npass. These are honest ratchets, not claims that low scores are desirable.\nReports live under `reports/mutation/<scope>/`. Equivalent critical mutants\nrequire explicit, source-specific proofs in `stryker-mutation-disposition.json`;\nthe registry is not an exclusion list.\n\n## Release process\n\nA `v*` tag starts five independent gates in `.github/workflows/release.yml`:\n\n1. core typecheck/lint/build/test/credibility/formal/audit checks;\n2. merged coverage;\n3. full thirteen-module mutation testing;\n4. Chromium/Firefox/WebKit Playwright tests; and\n5. the pinned EtherCalc candidate-tarball canary.\n\nPackaging waits for all five, reruns the package contract, packs twice, rejects\nnon-deterministic archives, and records SHA-256 plus npm integrity for one exact\nartifact. A tag push **does not publish**.\n\nPublishing is a separate manual dispatch against the real tag with confirmation\n`PUBLISH`, protected by the `npm-publish` GitHub Environment. It uses npm Trusted\nPublishing/OIDC without a stored token, stages and checksum-verifies a draft\nGitHub Release before the irreversible npm publish, verifies release\nimmutability afterward, and finally installs the registry version for a real\ncommand/formula/save-load smoke test. The workflow header documents the required\nnpm trusted-publisher, environment-reviewer, and GitHub release-immutability\nsettings.\n\nThe blocking audit rejects high/critical findings. One accepted moderate,\ndevelopment-only `uuid` finding is documented with an owner and expiry\ncondition in `docs/security-disposition.json`; no advisory package is included\nin the npm tarball.\n\n## Licensing\n\nThe aggregate package license is\n`(CPAL-1.0 AND Artistic-2.0 AND MPL-2.0)`. File headers remain authoritative.\n\n### Common Public Attribution License 1.0\n\n- `socialcalcspreadsheetcontrol.ts`\n- `socialcalctableeditor.ts`\n- `socialcalcviewer.ts`\n\n### Artistic License 2.0\n\n- `formatnumber2.ts`\n- `formula-parse.ts`\n- `formula-operand.ts`\n- `formula-ref.ts`\n- `formula1.ts`\n- `socialcalc-3.ts`\n- `socialcalcconstants.ts`\n- `socialcalcpopup.ts`\n\n### Mozilla Public License 2.0\n\n- `images/sc_*.png`\n","readmeFilename":"README.md"}