NPU5TTOXP2YIHHCCBXLLDHBBCC2TAINCBOZUMCRTPHM4WXQHBUKQC
EFSO7K7SWZTGY6HPRHJYPJ5SDA2P4ZQ77FBIFX72IAZ33VEY6ZOQC
PRYVVWOS47BUSXKAROAKMCOBAU7J4344YR5EOACFLIUL2JKBMVCQC
37ZVW7SWNUU3ZAE3MRPNJZIOPCHQL6UCN4T4PKSF5AHGIZNVILXAC
MVXKPBHZNTJKXVDTOTPGWTLTLBO76RXGYWATWIXIL66DKVMVLDWAC
Z5HLXU4PJWWJJDBCK52NBD6PIRIA3TAN2BKZB5HBYFGIDBX4F5HAC
NHNP76LGNIVNIDMSDILAKEVSWFQ4LKNCYXVQEGKKJ75TSRPEBVEQC
BULPIBEGL7TMK6CVIE7IS7WGAHGOSUJBGJSFQK542MOWGHP2ADQQC
ZPUQSPQPQFVRUIHGLAWW3IDBYODIWDHO62HAC3WWF5TM3CIJGHNQC
TGHAJBESCIEGWUE2D3FGLNOIAYT4D2IRGZKRXRMTUFW7QZETC7OAC
MUJTM6REGQAK3LZTIFWGJRXE2UPCM4HSLXQYSF5ITLXLS6JCVPMQC
SVJZZDC3K6AKAXHGRNAZKRE2ZXEKJANNLG7LSSUZJARFBL5F7C4AC
MXA3RZYKUI4UF2ISY7JEF6VKX6NOPZMZH5SLLCZHRJKFIXXXDPSAC
ODLKHO7BO2AODYO2OEQ6D4NSNBT5GR3CKLUXWMDLRYXL7DJOI7BAC
76TK2E3QZ3CWH3VOQVI7SSZ3LN5LTTQQS26Y6YUSMVC7BDU4ZKZAC
WLJCIXYMSTCNSYCFOEBQNDLBZ5D2Z3WTF4E4WYL5CFGIJ434FKNQC
ILOA5BYFTQKBSHLFMMZUVPQ2JXBFJD62ERQFBTDK2WSRXUN525VQC
YJJ4X4JGABMVA5JBQW5UAWI543P3Y7NDVFTOHA6LIDA5KSFGUFNQC
5ZA3BRNYWKSGEBJ4JLA4UBC3LJPT5JBWYCU7PQYRSGX6MJMEWDIQC
LXTTOB33N2HCUZFIUDRQGGBVHK2HODRG4NBLH6RXRQZDCHF27BSAC
function Text.pos_at_start_of_cursor_screen_line(State)
Text.populate_screen_line_starting_pos(State, State.cursor1.line)
local cursor_line_cache = State.line_cache[State.cursor1.line]
for i=#cursor_line_cache.screen_line_starting_pos,1,-1 do
local spos = cursor_line_cache.screen_line_starting_pos[i]
if spos <= State.cursor1.pos then
function Text.pos_at_start_of_screen_line(State, loc1)
Text.populate_screen_line_starting_pos(State, loc1.line)
local line_cache = State.line_cache[loc1.line]
for i=#line_cache.screen_line_starting_pos,1,-1 do
local spos = line_cache.screen_line_starting_pos[i]
if spos <= loc1.pos then
function Text.pos_at_start_of_cursor_screen_lineB(State)
local x = Margin_left + Text.screen_line_width(State, State.cursor1.line, #line_cache.screen_line_starting_pos) + AB_padding
Text.populate_screen_line_starting_posB(State, State.cursor1.line, x)
local cursor_line_cache = State.line_cache[State.cursor1.line]
for i=#cursor_line_cache.screen_line_starting_posB,1,-1 do
local sposB = cursor_line_cache.screen_line_starting_posB[i]
if sposB <= State.cursor1.posB then
function Text.pos_at_start_of_screen_lineB(State, loc1)
local x = Margin_left + Text.screen_line_width(State, loc1.line, #line_cache.screen_line_starting_pos) + AB_padding
Text.populate_screen_line_starting_posB(State, loc1.line, x)
local line_cache = State.line_cache[loc1.line]
for i=#line_cache.screen_line_starting_posB,1,-1 do
local sposB = line_cache.screen_line_starting_posB[i]
if sposB <= loc1.posB then