"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var utils_1 = require("./utils");
var cross_1 = require("./cross");
var asmproc_1 = require("./asmproc");
var TokensKeywords = {};
var TokensText = {};
var Ascii = {};
var basic_row = 0;
var BasicCompact;
BasicCompact = false;
InitTokens();
function IsBasicStart(Linea) {
    return Linea.toUpperCase().AnsiPos("BASIC START") > 0;
}
exports.IsBasicStart = IsBasicStart;
function IsBasicEnd(Linea) {
    return Linea.toUpperCase().AnsiPos("BASIC END") > 0;
}
exports.IsBasicEnd = IsBasicEnd;
function IsBasic(L, Linea, nl) {
    Linea = utils_1.UpperCase(utils_1.Trim(Linea) + " ");
    var StuffLine;
    var si = -1;
    // compact lines with no no line numbers into the previous numbered line
    if (IsBasicStart(Linea)) {
        for (var t = nl + 1; t < L.Count; t++) {
            var Linx = utils_1.Trim(L.Strings[t]);
            if (IsBasicEnd(Linx))
                break;
            if (StartWithNumber(Linx)) {
                si = t;
            }
            else {
                // append with ":" a line without line number
                if (si == -1) {
                    asmproc_1.error("BASIC line continuing from no line number in line " + t);
                    break;
                }
                L.Strings[si] = L.Strings[si].trim() + ":" + Linx; // \r is here
                L.Strings[t] = "";
            }
        }
    }
    if (Linea.AnsiPos("BASIC START") > 0) {
        if (Linea.AnsiPos("COMPACT") > 0)
            BasicCompact = true;
        L.Strings[nl] = "";
        for (var t = nl + 1; t < L.Count; t++) {
            Linea = utils_1.UpperCase(utils_1.Trim(L.Strings[t]));
            if (Linea.AnsiPos("BASIC END") > 0) {
                L.Strings[t] = cross_1.BYTE("basic_row_" + basic_row, "0", "0");
                return true;
            }
            L.Strings[t] = TranslateBasic(utils_1.Trim(L.Strings[t]) + " ");
        }
        asmproc_1.error("BASIC START without BASIC END");
    }
    return false;
}
exports.IsBasic = IsBasic;
function StartWithNumber(Linea) {
    var LineNumber = utils_1.GetParm(Linea, " ", 0).trim();
    if (LineNumber == "")
        return false;
    var numlin;
    try {
        numlin = LineNumber.ToInt();
        if (numlin < 0 || isNaN(numlin))
            return false;
    }
    catch (ex) {
        return false;
    }
    return true;
}
function MatchToken(Linea, inquote, inrem) {
    var keywords = Object.keys(TokensKeywords);
    for (var t = 0; t < keywords.length; t++) {
        var keyword = keywords[t];
        var index = TokensKeywords[keyword];
        var l = keyword.Length();
        if (l > 0 && Linea.SubString(1, l).toUpperCase() === keyword) {
            // console.log(`matched token: ${Tokens[t]}`);
            Linea = Linea.SubString(l + 1);
            var Matched = index + ",";
            // REM or DATA
            if (index == 143 || index == 131)
                inrem = true;
            return { Matched: Matched, Linea: Linea, inquote: inquote, inrem: inrem };
        }
    }
    return undefined;
}
function MatchTextToken(Linea, inquote, inrem) {
    // match text
    var keys = Object.keys(TokensText);
    for (var t = 0; t < keys.length; t++) {
        var text = keys[t];
        var index = TokensText[text];
        var l = text.Length();
        if (l > 0 && Linea.SubString(1, l).toUpperCase() === text) {
            // console.log(`matched text: ${Tokens[t]}`);
            Linea = Linea.SubString(l + 1);
            var Matched = "";
            if (!(BasicCompact == true && index == 32)) {
                Matched = index + ",";
            }
            if (index == 34)
                inquote = true;
            return { Matched: Matched, Linea: Linea, inquote: inquote, inrem: inrem };
        }
    }
    return undefined;
}
function MatchSymbol(Linea, inquote, inrem) {
    function cifra(Symbol, c) {
        // (((n % 1000) - (n % 100)/100 + $30)
        var n = Math.pow(10, c + 1);
        var mille = String(n);
        var cento = String(n / 10);
        var n_mod_mille = cross_1.parens(cross_1.mod(Symbol, mille));
        var n_mod_cento = cross_1.parens(cross_1.mod(Symbol, cento));
        var n_mod_mille_meno_n_mod_cento = cross_1.parens(n_mod_mille + "-" + n_mod_cento);
        var div_cento = n_mod_mille_meno_n_mod_cento + "/" + cento;
        var all = cross_1.parens(div_cento + "+$30");
        return all;
    }
    // match reference to symbol {symbol}, rendered as a 4 character basic number
    if (Linea.SubString(1, 1) == "{") {
        var x = Linea.AnsiPos("}");
        if (x > 0) {
            var Symbol_1 = Linea.SubString(2, x - 2);
            Linea = Linea.SubString(x + 1);
            var prima_cifra = cifra(Symbol_1, 0);
            var seconda_cifra = cifra(Symbol_1, 1);
            var terza_cifra = cifra(Symbol_1, 2);
            var quarta_cifra = cifra(Symbol_1, 3);
            var quinta_cifra = cifra(Symbol_1, 4);
            var Matched = quinta_cifra + "," + quarta_cifra + "," + terza_cifra + "," + seconda_cifra + "," + prima_cifra + ",";
            return { Matched: Matched, Linea: Linea, inquote: inquote, inrem: inrem };
        }
    }
    return undefined;
}
function MatchQuote(Linea, inquote, inrem) {
    if (inquote) {
        var codes = Object.keys(Ascii);
        for (var j = 0; j < codes.length; j++) {
            var code = codes[j];
            var t = Ascii[code];
            var l = code.Length();
            if (l > 0 &&
                ((l == 1 && Linea.SubString(1, l) === code)
                    ||
                        (l > 1 && Linea.SubString(1, l).toUpperCase() === utils_1.UpperCase(code)))) {
                // console.log(`matched string text: ${Ascii[t]}`);
                Linea = Linea.SubString(l + 1);
                var Matched = t + ",";
                if (t == 34)
                    inquote = false;
                return { Matched: Matched, Linea: Linea, inquote: inquote, inrem: inrem };
            }
        }
    }
    return undefined;
}
function MatchRem(Linea, inquote, inrem) {
    // within rem, matches to the end of line
    // TODO match {}
    if (inrem) {
        // console.log("we are in rem");
        var codes = Object.keys(Ascii);
        for (var j = 0; j < codes.length; j++) {
            var code = codes[j];
            var t = Ascii[code];
            var l = code.Length();
            if (l > 0 && Linea.SubString(1, l).toUpperCase() == utils_1.UpperCase(code)) {
                // console.log(`matched REM text: ${Ascii[t]}`);
                Linea = Linea.SubString(l + 1);
                var Matched = t + ",";
                return { Matched: Matched, Linea: Linea, inquote: inquote, inrem: inrem };
            }
        }
    }
    return undefined;
}
function TranslateBasic(Linea) {
    function advance(match) {
        if (match !== undefined) {
            Compr += match.Matched;
            Linea = match.Linea;
            inquote = match.inquote;
            inrem = match.inrem;
            return true;
        }
        return false;
    }
    // skip empty lines
    if (utils_1.Trim(Linea) == "")
        return "";
    var G = utils_1.GetToken(Linea, " ");
    Linea = G.Rest;
    var LineNumber = utils_1.Trim(G.Token);
    if (LineNumber == "")
        asmproc_1.error("syntax error");
    var numlin = LineNumber.ToInt();
    var Compr = "";
    var inquote = false;
    var inrem = false;
    Linea = utils_1.Trim(Linea);
    for (;;) {
        if (Linea == "")
            break;
        if (!inquote && !inrem) {
            var match = MatchToken(Linea, inquote, inrem);
            if (!advance(match)) {
                var match_1 = MatchTextToken(Linea, inquote, inrem);
                if (!advance(match_1)) {
                    var match_2 = MatchSymbol(Linea, inquote, inrem);
                    if (!advance(match_2)) {
                        console.log("unrecognized keyword token: " + Linea);
                        asmproc_1.error("unrecognized keyword token: " + Linea);
                    }
                }
            }
        }
        else if (inquote) {
            // within quote, matches everything to next quote (")
            var match = MatchQuote(Linea, inquote, inrem);
            if (!advance(match)) {
                console.log("unrecognized quoted text token: " + Linea);
                asmproc_1.error("unrecognized quoted text token");
            }
        }
        else if (inrem) {
            // inrem (or data)
            var match = MatchSymbol(Linea, inquote, inrem);
            if (!advance(match)) {
                var match_3 = MatchRem(Linea, inquote, inrem);
                if (!advance(match_3)) {
                    console.log("unrecognized rem/data text token: " + Linea);
                    asmproc_1.error("unrecognized rem/data text token");
                }
            }
        }
    }
    Compr = Compr + "0";
    var Label = "basic_row_" + basic_row;
    var NextLabel = "basic_row_" + (basic_row + 1);
    var ReplaceTo = cross_1.BYTE(Label, cross_1.parens(cross_1.lobyte(NextLabel)), cross_1.parens(cross_1.hibyte(NextLabel)), cross_1.parens(cross_1.lobyte(numlin.toString())), cross_1.parens(cross_1.hibyte(numlin.toString())), Compr);
    basic_row++;
    return ReplaceTo;
}
function InitTokens() {
    TokensText[" "] = 32;
    TokensText["!"] = 33;
    TokensText["\x22"] = 34;
    TokensText["#"] = 35;
    TokensText["$"] = 36;
    TokensText["%"] = 37;
    TokensText["&"] = 38;
    TokensText["'"] = 39;
    TokensText["("] = 40;
    TokensText[")"] = 41;
    TokensText["*"] = 42;
    TokensText["+"] = 43;
    TokensText[","] = 44;
    TokensText["-"] = 45;
    TokensText["."] = 46;
    TokensText["/"] = 47;
    TokensText["0"] = 48;
    TokensText["1"] = 49;
    TokensText["2"] = 50;
    TokensText["3"] = 51;
    TokensText["4"] = 52;
    TokensText["5"] = 53;
    TokensText["6"] = 54;
    TokensText["7"] = 55;
    TokensText["8"] = 56;
    TokensText["9"] = 57;
    TokensText[":"] = 58;
    TokensText[";"] = 59;
    TokensText["<"] = 60;
    TokensText["="] = 61;
    TokensText[">"] = 62;
    TokensText["?"] = 63;
    TokensText["@"] = 64;
    TokensText["A"] = 65;
    TokensText["B"] = 66;
    TokensText["C"] = 67;
    TokensText["D"] = 68;
    TokensText["E"] = 69;
    TokensText["F"] = 70;
    TokensText["G"] = 71;
    TokensText["H"] = 72;
    TokensText["I"] = 73;
    TokensText["J"] = 74;
    TokensText["K"] = 75;
    TokensText["L"] = 76;
    TokensText["M"] = 77;
    TokensText["N"] = 78;
    TokensText["O"] = 79;
    TokensText["P"] = 80;
    TokensText["Q"] = 81;
    TokensText["R"] = 82;
    TokensText["S"] = 83;
    TokensText["T"] = 84;
    TokensText["U"] = 85;
    TokensText["V"] = 86;
    TokensText["W"] = 87;
    TokensText["X"] = 88;
    TokensText["Y"] = 89;
    TokensText["Z"] = 90;
    TokensText["["] = 91;
    TokensText["£"] = 92;
    TokensText["]"] = 93;
    TokensText["^"] = 94;
    TokensText["{left arrow}"] = 95;
    TokensKeywords["END"] = 128;
    TokensKeywords["FOR"] = 129;
    TokensKeywords["NEXT"] = 130;
    TokensKeywords["DATA"] = 131;
    TokensKeywords["INPUT#"] = 132;
    TokensKeywords["INPUT"] = 133;
    TokensKeywords["DIM"] = 134;
    TokensKeywords["READ"] = 135;
    TokensKeywords["LET"] = 136;
    TokensKeywords["GOTO"] = 137;
    TokensKeywords["RUN"] = 138;
    TokensKeywords["IF"] = 139;
    TokensKeywords["RESTORE"] = 140;
    TokensKeywords["GOSUB"] = 141;
    TokensKeywords["RETURN"] = 142;
    TokensKeywords["REM"] = 143;
    TokensKeywords["STOP"] = 144;
    TokensKeywords["ON"] = 145;
    TokensKeywords["WAIT"] = 146;
    TokensKeywords["LOAD"] = 147;
    TokensKeywords["SAVE"] = 148;
    TokensKeywords["VERIFY"] = 149;
    TokensKeywords["DEF"] = 150;
    TokensKeywords["POKE"] = 151;
    TokensKeywords["PRINT#"] = 152;
    TokensKeywords["PRINT"] = 153;
    TokensKeywords["?"] = 153;
    TokensKeywords["CONT"] = 154;
    TokensKeywords["LIST"] = 155;
    TokensKeywords["CLR"] = 156;
    TokensKeywords["CMD"] = 157;
    TokensKeywords["SYS"] = 158;
    TokensKeywords["OPEN"] = 159;
    TokensKeywords["CLOSE"] = 160;
    TokensKeywords["GET"] = 161;
    TokensKeywords["NEW"] = 162;
    TokensKeywords["TAB("] = 163;
    TokensKeywords["TO"] = 164;
    TokensKeywords["FN"] = 165;
    TokensKeywords["SPC("] = 166;
    TokensKeywords["THEN"] = 167;
    TokensKeywords["NOT"] = 168;
    TokensKeywords["STEP"] = 169;
    TokensKeywords["+"] = 170;
    TokensKeywords["-"] = 171;
    TokensKeywords["*"] = 172;
    TokensKeywords["/"] = 173;
    TokensKeywords["^"] = 174;
    TokensKeywords["AND"] = 175;
    TokensKeywords["OR"] = 176;
    TokensKeywords[">"] = 177;
    TokensKeywords["="] = 178;
    TokensKeywords["<"] = 179;
    TokensKeywords["SGN"] = 180;
    TokensKeywords["INT"] = 181;
    TokensKeywords["ABS"] = 182;
    TokensKeywords["USR"] = 183;
    TokensKeywords["FRE"] = 184;
    TokensKeywords["POS"] = 185;
    TokensKeywords["SQR"] = 186;
    TokensKeywords["RND"] = 187;
    TokensKeywords["LOG"] = 188;
    TokensKeywords["EXP"] = 189;
    TokensKeywords["COS"] = 190;
    TokensKeywords["SIN"] = 191;
    TokensKeywords["TAN"] = 192;
    TokensKeywords["ATN"] = 193;
    TokensKeywords["PEEK"] = 194;
    TokensKeywords["LEN"] = 195;
    TokensKeywords["STR$"] = 196;
    TokensKeywords["VAL"] = 197;
    TokensKeywords["ASC"] = 198;
    TokensKeywords["CHR$"] = 199;
    TokensKeywords["LEFT$"] = 200;
    TokensKeywords["RIGHT$"] = 201;
    TokensKeywords["MID$"] = 202;
    TokensKeywords["{pi}"] = 255;
    /*
       Tokens[32] = " ";
       Tokens[33] = "!";
       Tokens[34] = "\x22";
       Tokens[35] = "#";
       Tokens[36] = "$";
       Tokens[37] = "%";
       Tokens[38] = "&";
       Tokens[39] = "'";
       Tokens[40] = "(";
       Tokens[41] = ")";
       Tokens[42] = "*";
       Tokens[43] = "+";
       Tokens[44] = ",";
       Tokens[45] = "-";
       Tokens[46] = ".";
       Tokens[47] = "/";
       Tokens[48] = "0";
       Tokens[49] = "1";
       Tokens[50] = "2";
       Tokens[51] = "3";
       Tokens[52] = "4";
       Tokens[53] = "5";
       Tokens[54] = "6";
       Tokens[55] = "7";
       Tokens[56] = "8";
       Tokens[57] = "9";
       Tokens[58] = ":";
       Tokens[59] = ";";
       Tokens[60] = "<";
       Tokens[61] = "=";
       Tokens[62] = ">";
       Tokens[63] = "?";
       Tokens[64] = "@";
       Tokens[65] = "A";
       Tokens[66] = "B";
       Tokens[67] = "C";
       Tokens[68] = "D";
       Tokens[69] = "E";
       Tokens[70] = "F";
       Tokens[71] = "G";
       Tokens[72] = "H";
       Tokens[73] = "I";
       Tokens[74] = "J";
       Tokens[75] = "K";
       Tokens[76] = "L";
       Tokens[77] = "M";
       Tokens[78] = "N";
       Tokens[79] = "O";
       Tokens[80] = "P";
       Tokens[81] = "Q";
       Tokens[82] = "R";
       Tokens[83] = "S";
       Tokens[84] = "T";
       Tokens[85] = "U";
       Tokens[86] = "V";
       Tokens[87] = "W";
       Tokens[88] = "X";
       Tokens[89] = "Y";
       Tokens[90] = "Z";
       Tokens[91] = "[";
       Tokens[92] = "£";
       Tokens[93] = "]";
       Tokens[94] = "^";
       Tokens[95] = "{left arrow}";
       Tokens[128]= "END";
       Tokens[129]= "FOR";
       Tokens[130]= "NEXT";
       Tokens[131]= "DATA";
       Tokens[132]= "INPUT#";
       Tokens[133]= "INPUT";
       Tokens[134]= "DIM";
       Tokens[135]= "READ";
       Tokens[136]= "LET";
       Tokens[137]= "GOTO";
       Tokens[138]= "RUN";
       Tokens[139]= "IF";
       Tokens[140]= "RESTORE";
       Tokens[141]= "GOSUB";
       Tokens[142]= "RETURN";
       Tokens[143]= "REM";
       Tokens[144]= "STOP";
       Tokens[145]= "ON";
       Tokens[146]= "WAIT";
       Tokens[147]= "LOAD";
       Tokens[148]= "SAVE";
       Tokens[149]= "VERIFY";
       Tokens[150]= "DEF";
       Tokens[151]= "POKE";
       Tokens[152]= "PRINT#";
       Tokens[153]= "PRINT";
       Tokens[154]= "CONT";
       Tokens[155]= "LIST";
       Tokens[156]= "CLR";
       Tokens[157]= "CMD";
       Tokens[158]= "SYS";
       Tokens[159]= "OPEN";
       Tokens[160]= "CLOSE";
       Tokens[161]= "GET";
       Tokens[162]= "NEW";
       Tokens[163]= "TAB(";
       Tokens[164]= "TO";
       Tokens[165]= "FN";
       Tokens[166]= "SPC(";
       Tokens[167]= "THEN";
       Tokens[168]= "NOT";
       Tokens[169]= "STEP";
       Tokens[170]= "+";
       Tokens[171]= "-";
       Tokens[172]= "*";
       Tokens[173]= "/";
       Tokens[174]= "^";
       Tokens[175]= "AND";
       Tokens[176]= "OR";
       Tokens[177]= ">";
       Tokens[178]= "=";
       Tokens[179]= "<";
       Tokens[180]= "SGN";
       Tokens[181]= "INT";
       Tokens[182]= "ABS";
       Tokens[183]= "USR";
       Tokens[184]= "FRE";
       Tokens[185]= "POS";
       Tokens[186]= "SQR";
       Tokens[187]= "RND";
       Tokens[188]= "LOG";
       Tokens[189]= "EXP";
       Tokens[190]= "COS";
       Tokens[191]= "SIN";
       Tokens[192]= "TAN";
       Tokens[193]= "ATN";
       Tokens[194]= "PEEK";
       Tokens[195]= "LEN";
       Tokens[196]= "STR$";
       Tokens[197]= "VAL";
       Tokens[198]= "ASC";
       Tokens[199]= "CHR$";
       Tokens[200]= "LEFT$";
       Tokens[201]= "RIGHT$";
       Tokens[202]= "MID$";
       for(let t=203;t<=254;t++) Tokens[t] = "";
       Tokens[255]= "{pi}";
    */
    Ascii["{rev a}"] = 1;
    Ascii["{rev b}"] = 2;
    Ascii["{run stop}"] = 3;
    Ascii["{rev d}"] = 4;
    Ascii["{wht}"] = 5;
    Ascii["{white}"] = 5;
    Ascii["{rev f}"] = 6;
    Ascii["{rev g}"] = 7;
    Ascii["{rev h}"] = 8;
    Ascii["{rev i}"] = 9;
    Ascii["{rev j}"] = 10;
    Ascii["{rev k}"] = 11;
    Ascii["{rev l}"] = 12;
    Ascii["{return}"] = 13;
    Ascii["{rev n}"] = 14;
    Ascii["{rev o}"] = 15;
    Ascii["{rev p}"] = 16;
    Ascii["{down}"] = 17;
    Ascii["{rvs on}"] = 18;
    Ascii["{home}"] = 19;
    Ascii["{del}"] = 20;
    Ascii["{rev u}"] = 21;
    Ascii["{rev v}"] = 22;
    Ascii["{rev w}"] = 23;
    Ascii["{rev x}"] = 24;
    Ascii["{rev y}"] = 25;
    Ascii["{rev z}"] = 26;
    Ascii["{rev [}"] = 27;
    Ascii["{red}"] = 28;
    Ascii["{right}"] = 29;
    Ascii["{grn}"] = 30;
    Ascii["{green}"] = 30;
    Ascii["{blu}"] = 31;
    Ascii["{blue}"] = 31;
    Ascii[" "] = 32;
    Ascii["!"] = 33;
    Ascii["\x22"] = 34;
    Ascii["#"] = 35;
    Ascii["$"] = 36;
    Ascii["%"] = 37;
    Ascii["&"] = 38;
    Ascii["'"] = 39;
    Ascii["("] = 40;
    Ascii[")"] = 41;
    Ascii["*"] = 42;
    Ascii["+"] = 43;
    Ascii[","] = 44;
    Ascii["-"] = 45;
    Ascii["."] = 46;
    Ascii["/"] = 47;
    Ascii["0"] = 48;
    Ascii["1"] = 49;
    Ascii["2"] = 50;
    Ascii["3"] = 51;
    Ascii["4"] = 52;
    Ascii["5"] = 53;
    Ascii["6"] = 54;
    Ascii["7"] = 55;
    Ascii["8"] = 56;
    Ascii["9"] = 57;
    Ascii[":"] = 58;
    Ascii[";"] = 59;
    Ascii["<"] = 60;
    Ascii["="] = 61;
    Ascii[">"] = 62;
    Ascii["?"] = 63;
    Ascii["@"] = 64;
    Ascii["a"] = 65;
    Ascii["b"] = 66;
    Ascii["c"] = 67;
    Ascii["d"] = 68;
    Ascii["e"] = 69;
    Ascii["f"] = 70;
    Ascii["g"] = 71;
    Ascii["h"] = 72;
    Ascii["i"] = 73;
    Ascii["j"] = 74;
    Ascii["k"] = 75;
    Ascii["l"] = 76;
    Ascii["m"] = 77;
    Ascii["n"] = 78;
    Ascii["o"] = 79;
    Ascii["p"] = 80;
    Ascii["q"] = 81;
    Ascii["r"] = 82;
    Ascii["s"] = 83;
    Ascii["t"] = 84;
    Ascii["u"] = 85;
    Ascii["v"] = 86;
    Ascii["w"] = 87;
    Ascii["x"] = 88;
    Ascii["y"] = 89;
    Ascii["z"] = 90;
    Ascii["["] = 91;
    Ascii["£"] = 92;
    Ascii["]"] = 93;
    Ascii["^"] = 94;
    Ascii["A"] = 97;
    Ascii["B"] = 98;
    Ascii["C"] = 99;
    Ascii["D"] = 100;
    Ascii["E"] = 101;
    Ascii["F"] = 102;
    Ascii["G"] = 103;
    Ascii["H"] = 104;
    Ascii["I"] = 105;
    Ascii["J"] = 106;
    Ascii["K"] = 107;
    Ascii["L"] = 108;
    Ascii["M"] = 109;
    Ascii["N"] = 110;
    Ascii["O"] = 111;
    Ascii["P"] = 112;
    Ascii["Q"] = 113;
    Ascii["R"] = 114;
    Ascii["S"] = 115;
    Ascii["T"] = 116;
    Ascii["U"] = 117;
    Ascii["V"] = 118;
    Ascii["W"] = 119;
    Ascii["X"] = 120;
    Ascii["Y"] = 121;
    Ascii["Z"] = 122;
    Ascii["{left arrow}"] = 95;
    Ascii["{shift *}"] = 96;
    Ascii["{shift a}"] = 97;
    Ascii["{shift b}"] = 98;
    Ascii["{shift c}"] = 99;
    Ascii["{shift d}"] = 100;
    Ascii["{shift e}"] = 101;
    Ascii["{shift f}"] = 102;
    Ascii["{shift g}"] = 103;
    Ascii["{shift h}"] = 104;
    Ascii["{shift i}"] = 105;
    Ascii["{shift j}"] = 106;
    Ascii["{shift k}"] = 107;
    Ascii["{shift l}"] = 108;
    Ascii["{shift m}"] = 109;
    Ascii["{shift n}"] = 110;
    Ascii["{shift o}"] = 111;
    Ascii["{shift p}"] = 112;
    Ascii["{shift q}"] = 113;
    Ascii["{shift r}"] = 114;
    Ascii["{shift s}"] = 115;
    Ascii["{shift t}"] = 116;
    Ascii["{shift u}"] = 117;
    Ascii["{shift v}"] = 118;
    Ascii["{shift w}"] = 119;
    Ascii["{119}"] = 119;
    Ascii["{shift x}"] = 120;
    Ascii["{shift y}"] = 121;
    Ascii["{shift z}"] = 122;
    Ascii["{shift +}"] = 123;
    Ascii["{cbm -}"] = 124;
    Ascii["{shift -}"] = 125;
    Ascii["{pi}"] = 126;
    Ascii["{cbm *}"] = 127;
    Ascii["{rev shift *}"] = 128;
    Ascii["{rev shift a}"] = 129;
    Ascii["{cbm 1}"] = 129;
    Ascii["{orange}"] = 129;
    Ascii["{rev shift b}"] = 130;
    Ascii["{rev shift c}"] = 131;
    Ascii["{rev shift d}"] = 132;
    Ascii["{f1}"] = 133;
    Ascii["{f3}"] = 134;
    Ascii["{f5}"] = 135;
    Ascii["{f7}"] = 136;
    Ascii["{f2}"] = 137;
    Ascii["{f4}"] = 138;
    Ascii["{f6}"] = 139;
    Ascii["{f8}"] = 140;
    Ascii["{rev shift m}"] = 141;
    Ascii["{rev shift n}"] = 142;
    Ascii["{rev shift o}"] = 143;
    Ascii["{blk}"] = 144;
    Ascii["{black}"] = 144;
    Ascii["{up}"] = 145;
    Ascii["{rvs off}"] = 146;
    Ascii["{clr}"] = 147;
    Ascii["{clear}"] = 147;
    Ascii["{inst}"] = 148;
    Ascii["{rev shift u}"] = 149;
    Ascii["{cbm 2}"] = 149;
    Ascii["{brown}"] = 149;
    Ascii["{rev shift v}"] = 150;
    Ascii["{cbm 3}"] = 150;
    Ascii["{light red}"] = 150;
    Ascii["{rev shift w}"] = 151;
    Ascii["{cbm 4}"] = 151;
    Ascii["{dark gray}"] = 151;
    Ascii["{rev shift x}"] = 152;
    Ascii["{cbm 5}"] = 152;
    Ascii["{gray}"] = 152;
    Ascii["{rev shift y}"] = 153;
    Ascii["{cbm 6}"] = 153;
    Ascii["{light green}"] = 153;
    Ascii["{rev shift z}"] = 154;
    Ascii["{cbm 7}"] = 154;
    Ascii["{light blue}"] = 154;
    Ascii["{rev shift +}"] = 155;
    Ascii["{cbm 8}"] = 155;
    Ascii["{light gray}"] = 155;
    Ascii["{pur}"] = 156;
    Ascii["{purple}"] = 156;
    Ascii["{left}"] = 157;
    Ascii["{yel}"] = 158;
    Ascii["{yellow}"] = 158;
    Ascii["{cyn}"] = 159;
    Ascii["{cyan}"] = 159;
    Ascii["{160}"] = 160;
    Ascii["{cbm k}"] = 161;
    Ascii["{cbm i}"] = 162;
    Ascii["{cbm t}"] = 163;
    Ascii["{cbm @}"] = 164;
    Ascii["{cbm g}"] = 165;
    Ascii["{cbm +}"] = 166;
    Ascii["{cbm m}"] = 167;
    Ascii["{cbm £}"] = 168;
    Ascii["{shift £}"] = 169;
    Ascii["{cbm n}"] = 170;
    Ascii["{cbm q}"] = 171;
    Ascii["{cbm d}"] = 172;
    Ascii["{cbm z}"] = 173;
    Ascii["{cbm s}"] = 174;
    Ascii["{cbm p}"] = 175;
    Ascii["{cbm a}"] = 176;
    Ascii["{cbm e}"] = 177;
    Ascii["{cbm r}"] = 178;
    Ascii["{cbm w}"] = 179;
    Ascii["{cbm h}"] = 180;
    Ascii["{cbm j}"] = 181;
    Ascii["{cbm l}"] = 182;
    Ascii["{cbm y}"] = 183;
    Ascii["{cbm u}"] = 184;
    Ascii["{cbm o}"] = 185;
    Ascii["{shift @}"] = 186;
    Ascii["{cbm f}"] = 187;
    Ascii["{cbm c}"] = 188;
    Ascii["{cbm x}"] = 189;
    Ascii["{cbm v}"] = 190;
    Ascii["{cbm b}"] = 191;
    Ascii["{shift *}"] = 192;
    Ascii["{shift a}"] = 193;
    Ascii["{shift b}"] = 194;
    Ascii["{shift c}"] = 195;
    Ascii["{shift d}"] = 196;
    Ascii["{shift e}"] = 197;
    Ascii["{shift f}"] = 198;
    Ascii["{shift g}"] = 199;
    Ascii["{shift h}"] = 200;
    Ascii["{shift i}"] = 201;
    Ascii["{shift j}"] = 202;
    Ascii["{shift k}"] = 203;
    Ascii["{shift l}"] = 204;
    Ascii["{shift m}"] = 205;
    Ascii["{shift n}"] = 206;
    Ascii["{shift o}"] = 207;
    Ascii["{shift p}"] = 208;
    Ascii["{shift q}"] = 209;
    Ascii["{shift r}"] = 210;
    Ascii["{shift s}"] = 211;
    Ascii["{shift t}"] = 212;
    Ascii["{shift u}"] = 213;
    Ascii["{shift v}"] = 214;
    Ascii["{shift w}"] = 215;
    Ascii["{shift x}"] = 216;
    Ascii["{shift y}"] = 217;
    Ascii["{shift z}"] = 218;
    Ascii["{shift +}"] = 219;
    Ascii["{cbm -}"] = 220;
    Ascii["{shift -}"] = 221;
    Ascii["{pi}"] = 222;
    Ascii["{cbm *}"] = 223;
    Ascii["{224}"] = 224;
    Ascii["{cbm k}"] = 225;
    Ascii["{cbm i}"] = 226;
    Ascii["{cbm t}"] = 227;
    Ascii["{cbm @}"] = 228;
    Ascii["{cbm g}"] = 229;
    Ascii["{cbm +}"] = 230;
    Ascii["{cbm m}"] = 231;
    Ascii["{cbm £}"] = 232;
    Ascii["{shift £}"] = 233;
    Ascii["{cbm n}"] = 234;
    Ascii["{cbm q}"] = 235;
    Ascii["{cbm d}"] = 236;
    Ascii["{cbm z}"] = 237;
    Ascii["{cbm s}"] = 238;
    Ascii["{cbm p}"] = 239;
    Ascii["{cbm a}"] = 240;
    Ascii["{cbm e}"] = 241;
    Ascii["{cbm r}"] = 242;
    Ascii["{cbm w}"] = 243;
    Ascii["{cbm h}"] = 244;
    Ascii["{cbm j}"] = 245;
    Ascii["{cbm l}"] = 246;
    Ascii["{cbm y}"] = 247;
    Ascii["{cbm u}"] = 248;
    Ascii["{cbm o}"] = 249;
    Ascii["{cbm @}"] = 250;
    Ascii["{cbm f}"] = 251;
    Ascii["{cbm c}"] = 252;
    Ascii["{cbm x}"] = 253;
    Ascii["{cbm v}"] = 254;
    Ascii["{pi}"] = 255;
}