change all instances of lock (runs) to lock (threadlock) so that there's just one master threadlock that's used when accessing / editing the runs collection.
All public methods that access or edit the runs collection are now protected by the threadlock.
PLEASE tell me I didn't accidentally cause a deadlock here...
When the asks HMA to recognize something as text, be smarter about working around things HMA thinks it has found.
* Be able to find text despite false PCSRun/NoInfoRun runs.
* Be able to find text despite false pointers
* Make sure that this new logic doesn't accidentally clear tables.
Normally, HMA allows you to extend a table by typing a `+` directly after the table. But for tables that have an end-token, they should instead be expanded by typing `+` over the end token `[]`.
also, `GetIndexOfNearestAddress` shouldn't ever find a table with distance 0, because that's not what we're wanting to find: we want the table with the nearest values so we can do a cross-reference, and anything with this exact address is likely missing the other games we're looking for.
All level-move runs after expansion should start at a 4-byte aligned address. This worked fine for any run that got repointed... but _didn't_ work for runs that were expanded _without_ being repointed. It works correctly now.
* when a stream shrinks, clear the old end token as well as the old data
* when parsing a stream with an end token, don't allow elements to have values that would look like end tokens (usually element 0)
* only goto moved data if the moved data was selected, as opposed to if the moved data was on-screen.
Expanding a table where the last element has a named anchor adds another pointer to that anchor. Some format types, such as palettes, do a ClearFormat when adding the new run. This is reasonable, but causes us to lose any custom name attached to those elements, which update their pointers to point to null and adds the name to the unmapped anchor names list.
In this case, we need to track the name before we clear the format, so that when we add the new run, we can add the name as well.
A recent change to the model to make it update related arrays when doing CompleteArrayExtension caused it to double-increment array length. Added a test to verify that the fairy script adds exactly one type and fixed the issue.
after the UI updates, this text appears in a popup menu that has more available horizontal space. We don't need to truncate "data.poke" anymore, so remove the truncation logic.