Convert spaces to tabs in engine.js and fix indentation of processInput
Refactor processInput to carve out a spot for the optimized engine.
Remove performance stuff to fix Safari; fix indentation.
Move rigidbody preservation over to a fixed-memory scheme.
Reuse regular requiremovement/cancel backup for rigidbody backup purposes.
Tried implementing an incremental tryApply.

This is slower than the old style (probably due to creating and destroying a closure?), and it was a bit bug prone -- the scariest part was that replacements had to be (redundantly) checked for validity each time. This is probably an artifact of two things:

1. For multi-pattern rules, a match index found for an earlier pattern can be invalidated by replacements happening in later patterns; but there's no affordance now for resetting the counters of earlier patterns.
2. For patterns with ellipses, multiple candidates are generated and replacements for earlier ones can invalidate later ones.

It might be possible to fix (1) by checking, after doing a replacement, if the previous patterns are still satisfied (from the first down towards the second-to-last); if not, break up to that level in the loop.
Fixing (2) requires turning the ellipsis matching a bit inside out, so the application function is called once for each instantiation of the ellipsis.
Loop generation for rule tryApply.

Inlining the apply function should nix the last allocations. Using the row mask and column mask arrays could be a good optimization to let us skip a bunch of indices at once; the latter would be easy to code up. See how the generated cellMatchFunctions worked.
Use the mask optimizations for traversing rows and columns more efficiently.
Inline apply by one level
Shuffling around field accesses for minor speedups.
Code generation for cell replacement and matching.
Check for existence of forceRegenImages
Merge WIP pzlvm for about a 20-30 percent speedup
Code generation for command queuing.
Variable generation for commands. No more command queue.
Merge command queuing code generation.
Refactor solvers slightly. Introduce dummy free-move solver, currently the same as the cautious solver.
WIP broken free move solver
Switched to a simpler hash and got a 50 percent or so speedup, reducing memory allocations in the process
Hack around a weird case where level rule execution counts would be messed up