Files
AnyPS5/core/libs/prx/libSceConvertKeycode/Export.cpp
T

2429 lines
71 KiB
C++

#include <array>
#include <cstdint>
#include <stdexcept>
#include "SceTypes.hpp"
#include "prx/libc/include/General.hpp"
namespace {
constexpr int kErrInvalidAddress = static_cast<int>(0x80BC0031u);
constexpr int kErrInvalidUserId = static_cast<int>(0x80BC0010u);
constexpr std::array<std::uint16_t, 256> BaseVirtualKeys = {
255, 255, 255, 255, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 49, 50,
51, 52, 53, 54, 55, 56, 57, 48, 13, 27, 8, 9, 32, 187, 219, 221,
186, 191, 191, 192, 222, 220, 188, 190, 189, 20, 112, 113, 114, 115, 116, 117,
118, 119, 120, 121, 122, 123, 44, 145, 19, 45, 36, 33, 46, 35, 34, 39,
37, 40, 38, 144, 111, 106, 109, 107, 13, 97, 98, 99, 100, 101, 102, 103,
104, 105, 96, 110, 226, 93, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 12, 255, 255, 255, 255, 255, 255, 255,
162, 160, 164, 91, 163, 161, 165, 92, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
};
constexpr auto VirtualKeys = [] {
std::array<std::array<std::uint16_t, 256>, 39> layouts{};
for (auto& layout : layouts) layout = BaseVirtualKeys;
layouts[1][28] = 90;
layouts[1][29] = 89;
layouts[1][45] = 189;
layouts[1][46] = 221;
layouts[1][47] = 186;
layouts[1][48] = 187;
layouts[2][28] = 90;
layouts[2][29] = 89;
layouts[2][45] = 219;
layouts[2][46] = 221;
layouts[2][47] = 186;
layouts[2][48] = 192;
layouts[2][49] = 223;
layouts[2][50] = 223;
layouts[2][51] = 222;
layouts[2][52] = 220;
layouts[2][53] = 191;
layouts[3][45] = 189;
layouts[3][46] = 187;
layouts[3][47] = 219;
layouts[3][48] = 221;
layouts[3][49] = 220;
layouts[3][50] = 220;
layouts[3][51] = 186;
layouts[3][53] = 192;
layouts[3][56] = 191;
layouts[3][100] = 255;
layouts[4][45] = 189;
layouts[4][46] = 187;
layouts[4][47] = 219;
layouts[4][48] = 221;
layouts[4][49] = 222;
layouts[4][50] = 222;
layouts[4][51] = 186;
layouts[4][52] = 192;
layouts[4][53] = 223;
layouts[4][56] = 191;
layouts[5][45] = 219;
layouts[5][46] = 221;
layouts[5][47] = 186;
layouts[5][48] = 187;
layouts[6][45] = 219;
layouts[6][46] = 221;
layouts[6][47] = 186;
layouts[6][48] = 187;
layouts[6][100] = 255;
layouts[8][4] = 81;
layouts[8][16] = 188;
layouts[8][20] = 65;
layouts[8][26] = 90;
layouts[8][29] = 87;
layouts[8][45] = 219;
layouts[8][46] = 187;
layouts[8][49] = 220;
layouts[8][50] = 220;
layouts[8][51] = 77;
layouts[8][52] = 192;
layouts[8][53] = 222;
layouts[8][54] = 190;
layouts[8][55] = 191;
layouts[8][56] = 223;
layouts[9][4] = 81;
layouts[9][16] = 188;
layouts[9][20] = 65;
layouts[9][26] = 90;
layouts[9][29] = 87;
layouts[9][45] = 219;
layouts[9][46] = 189;
layouts[9][49] = 220;
layouts[9][50] = 220;
layouts[9][51] = 77;
layouts[9][52] = 192;
layouts[9][53] = 222;
layouts[9][54] = 190;
layouts[9][55] = 191;
layouts[9][56] = 187;
layouts[10][45] = 189;
layouts[10][46] = 187;
layouts[10][47] = 219;
layouts[10][48] = 221;
layouts[10][49] = 220;
layouts[10][50] = 220;
layouts[10][51] = 186;
layouts[10][52] = 192;
layouts[10][53] = 222;
layouts[10][56] = 191;
layouts[11] = layouts[2];
layouts[12] = layouts[5];
layouts[13][45] = 219;
layouts[13][46] = 191;
layouts[13][49] = 220;
layouts[13][50] = 220;
layouts[13][51] = 187;
layouts[13][52] = 192;
layouts[13][53] = 222;
layouts[15][46] = 191;
layouts[15][47] = 219;
layouts[15][48] = 221;
layouts[15][49] = 220;
layouts[15][50] = 220;
layouts[15][51] = 186;
layouts[15][53] = 192;
layouts[16][45] = 189;
layouts[16][46] = 187;
layouts[16][47] = 219;
layouts[16][48] = 221;
layouts[16][49] = 220;
layouts[16][50] = 220;
layouts[16][51] = 186;
layouts[16][53] = 192;
layouts[16][56] = 191;
layouts[17] = layouts[5];
layouts[18] = layouts[3];
layouts[20][45] = 223;
layouts[20][46] = 189;
layouts[20][47] = 219;
layouts[20][48] = 221;
layouts[20][49] = 188;
layouts[20][50] = 188;
layouts[20][51] = 186;
layouts[20][52] = 190;
layouts[20][53] = 192;
layouts[20][54] = 191;
layouts[20][55] = 220;
layouts[20][56] = 190;
layouts[21][45] = 189;
layouts[21][46] = 222;
layouts[21][47] = 192;
layouts[21][48] = 219;
layouts[21][49] = 221;
layouts[21][50] = 221;
layouts[21][51] = 187;
layouts[21][52] = 186;
layouts[21][53] = 243;
layouts[21][56] = 191;
layouts[21][100] = 255;
layouts[21][135] = 226;
layouts[21][136] = 242;
layouts[21][137] = 220;
layouts[21][138] = 28;
layouts[21][139] = 247;
layouts[22] = layouts[21];
layouts[23][45] = 189;
layouts[23][46] = 187;
layouts[23][47] = 219;
layouts[23][48] = 221;
layouts[23][49] = 220;
layouts[23][50] = 220;
layouts[23][51] = 186;
layouts[23][53] = 192;
layouts[23][56] = 191;
layouts[23][136] = 21;
layouts[23][138] = 25;
layouts[24] = layouts[3];
layouts[25] = layouts[3];
layouts[26] = layouts[3];
layouts[27] = layouts[3];
layouts[28] = layouts[3];
layouts[29] = layouts[16];
layouts[30] = layouts[16];
layouts[31][28] = 90;
layouts[31][29] = 89;
layouts[31][46] = 191;
layouts[31][47] = 219;
layouts[31][48] = 221;
layouts[31][49] = 220;
layouts[31][50] = 220;
layouts[31][51] = 186;
layouts[31][53] = 192;
layouts[32] = layouts[16];
layouts[33] = layouts[16];
layouts[34] = layouts[16];
layouts[35] = layouts[16];
layouts[36][28] = 90;
layouts[36][29] = 89;
layouts[36][39] = 192;
layouts[36][45] = 191;
layouts[36][46] = 187;
layouts[36][47] = 219;
layouts[36][48] = 221;
layouts[36][49] = 220;
layouts[36][50] = 220;
layouts[36][51] = 186;
layouts[36][53] = 48;
layouts[37] = layouts[3];
layouts[38] = layouts[3];
return layouts;
}();
constexpr int kErrInvalidKeyboardType = static_cast<int>(0x80BC001Du);
constexpr auto CharacterTables = [] {
std::array<std::array<std::uint32_t, 256>, 111> tables{};
tables[1][4] = 327777;
tables[1][5] = 327778;
tables[1][6] = 327779;
tables[1][7] = 327780;
tables[1][8] = 327781;
tables[1][9] = 327782;
tables[1][10] = 327783;
tables[1][11] = 327784;
tables[1][12] = 327785;
tables[1][13] = 327786;
tables[1][14] = 327787;
tables[1][15] = 327788;
tables[1][16] = 327789;
tables[1][17] = 327790;
tables[1][18] = 327791;
tables[1][19] = 327792;
tables[1][20] = 327793;
tables[1][21] = 327794;
tables[1][22] = 327795;
tables[1][23] = 327796;
tables[1][24] = 327797;
tables[1][25] = 327798;
tables[1][26] = 327799;
tables[1][27] = 327800;
tables[1][28] = 327802;
tables[1][29] = 327801;
tables[1][30] = 262193;
tables[1][31] = 262194;
tables[1][32] = 262195;
tables[1][33] = 262196;
tables[1][34] = 262197;
tables[1][35] = 262198;
tables[1][36] = 262199;
tables[1][37] = 262200;
tables[1][38] = 262201;
tables[1][39] = 262192;
tables[1][40] = 262154;
tables[1][42] = 262152;
tables[1][43] = 262153;
tables[1][44] = 262176;
tables[1][45] = 262183;
tables[1][46] = 262238;
tables[1][47] = 262396;
tables[1][48] = 262312;
tables[1][49] = 262180;
tables[1][50] = 262180;
tables[1][51] = 262390;
tables[1][52] = 262372;
tables[1][53] = 262311;
tables[1][54] = 262188;
tables[1][55] = 262190;
tables[1][56] = 262189;
tables[1][83] = 393299;
tables[1][84] = 393263;
tables[1][85] = 393258;
tables[1][86] = 393261;
tables[1][87] = 393259;
tables[1][88] = 393226;
tables[1][89] = 393293;
tables[1][90] = 393297;
tables[1][91] = 393294;
tables[1][92] = 393296;
tables[1][93] = 393309;
tables[1][94] = 393295;
tables[1][95] = 393290;
tables[1][96] = 393298;
tables[1][97] = 393291;
tables[1][98] = 393289;
tables[1][99] = 393292;
tables[1][100] = 262204;
tables[1][103] = 393277;
tables[1][133] = 393260;
tables[1][134] = 393277;
tables[1][140] = 393260;
tables[2] = tables[1];
tables[2][4] = 327745;
tables[2][5] = 327746;
tables[2][6] = 327747;
tables[2][7] = 327748;
tables[2][8] = 327749;
tables[2][9] = 327750;
tables[2][10] = 327751;
tables[2][11] = 327752;
tables[2][12] = 327753;
tables[2][13] = 327754;
tables[2][14] = 327755;
tables[2][15] = 327756;
tables[2][16] = 327757;
tables[2][17] = 327758;
tables[2][18] = 327759;
tables[2][19] = 327760;
tables[2][20] = 327761;
tables[2][21] = 327762;
tables[2][22] = 327763;
tables[2][23] = 327764;
tables[2][24] = 327765;
tables[2][25] = 327766;
tables[2][26] = 327767;
tables[2][27] = 327768;
tables[2][28] = 327770;
tables[2][29] = 327769;
tables[2][30] = 262187;
tables[2][31] = 262178;
tables[2][32] = 262186;
tables[2][33] = 262375;
tables[2][34] = 262181;
tables[2][35] = 262182;
tables[2][36] = 262191;
tables[2][37] = 262184;
tables[2][38] = 262185;
tables[2][39] = 262205;
tables[2][45] = 262207;
tables[2][46] = 262240;
tables[2][47] = 262376;
tables[2][48] = 262177;
tables[2][49] = 262307;
tables[2][50] = 262307;
tables[2][51] = 262377;
tables[2][52] = 262368;
tables[2][53] = 262320;
tables[2][54] = 262203;
tables[2][55] = 262202;
tables[2][56] = 262239;
tables[2][89] = 393265;
tables[2][90] = 393266;
tables[2][91] = 393267;
tables[2][92] = 393268;
tables[2][93] = 393269;
tables[2][94] = 393270;
tables[2][95] = 393271;
tables[2][96] = 393272;
tables[2][97] = 393273;
tables[2][98] = 393264;
tables[2][99] = 393262;
tables[2][100] = 262206;
tables[3][8] = 336044;
tables[3][30] = 262310;
tables[3][31] = 262208;
tables[3][32] = 262179;
tables[3][33] = 262320;
tables[3][34] = 262311;
tables[3][35] = 262316;
tables[3][36] = 262268;
tables[3][37] = 262306;
tables[3][45] = 262324;
tables[3][46] = 262270;
tables[3][47] = 262235;
tables[3][48] = 262237;
tables[3][49] = 262269;
tables[3][50] = 262269;
tables[3][52] = 262267;
tables[3][100] = 262236;
tables[3][136] = 262324;
tables[3][137] = 262324;
tables[3][138] = 262324;
tables[3][146] = 262324;
tables[3][147] = 262324;
tables[4] = tables[1];
tables[4][28] = 327801;
tables[4][29] = 327802;
tables[4][45] = 262189;
tables[4][46] = 262205;
tables[4][47] = 262235;
tables[4][48] = 262237;
tables[4][49] = 262236;
tables[4][50] = 262236;
tables[4][51] = 262203;
tables[4][52] = 262183;
tables[4][53] = 262240;
tables[4][56] = 262191;
tables[4][100] = 262236;
tables[5] = tables[2];
tables[5][28] = 327769;
tables[5][29] = 327770;
tables[5][30] = 262177;
tables[5][31] = 262208;
tables[5][32] = 262179;
tables[5][33] = 262180;
tables[5][35] = 262238;
tables[5][36] = 262182;
tables[5][37] = 262186;
tables[5][38] = 262184;
tables[5][39] = 262185;
tables[5][45] = 262239;
tables[5][46] = 262187;
tables[5][47] = 262267;
tables[5][48] = 262269;
tables[5][49] = 262268;
tables[5][50] = 262268;
tables[5][51] = 262202;
tables[5][52] = 262178;
tables[5][53] = 262270;
tables[5][54] = 262204;
tables[5][55] = 262206;
tables[5][56] = 262207;
tables[5][100] = 262268;
tables[6][34] = 270508;
tables[7] = tables[1];
tables[7][4] = 393025;
tables[7][5] = 393026;
tables[7][6] = 393027;
tables[7][7] = 393028;
tables[7][8] = 393029;
tables[7][9] = 393030;
tables[7][10] = 393031;
tables[7][11] = 393032;
tables[7][12] = 393033;
tables[7][13] = 393034;
tables[7][14] = 393035;
tables[7][15] = 393036;
tables[7][16] = 393037;
tables[7][17] = 393038;
tables[7][18] = 393039;
tables[7][19] = 393040;
tables[7][20] = 393041;
tables[7][21] = 393042;
tables[7][22] = 393043;
tables[7][23] = 393044;
tables[7][24] = 393045;
tables[7][25] = 393046;
tables[7][26] = 393047;
tables[7][27] = 393048;
tables[7][28] = 393049;
tables[7][29] = 393050;
tables[7][30] = 327441;
tables[7][31] = 327442;
tables[7][32] = 327443;
tables[7][33] = 327444;
tables[7][34] = 327445;
tables[7][35] = 327446;
tables[7][36] = 327447;
tables[7][37] = 327448;
tables[7][38] = 327449;
tables[7][39] = 327440;
tables[7][44] = 274432;
tables[7][45] = 327437;
tables[7][46] = 327486;
tables[7][47] = 327456;
tables[7][48] = 327483;
tables[7][49] = 327485;
tables[7][50] = 327485;
tables[7][51] = 327451;
tables[7][52] = 327450;
tables[7][53] = 0;
tables[7][54] = 327436;
tables[7][55] = 327438;
tables[7][56] = 327439;
tables[7][100] = 0;
tables[7][135] = 327653;
tables[8] = tables[2];
tables[8][4] = 392993;
tables[8][5] = 392994;
tables[8][6] = 392995;
tables[8][7] = 392996;
tables[8][8] = 392997;
tables[8][9] = 392998;
tables[8][10] = 392999;
tables[8][11] = 393000;
tables[8][12] = 393001;
tables[8][13] = 393002;
tables[8][14] = 393003;
tables[8][15] = 393004;
tables[8][16] = 393005;
tables[8][17] = 393006;
tables[8][18] = 393007;
tables[8][19] = 393008;
tables[8][20] = 393009;
tables[8][21] = 393010;
tables[8][22] = 393011;
tables[8][23] = 393012;
tables[8][24] = 393013;
tables[8][25] = 393014;
tables[8][26] = 393015;
tables[8][27] = 393016;
tables[8][28] = 393017;
tables[8][29] = 393018;
tables[8][30] = 327425;
tables[8][31] = 270364;
tables[8][32] = 327427;
tables[8][33] = 327428;
tables[8][34] = 327429;
tables[8][35] = 327430;
tables[8][36] = 270360;
tables[8][37] = 327432;
tables[8][38] = 327433;
tables[8][39] = 0;
tables[8][45] = 327453;
tables[8][46] = 327518;
tables[8][47] = 327488;
tables[8][48] = 327515;
tables[8][49] = 327517;
tables[8][50] = 327517;
tables[8][51] = 327435;
tables[8][52] = 327434;
tables[8][53] = 0;
tables[8][54] = 327452;
tables[8][55] = 327454;
tables[8][56] = 327455;
tables[8][100] = 0;
tables[8][135] = 327487;
tables[8][137] = 327516;
tables[9] = tables[4];
tables[9][46] = 262238;
tables[9][47] = 262208;
tables[9][48] = 262235;
tables[9][49] = 262237;
tables[9][50] = 262237;
tables[9][52] = 262202;
tables[9][53] = 0;
tables[9][100] = 0;
tables[9][135] = 262236;
tables[9][137] = 262309;
tables[10] = tables[5];
tables[10][31] = 262178;
tables[10][35] = 262182;
tables[10][36] = 262183;
tables[10][37] = 262184;
tables[10][38] = 262185;
tables[10][39] = 0;
tables[10][45] = 262205;
tables[10][46] = 262270;
tables[10][47] = 262240;
tables[10][48] = 262267;
tables[10][49] = 262269;
tables[10][50] = 262269;
tables[10][51] = 262187;
tables[10][52] = 262186;
tables[10][53] = 0;
tables[10][100] = 0;
tables[10][135] = 262239;
tables[10][137] = 262268;
tables[11] = tables[9];
tables[11][4] = 274625;
tables[11][5] = 274611;
tables[11][6] = 274621;
tables[11][7] = 274615;
tables[11][8] = 274596;
tables[11][9] = 274639;
tables[11][10] = 274605;
tables[11][11] = 274607;
tables[11][12] = 274635;
tables[11][13] = 274654;
tables[11][14] = 274638;
tables[11][15] = 274666;
tables[11][16] = 274658;
tables[11][17] = 274655;
tables[11][18] = 274665;
tables[11][19] = 274619;
tables[11][20] = 274623;
tables[11][21] = 274617;
tables[11][22] = 274632;
tables[11][23] = 274603;
tables[11][24] = 274634;
tables[11][25] = 274642;
tables[11][26] = 274630;
tables[11][27] = 274613;
tables[11][28] = 274675;
tables[11][29] = 274628;
tables[11][30] = 274636;
tables[11][31] = 274645;
tables[11][32] = 274594;
tables[11][33] = 274598;
tables[11][34] = 274600;
tables[11][35] = 274602;
tables[11][36] = 274660;
tables[11][37] = 274662;
tables[11][38] = 274664;
tables[11][39] = 274671;
tables[11][45] = 274651;
tables[11][46] = 274648;
tables[11][47] = 274587;
tables[11][48] = 274588;
tables[11][49] = 274656;
tables[11][50] = 274656;
tables[11][51] = 274668;
tables[11][52] = 274609;
tables[11][54] = 274637;
tables[11][55] = 274667;
tables[11][56] = 274657;
tables[11][135] = 274669;
tables[11][137] = 274684;
tables[12] = tables[11];
tables[12][8] = 274595;
tables[12][29] = 274627;
tables[12][32] = 274593;
tables[12][33] = 274597;
tables[12][34] = 274599;
tables[12][35] = 274601;
tables[12][36] = 274659;
tables[12][37] = 274661;
tables[12][38] = 274663;
tables[12][39] = 274674;
tables[12][48] = 274444;
tables[12][49] = 274445;
tables[12][50] = 274445;
tables[12][54] = 274433;
tables[12][55] = 274434;
tables[12][56] = 274683;
tables[12][89] = 393265;
tables[12][90] = 393266;
tables[12][91] = 393267;
tables[12][92] = 393268;
tables[12][93] = 393269;
tables[12][94] = 393270;
tables[12][95] = 393271;
tables[12][96] = 393272;
tables[12][97] = 393273;
tables[12][98] = 393264;
tables[12][99] = 393262;
tables[13] = tables[9];
tables[13][4] = 327553;
tables[13][5] = 327546;
tables[13][6] = 327551;
tables[13][7] = 327548;
tables[13][8] = 327538;
tables[13][9] = 327562;
tables[13][10] = 327543;
tables[13][11] = 327544;
tables[13][12] = 327558;
tables[13][13] = 327567;
tables[13][14] = 327561;
tables[13][15] = 327576;
tables[13][16] = 327571;
tables[13][17] = 327568;
tables[13][18] = 327575;
tables[13][19] = 327550;
tables[13][20] = 327552;
tables[13][21] = 327549;
tables[13][22] = 327556;
tables[13][23] = 327542;
tables[13][24] = 327557;
tables[13][25] = 327563;
tables[13][26] = 327555;
tables[13][27] = 327547;
tables[13][28] = 327581;
tables[13][29] = 327554;
tables[13][30] = 327559;
tables[13][31] = 327564;
tables[13][32] = 327537;
tables[13][33] = 327539;
tables[13][34] = 327540;
tables[13][35] = 327541;
tables[13][36] = 327572;
tables[13][37] = 327573;
tables[13][38] = 327574;
tables[13][39] = 327580;
tables[13][45] = 327566;
tables[13][46] = 327565;
tables[13][47] = 327582;
tables[13][48] = 327583;
tables[13][49] = 327569;
tables[13][50] = 327569;
tables[13][51] = 327578;
tables[13][52] = 327545;
tables[13][54] = 327560;
tables[13][55] = 327577;
tables[13][56] = 327570;
tables[13][135] = 327579;
tables[13][137] = 327536;
tables[14] = tables[13];
tables[14][8] = 327528;
tables[14][29] = 327535;
tables[14][32] = 327527;
tables[14][33] = 327529;
tables[14][34] = 327530;
tables[14][35] = 327531;
tables[14][36] = 327532;
tables[14][37] = 327533;
tables[14][38] = 327534;
tables[14][39] = 327526;
tables[14][48] = 327522;
tables[14][49] = 327523;
tables[14][50] = 327523;
tables[14][54] = 327524;
tables[14][55] = 327521;
tables[14][56] = 327525;
tables[14][89] = 393265;
tables[14][90] = 393266;
tables[14][91] = 393267;
tables[14][92] = 393268;
tables[14][93] = 393269;
tables[14][94] = 393270;
tables[14][95] = 393271;
tables[14][96] = 393272;
tables[14][97] = 393273;
tables[14][98] = 393264;
tables[14][99] = 393262;
tables[15] = tables[11];
tables[15][4] = 274529;
tables[15][5] = 274515;
tables[15][6] = 274525;
tables[15][7] = 274519;
tables[15][8] = 274500;
tables[15][9] = 274543;
tables[15][10] = 274509;
tables[15][11] = 274511;
tables[15][12] = 274539;
tables[15][13] = 274558;
tables[15][14] = 274542;
tables[15][15] = 274570;
tables[15][16] = 274562;
tables[15][17] = 274559;
tables[15][18] = 274569;
tables[15][19] = 274523;
tables[15][20] = 274527;
tables[15][21] = 274521;
tables[15][22] = 274536;
tables[15][23] = 274507;
tables[15][24] = 274538;
tables[15][25] = 274546;
tables[15][26] = 274534;
tables[15][27] = 274517;
tables[15][28] = 274579;
tables[15][29] = 274532;
tables[15][30] = 274540;
tables[15][31] = 274549;
tables[15][32] = 274498;
tables[15][33] = 274502;
tables[15][34] = 274504;
tables[15][35] = 274506;
tables[15][36] = 274564;
tables[15][37] = 274566;
tables[15][38] = 274568;
tables[15][39] = 274575;
tables[15][45] = 274555;
tables[15][46] = 274552;
tables[15][49] = 274560;
tables[15][50] = 274560;
tables[15][51] = 274572;
tables[15][52] = 274513;
tables[15][54] = 274541;
tables[15][55] = 274571;
tables[15][56] = 274561;
tables[15][135] = 274573;
tables[16] = tables[15];
tables[16][8] = 274499;
tables[16][29] = 274531;
tables[16][32] = 274497;
tables[16][33] = 274501;
tables[16][34] = 274503;
tables[16][35] = 274505;
tables[16][36] = 274563;
tables[16][37] = 274565;
tables[16][38] = 274567;
tables[16][39] = 274578;
tables[16][48] = 274444;
tables[16][49] = 274445;
tables[16][50] = 274445;
tables[16][54] = 274433;
tables[16][55] = 274434;
tables[16][56] = 274683;
tables[16][89] = 393265;
tables[16][90] = 393266;
tables[16][91] = 393267;
tables[16][92] = 393268;
tables[16][93] = 393269;
tables[16][94] = 393270;
tables[16][95] = 393271;
tables[16][96] = 393272;
tables[16][97] = 393273;
tables[16][98] = 393264;
tables[16][99] = 393262;
tables[17] = tables[1];
tables[17][30] = 327729;
tables[17][31] = 327730;
tables[17][32] = 327731;
tables[17][33] = 327732;
tables[17][34] = 327733;
tables[17][35] = 327734;
tables[17][36] = 327735;
tables[17][37] = 327736;
tables[17][38] = 327737;
tables[17][39] = 327728;
tables[17][45] = 327903;
tables[17][46] = 262324;
tables[17][47] = 327932;
tables[17][48] = 327723;
tables[17][49] = 327715;
tables[17][50] = 327715;
tables[17][51] = 327926;
tables[17][52] = 327908;
tables[17][53] = 262238;
tables[17][54] = 327724;
tables[17][55] = 327726;
tables[17][136] = 262238;
tables[17][137] = 262238;
tables[17][138] = 262238;
tables[17][146] = 262238;
tables[17][147] = 262238;
tables[18] = tables[2];
tables[18][30] = 327713;
tables[18][31] = 327714;
tables[18][32] = 327847;
tables[18][33] = 327716;
tables[18][34] = 327717;
tables[18][35] = 327718;
tables[18][36] = 327727;
tables[18][37] = 327720;
tables[18][38] = 327721;
tables[18][39] = 327741;
tables[18][45] = 327743;
tables[18][47] = 327900;
tables[18][48] = 327722;
tables[18][49] = 327719;
tables[18][50] = 327719;
tables[18][51] = 327894;
tables[18][52] = 327876;
tables[18][54] = 327739;
tables[18][55] = 327738;
tables[19][8] = 336044;
tables[19][16] = 327861;
tables[19][20] = 327744;
tables[19][31] = 327858;
tables[19][32] = 327859;
tables[19][36] = 327803;
tables[19][37] = 327771;
tables[19][38] = 327773;
tables[19][39] = 327805;
tables[19][45] = 327772;
tables[19][48] = 327806;
tables[19][100] = 262268;
tables[20] = tables[1];
tables[20][28] = 327801;
tables[20][29] = 327802;
tables[20][46] = 262305;
tables[20][47] = 262240;
tables[20][48] = 262187;
tables[20][49] = 327911;
tables[20][50] = 327911;
tables[20][51] = 327921;
tables[20][52] = 262324;
tables[20][53] = 262330;
tables[21] = tables[2];
tables[21][28] = 327769;
tables[21][29] = 327770;
tables[21][30] = 262177;
tables[21][32] = 262327;
tables[21][33] = 262180;
tables[21][46] = 262335;
tables[21][47] = 262238;
tables[21][48] = 262186;
tables[21][49] = 327879;
tables[21][50] = 327879;
tables[21][51] = 327889;
tables[21][52] = 262312;
tables[21][53] = 262314;
tables[22] = tables[3];
tables[22][30] = 262268;
tables[22][33] = 262270;
tables[22][34] = 262272;
tables[22][36] = 0;
tables[22][37] = 0;
tables[22][45] = 0;
tables[22][46] = 0;
tables[22][49] = 327805;
tables[22][50] = 327805;
tables[22][53] = 262236;
tables[22][100] = 0;
tables[22][136] = 262270;
tables[22][137] = 262270;
tables[22][138] = 262270;
tables[22][146] = 262270;
tables[22][147] = 262270;
tables[23] = tables[17];
tables[23][4] = 327793;
tables[23][16] = 327724;
tables[23][20] = 327777;
tables[23][26] = 327802;
tables[23][28] = 327801;
tables[23][29] = 327799;
tables[23][30] = 327718;
tables[23][31] = 327913;
tables[23][32] = 327714;
tables[23][33] = 327719;
tables[23][34] = 327720;
tables[23][35] = 327725;
tables[23][36] = 327912;
tables[23][37] = 327775;
tables[23][38] = 327911;
tables[23][39] = 327904;
tables[23][45] = 327721;
tables[23][46] = 327741;
tables[23][47] = 327774;
tables[23][48] = 327716;
tables[23][49] = 327722;
tables[23][50] = 327722;
tables[23][51] = 327789;
tables[23][52] = 327929;
tables[23][53] = 262322;
tables[23][54] = 327739;
tables[23][55] = 327738;
tables[23][56] = 327713;
tables[24] = tables[21];
tables[24][4] = 327761;
tables[24][16] = 327743;
tables[24][20] = 327745;
tables[24][26] = 327770;
tables[24][29] = 327767;
tables[24][30] = 327729;
tables[24][31] = 327730;
tables[24][32] = 327731;
tables[24][33] = 327732;
tables[24][34] = 327733;
tables[24][35] = 327734;
tables[24][36] = 327735;
tables[24][37] = 327736;
tables[24][38] = 327737;
tables[24][39] = 327728;
tables[24][45] = 327856;
tables[24][46] = 327723;
tables[24][47] = 327848;
tables[24][48] = 327843;
tables[24][49] = 327861;
tables[24][50] = 327861;
tables[24][51] = 327757;
tables[24][52] = 327717;
tables[24][53] = 0;
tables[24][54] = 327726;
tables[24][55] = 327727;
tables[24][56] = 327847;
tables[24][136] = 262312;
tables[24][137] = 262312;
tables[24][138] = 262312;
tables[24][146] = 262312;
tables[24][147] = 262312;
tables[25][8] = 336044;
tables[25][31] = 262270;
tables[25][32] = 327715;
tables[25][33] = 327803;
tables[25][34] = 327771;
tables[25][35] = 327804;
tables[25][36] = 262240;
tables[25][37] = 327772;
tables[25][38] = 327774;
tables[25][39] = 327744;
tables[25][45] = 327773;
tables[25][46] = 327805;
tables[25][48] = 327844;
tables[25][136] = 262270;
tables[25][137] = 262270;
tables[25][138] = 262270;
tables[25][146] = 262270;
tables[25][147] = 262270;
tables[26] = tables[20];
tables[26][46] = 262380;
tables[26][47] = 262376;
tables[26][49] = 262393;
tables[26][50] = 262393;
tables[26][51] = 262386;
tables[26][52] = 262368;
tables[26][53] = 262236;
tables[27] = tables[21];
tables[27][32] = 262307;
tables[27][46] = 262238;
tables[27][47] = 262377;
tables[27][49] = 262311;
tables[27][50] = 262311;
tables[27][51] = 262375;
tables[27][52] = 262320;
tables[27][53] = 262268;
tables[28] = tables[6];
tables[28][8] = 336044;
tables[28][47] = 262235;
tables[28][48] = 262237;
tables[28][51] = 262208;
tables[28][52] = 262179;
tables[29][47] = 262267;
tables[29][48] = 262269;
tables[30] = tables[20];
tables[30][45] = 262191;
tables[30][46] = 262320;
tables[30][47] = 262312;
tables[30][48] = 262186;
tables[30][49] = 262204;
tables[30][50] = 262204;
tables[30][51] = 262187;
tables[30][53] = 262208;
tables[30][100] = 262237;
tables[31] = tables[21];
tables[31][32] = 262179;
tables[31][36] = 262239;
tables[31][39] = 262183;
tables[31][46] = 262270;
tables[31][48] = 262268;
tables[31][49] = 262206;
tables[31][50] = 262206;
tables[31][51] = 262321;
tables[31][52] = 262240;
tables[31][53] = 262311;
tables[31][56] = 262205;
tables[31][100] = 262235;
tables[31][136] = 262270;
tables[31][137] = 262270;
tables[31][138] = 262270;
tables[31][146] = 262270;
tables[31][147] = 262270;
tables[32][6] = 327842;
tables[32][8] = 336044;
tables[32][16] = 327861;
tables[32][21] = 327862;
tables[32][22] = 327903;
tables[32][27] = 327867;
tables[32][29] = 327851;
tables[32][30] = 262329;
tables[32][31] = 262322;
tables[32][32] = 262323;
tables[32][33] = 262332;
tables[32][34] = 262333;
tables[32][35] = 262334;
tables[32][36] = 262307;
tables[32][37] = 262267;
tables[32][38] = 262269;
tables[32][45] = 262236;
tables[32][46] = 262328;
tables[32][53] = 262316;
tables[32][55] = 262327;
tables[32][100] = 262310;
tables[32][136] = 262328;
tables[32][137] = 262328;
tables[32][138] = 262328;
tables[32][146] = 262328;
tables[32][147] = 262328;
tables[33] = tables[26];
tables[33][46] = 262315;
tables[33][47] = 262187;
tables[33][48] = 262324;
tables[33][49] = 262270;
tables[33][50] = 262270;
tables[33][51] = 327911;
tables[33][52] = 262330;
tables[34] = tables[27];
tables[34][32] = 262179;
tables[34][46] = 262331;
tables[34][47] = 262186;
tables[34][48] = 262240;
tables[34][49] = 262238;
tables[34][50] = 262238;
tables[34][51] = 327879;
tables[34][52] = 262314;
tables[35] = tables[6];
tables[35][8] = 336044;
tables[35][31] = 262208;
tables[35][32] = 262307;
tables[35][33] = 262311;
tables[35][36] = 262267;
tables[35][37] = 262235;
tables[35][38] = 262237;
tables[35][39] = 262269;
tables[35][47] = 262312;
tables[35][48] = 262237;
tables[35][136] = 262312;
tables[35][137] = 262312;
tables[35][138] = 262312;
tables[35][146] = 262312;
tables[35][147] = 262312;
tables[36] = tables[4];
tables[36][4] = 328772;
tables[36][5] = 328760;
tables[36][6] = 328769;
tables[36][7] = 328754;
tables[36][8] = 328771;
tables[36][9] = 328752;
tables[36][10] = 328767;
tables[36][11] = 328768;
tables[36][12] = 328776;
tables[36][13] = 328766;
tables[36][14] = 328763;
tables[36][15] = 328756;
tables[36][16] = 328780;
tables[36][17] = 328770;
tables[36][18] = 328777;
tables[36][19] = 328759;
tables[36][20] = 328761;
tables[36][21] = 328762;
tables[36][22] = 328779;
tables[36][23] = 328757;
tables[36][24] = 328755;
tables[36][25] = 328764;
tables[36][26] = 328774;
tables[36][27] = 328775;
tables[36][28] = 328765;
tables[36][29] = 328783;
tables[36][47] = 328773;
tables[36][48] = 328778;
tables[36][51] = 328758;
tables[36][52] = 328781;
tables[36][53] = 328785;
tables[36][54] = 328753;
tables[36][55] = 328782;
tables[36][56] = 262190;
tables[37] = tables[5];
tables[37][4] = 328740;
tables[37][5] = 328728;
tables[37][6] = 328737;
tables[37][7] = 328722;
tables[37][8] = 328739;
tables[37][9] = 328720;
tables[37][10] = 328735;
tables[37][11] = 328736;
tables[37][12] = 328744;
tables[37][13] = 328734;
tables[37][14] = 328731;
tables[37][15] = 328724;
tables[37][16] = 328748;
tables[37][17] = 328738;
tables[37][18] = 328745;
tables[37][19] = 328727;
tables[37][20] = 328729;
tables[37][21] = 328730;
tables[37][22] = 328747;
tables[37][23] = 328725;
tables[37][24] = 328723;
tables[37][25] = 328732;
tables[37][26] = 328742;
tables[37][27] = 328743;
tables[37][28] = 328733;
tables[37][29] = 328751;
tables[37][31] = 262178;
tables[37][32] = 270614;
tables[37][33] = 262203;
tables[37][35] = 262202;
tables[37][36] = 262207;
tables[37][47] = 328741;
tables[37][48] = 328746;
tables[37][49] = 262191;
tables[37][50] = 262191;
tables[37][51] = 328726;
tables[37][52] = 328749;
tables[37][53] = 328705;
tables[37][54] = 328721;
tables[37][55] = 328750;
tables[37][56] = 262188;
tables[37][100] = 262191;
tables[38] = tables[4];
tables[38][49] = 262179;
tables[38][50] = 262179;
tables[39] = tables[5];
tables[39][31] = 262178;
tables[39][32] = 262307;
tables[39][49] = 262270;
tables[39][50] = 262270;
tables[39][52] = 262208;
tables[39][53] = 262316;
tables[40][4] = 327905;
tables[40][8] = 327913;
tables[40][12] = 327917;
tables[40][18] = 327923;
tables[40][24] = 327930;
tables[40][33] = 270508;
tables[40][53] = 262310;
tables[41][4] = 327873;
tables[41][8] = 327881;
tables[41][12] = 327885;
tables[41][18] = 327891;
tables[41][24] = 327898;
tables[42] = tables[4];
tables[42][4] = 332038;
tables[42][5] = 332146;
tables[42][6] = 332046;
tables[42][7] = 332043;
tables[42][8] = 332035;
tables[42][9] = 332037;
tables[42][10] = 332050;
tables[42][11] = 332137;
tables[42][12] = 332131;
tables[42][13] = 332133;
tables[42][14] = 332129;
tables[42][15] = 332149;
tables[42][16] = 332147;
tables[42][17] = 332142;
tables[42][18] = 332130;
tables[42][19] = 332134;
tables[42][20] = 332039;
tables[42][21] = 332032;
tables[42][22] = 332034;
tables[42][23] = 332041;
tables[42][24] = 332135;
tables[42][25] = 332049;
tables[42][26] = 332044;
tables[42][27] = 332048;
tables[42][28] = 332141;
tables[42][29] = 332047;
tables[42][50] = 262237;
tables[42][52] = 270360;
tables[43] = tables[5];
tables[43][4] = 332038;
tables[43][5] = 332146;
tables[43][6] = 332046;
tables[43][7] = 332043;
tables[43][8] = 332036;
tables[43][9] = 332037;
tables[43][10] = 332050;
tables[43][11] = 332137;
tables[43][12] = 332131;
tables[43][13] = 332133;
tables[43][14] = 332129;
tables[43][15] = 332149;
tables[43][16] = 332147;
tables[43][17] = 332142;
tables[43][18] = 332132;
tables[43][19] = 332136;
tables[43][20] = 332040;
tables[43][21] = 332033;
tables[43][22] = 332034;
tables[43][23] = 332042;
tables[43][24] = 332135;
tables[43][25] = 332049;
tables[43][26] = 332045;
tables[43][27] = 332048;
tables[43][28] = 332141;
tables[43][29] = 332047;
tables[43][50] = 262269;
tables[43][52] = 270364;
tables[44] = tables[20];
tables[44][45] = 262187;
tables[44][46] = 262236;
tables[44][47] = 327909;
tables[44][48] = 262312;
tables[44][49] = 262183;
tables[44][50] = 262183;
tables[44][51] = 327928;
tables[44][52] = 327910;
tables[44][53] = 262268;
tables[45] = tables[34];
tables[45][33] = 262308;
tables[45][46] = 262240;
tables[45][47] = 327877;
tables[45][48] = 262238;
tables[45][49] = 262186;
tables[45][50] = 262186;
tables[45][51] = 327896;
tables[45][52] = 327878;
tables[45][53] = 262311;
tables[45][136] = 262240;
tables[45][137] = 262240;
tables[45][138] = 262240;
tables[45][146] = 262240;
tables[45][147] = 262240;
tables[46] = tables[35];
tables[46][16] = 327861;
tables[46][33] = 262180;
tables[46][46] = 262324;
tables[46][47] = 0;
tables[46][48] = 262270;
tables[46][136] = 262324;
tables[46][137] = 262324;
tables[46][138] = 262324;
tables[46][146] = 262324;
tables[46][147] = 262324;
tables[47] = tables[44];
tables[47][46] = 262324;
tables[47][51] = 327926;
tables[47][52] = 327908;
tables[47][53] = 262311;
tables[47][136] = 262312;
tables[47][137] = 262312;
tables[47][138] = 262312;
tables[47][146] = 262312;
tables[47][147] = 262312;
tables[48] = tables[45];
tables[48][51] = 327894;
tables[48][52] = 327876;
tables[48][53] = 262333;
tables[48][136] = 262238;
tables[48][137] = 262238;
tables[48][138] = 262238;
tables[48][146] = 262238;
tables[48][147] = 262238;
tables[49] = tables[46];
tables[49][45] = 262236;
tables[49][46] = 0;
tables[49][100] = 262268;
tables[49][136] = 262270;
tables[49][137] = 262270;
tables[49][138] = 262270;
tables[49][146] = 262270;
tables[49][147] = 262270;
tables[50] = tables[47];
tables[50][51] = 327910;
tables[50][52] = 327928;
tables[50][53] = 262333;
tables[50][136] = 262324;
tables[50][137] = 262324;
tables[50][138] = 262324;
tables[50][146] = 262324;
tables[50][147] = 262324;
tables[51] = tables[45];
tables[51][51] = 327878;
tables[51][52] = 327896;
tables[52] = tables[46];
tables[52][34] = 262272;
tables[52][46] = 262268;
tables[52][100] = 262236;
tables[52][136] = 0;
tables[52][137] = 0;
tables[52][138] = 0;
tables[52][146] = 0;
tables[52][147] = 0;
tables[53] = tables[38];
tables[53][4] = 340231;
tables[53][5] = 340246;
tables[53][6] = 340239;
tables[53][7] = 340238;
tables[53][8] = 340237;
tables[53][9] = 340241;
tables[53][10] = 340245;
tables[53][11] = 340248;
tables[53][12] = 340251;
tables[53][13] = 340264;
tables[53][14] = 340252;
tables[53][15] = 340256;
tables[53][16] = 340265;
tables[53][17] = 340249;
tables[53][18] = 340255;
tables[53][19] = 340259;
tables[53][20] = 340230;
tables[53][21] = 340240;
tables[53][22] = 340235;
tables[53][23] = 340244;
tables[53][24] = 340263;
tables[53][25] = 340242;
tables[53][26] = 340234;
tables[53][27] = 340236;
tables[53][28] = 340247;
tables[53][29] = 340232;
tables[53][30] = 274693;
tables[53][31] = 274697;
tables[53][32] = 262855;
tables[53][33] = 262859;
tables[53][34] = 274707;
tables[53][35] = 262858;
tables[53][36] = 262873;
tables[53][37] = 274714;
tables[53][38] = 274718;
tables[53][39] = 274722;
tables[53][45] = 274726;
tables[53][51] = 274724;
tables[53][52] = 270360;
tables[53][54] = 274717;
tables[53][55] = 274721;
tables[53][56] = 274725;
tables[54] = tables[43];
tables[54][4] = 327777;
tables[54][5] = 327778;
tables[54][6] = 327779;
tables[54][7] = 327780;
tables[54][8] = 327781;
tables[54][9] = 327782;
tables[54][10] = 327783;
tables[54][11] = 327784;
tables[54][12] = 327785;
tables[54][13] = 327786;
tables[54][14] = 327787;
tables[54][15] = 327788;
tables[54][16] = 327789;
tables[54][17] = 327790;
tables[54][18] = 327791;
tables[54][19] = 327792;
tables[54][20] = 327793;
tables[54][21] = 327794;
tables[54][22] = 327795;
tables[54][23] = 327796;
tables[54][24] = 327797;
tables[54][25] = 327798;
tables[54][26] = 327799;
tables[54][27] = 327800;
tables[54][28] = 327801;
tables[54][29] = 327802;
tables[54][50] = 262179;
tables[54][100] = 262236;
tables[55] = tables[5];
tables[55][52] = 270364;
tables[56] = tables[7];
tables[56][46] = 327453;
tables[56][47] = 327483;
tables[56][48] = 327485;
tables[56][49] = 327484;
tables[56][50] = 327484;
tables[56][52] = 270360;
tables[56][53] = 270360;
tables[56][100] = 327653;
tables[56][135] = 0;
tables[57] = tables[8];
tables[57][31] = 327456;
tables[57][35] = 327486;
tables[57][36] = 327430;
tables[57][37] = 327434;
tables[57][38] = 327432;
tables[57][39] = 327433;
tables[57][45] = 327487;
tables[57][46] = 327435;
tables[57][47] = 327515;
tables[57][48] = 327517;
tables[57][49] = 327516;
tables[57][50] = 327516;
tables[57][51] = 327450;
tables[57][52] = 270364;
tables[57][53] = 327518;
tables[57][100] = 327516;
tables[57][135] = 0;
tables[57][137] = 0;
tables[58] = tables[42];
tables[58][4] = 353765;
tables[58][5] = 354056;
tables[58][6] = 365009;
tables[58][7] = 354088;
tables[58][8] = 355380;
tables[58][9] = 356459;
tables[58][10] = 349983;
tables[58][11] = 359161;
tables[58][12] = 352776;
tables[58][13] = 348993;
tables[58][14] = 350503;
tables[58][15] = 347693;
tables[58][16] = 347648;
tables[58][17] = 352019;
tables[58][18] = 347834;
tables[58][19] = 352195;
tables[58][20] = 352843;
tables[58][21] = 349155;
tables[58][22] = 351288;
tables[58][23] = 351999;
tables[58][24] = 351345;
tables[58][25] = 350579;
tables[58][26] = 357680;
tables[58][27] = 366307;
tables[58][28] = 349020;
tables[58][29] = 365005;
tables[58][50] = 262179;
tables[59] = tables[1];
tables[59][47] = 262376;
tables[59][51] = 262377;
tables[59][52] = 262368;
tables[60] = tables[2];
tables[60][47] = 262396;
tables[60][51] = 262390;
tables[60][52] = 262372;
tables[61] = tables[4];
tables[61][47] = 262238;
tables[61][48] = 262328;
tables[61][49] = 262204;
tables[61][50] = 262204;
tables[61][52] = 262240;
tables[61][53] = 262179;
tables[61][56] = 327913;
tables[61][100] = 262315;
tables[61][136] = 262240;
tables[61][137] = 262240;
tables[61][138] = 262240;
tables[61][146] = 262240;
tables[61][147] = 262240;
tables[62] = tables[39];
tables[62][32] = 262191;
tables[62][35] = 262207;
tables[62][47] = 262238;
tables[62][48] = 262312;
tables[62][49] = 262206;
tables[62][50] = 262206;
tables[62][52] = 262240;
tables[62][53] = 262268;
tables[62][54] = 262183;
tables[62][55] = 262190;
tables[62][56] = 327881;
tables[62][100] = 262331;
tables[62][136] = 262240;
tables[62][137] = 262240;
tables[62][138] = 262240;
tables[62][146] = 262240;
tables[62][147] = 262240;
tables[63] = tables[52];
tables[63][8] = 0;
tables[63][18] = 327847;
tables[63][19] = 327862;
tables[63][30] = 262321;
tables[63][33] = 262306;
tables[63][34] = 262308;
tables[63][35] = 262316;
tables[63][36] = 262310;
tables[63][37] = 262322;
tables[63][38] = 262323;
tables[63][39] = 262332;
tables[63][45] = 262333;
tables[63][46] = 262334;
tables[63][47] = 262235;
tables[63][48] = 262237;
tables[63][49] = 262269;
tables[63][50] = 262269;
tables[63][51] = 262270;
tables[63][52] = 262267;
tables[63][53] = 262236;
tables[63][54] = 262319;
tables[63][55] = 262317;
tables[63][56] = 262324;
tables[63][100] = 262320;
tables[64] = tables[23];
tables[64][35] = 327847;
tables[64][37] = 327713;
tables[64][46] = 327725;
tables[64][49] = 327861;
tables[64][50] = 327861;
tables[64][56] = 327741;
tables[65] = tables[24];
tables[65][46] = 327775;
tables[65][48] = 327722;
tables[65][49] = 327843;
tables[65][50] = 327843;
tables[65][53] = 262323;
tables[65][56] = 327723;
tables[66][8] = 336044;
tables[66][30] = 327804;
tables[66][31] = 327744;
tables[66][32] = 327715;
tables[66][33] = 327803;
tables[66][34] = 327771;
tables[66][35] = 327774;
tables[66][38] = 327803;
tables[66][39] = 327805;
tables[66][47] = 327771;
tables[66][48] = 327773;
tables[66][49] = 262240;
tables[66][50] = 262240;
tables[66][52] = 262324;
tables[66][56] = 262270;
tables[66][100] = 262236;
tables[67][49] = 262240;
tables[67][50] = 262240;
tables[67][52] = 262324;
tables[67][56] = 262270;
tables[67][136] = 262240;
tables[67][137] = 262240;
tables[67][138] = 262240;
tables[67][146] = 262240;
tables[67][147] = 262240;
tables[68] = tables[4];
tables[68][49] = 262179;
tables[68][100] = 0;
tables[69] = tables[5];
tables[69][49] = 262270;
tables[69][100] = 0;
tables[70][4] = 327941;
tables[70][6] = 327943;
tables[70][8] = 327961;
tables[70][15] = 328002;
tables[70][17] = 328004;
tables[70][18] = 327923;
tables[70][22] = 328027;
tables[70][24] = 270508;
tables[70][27] = 328058;
tables[70][29] = 328060;
tables[71][4] = 327940;
tables[71][6] = 327942;
tables[71][8] = 327960;
tables[71][15] = 328001;
tables[71][17] = 328003;
tables[71][18] = 327891;
tables[71][22] = 328026;
tables[71][27] = 328057;
tables[71][29] = 328059;
tables[72] = tables[4];
tables[72][47] = 262324;
tables[72][48] = 262235;
tables[72][49] = 0;
tables[72][50] = 262237;
tables[72][51] = 327911;
tables[72][52] = 262270;
tables[72][53] = 262183;
tables[72][56] = 262203;
tables[72][135] = 262191;
tables[73] = tables[5];
tables[73][35] = 262312;
tables[73][47] = 262240;
tables[73][48] = 262267;
tables[73][49] = 0;
tables[73][50] = 262269;
tables[73][51] = 327879;
tables[73][52] = 262238;
tables[73][53] = 262178;
tables[73][56] = 262202;
tables[73][135] = 262207;
tables[74][8] = 262320;
tables[74][20] = 262191;
tables[74][26] = 262207;
tables[74][30] = 262329;
tables[74][31] = 262322;
tables[74][32] = 262323;
tables[74][33] = 262307;
tables[74][34] = 262306;
tables[74][35] = 262316;
tables[74][46] = 262311;
tables[74][48] = 262314;
tables[74][50] = 262330;
tables[74][135] = 262320;
tables[75] = tables[20];
tables[75][12] = 327985;
tables[75][45] = 262186;
tables[75][46] = 262189;
tables[75][47] = 327967;
tables[75][48] = 327932;
tables[75][49] = 0;
tables[75][50] = 262188;
tables[75][51] = 328031;
tables[75][52] = 327785;
tables[75][53] = 262178;
tables[75][54] = 327926;
tables[75][55] = 327911;
tables[75][56] = 262190;
tables[76] = tables[21];
tables[76][31] = 262183;
tables[76][32] = 262238;
tables[76][33] = 262187;
tables[76][46] = 262239;
tables[76][47] = 327966;
tables[76][48] = 262364;
tables[76][49] = 0;
tables[76][50] = 262203;
tables[76][51] = 328030;
tables[76][52] = 327984;
tables[76][53] = 262377;
tables[76][54] = 327894;
tables[76][55] = 327879;
tables[76][56] = 262202;
tables[77] = tables[52];
tables[77][4] = 327910;
tables[77][8] = 270508;
tables[77][12] = 327785;
tables[77][16] = 0;
tables[77][20] = 262208;
tables[77][22] = 262367;
tables[77][30] = 262206;
tables[77][31] = 262307;
tables[77][32] = 262179;
tables[77][34] = 262333;
tables[77][45] = 262236;
tables[77][47] = 262312;
tables[77][50] = 262240;
tables[77][51] = 262324;
tables[77][53] = 262204;
tables[77][100] = 262268;
tables[78][4] = 327878;
tables[78][12] = 327984;
tables[79] = tables[20];
tables[79][41] = 262268;
tables[79][46] = 262335;
tables[79][47] = 262324;
tables[79][50] = 327805;
tables[79][52] = 262267;
tables[79][53] = 262268;
tables[80] = tables[21];
tables[80][32] = 262179;
tables[80][46] = 262305;
tables[80][47] = 262312;
tables[80][50] = 327773;
tables[80][52] = 262235;
tables[80][53] = 262320;
tables[81][20] = 262208;
tables[81][45] = 262236;
tables[81][48] = 262270;
tables[81][50] = 262240;
tables[81][52] = 262238;
tables[81][53] = 262316;
tables[82] = tables[4];
tables[82][4] = 263732;
tables[82][5] = 263748;
tables[82][6] = 263716;
tables[82][7] = 263754;
tables[82][8] = 263723;
tables[82][9] = 263720;
tables[82][10] = 263748;
tables[82][11] = 263719;
tables[82][12] = 263751;
tables[82][13] = 263722;
tables[82][14] = 263750;
tables[82][15] = 263749;
tables[82][16] = 263721;
tables[82][17] = 263753;
tables[82][18] = 263726;
tables[82][19] = 263725;
tables[82][20] = 263734;
tables[82][21] = 263746;
tables[82][22] = 263731;
tables[82][23] = 263745;
tables[82][24] = 263737;
tables[82][25] = 263729;
tables[82][26] = 263733;
tables[82][27] = 263713;
tables[82][28] = 263738;
tables[82][29] = 263718;
tables[82][47] = 263724;
tables[82][48] = 263727;
tables[82][51] = 263747;
tables[82][52] = 263735;
tables[82][53] = 263728;
tables[82][54] = 263752;
tables[82][55] = 263730;
tables[82][56] = 263736;
tables[83] = tables[5];
tables[83][4] = 263760;
tables[83][5] = 263748;
tables[83][6] = 262269;
tables[83][7] = 262237;
tables[83][8] = 263759;
tables[83][9] = 262235;
tables[83][10] = 263748;
tables[83][11] = 263715;
tables[83][12] = 262391;
tables[83][13] = 263744;
tables[83][14] = 263692;
tables[83][15] = 262191;
tables[83][16] = 270361;
tables[83][17] = 263714;
tables[83][18] = 262359;
tables[83][19] = 263707;
tables[83][20] = 263758;
tables[83][21] = 263756;
tables[83][22] = 263757;
tables[83][23] = 263748;
tables[83][24] = 270360;
tables[83][25] = 262267;
tables[83][26] = 263755;
tables[83][27] = 263762;
tables[83][28] = 263717;
tables[83][29] = 262270;
tables[83][38] = 262185;
tables[83][39] = 262184;
tables[83][47] = 262204;
tables[83][48] = 262206;
tables[83][53] = 263761;
tables[83][54] = 262188;
tables[83][55] = 262190;
tables[83][56] = 263711;
tables[84] = tables[1];
tables[84][4] = 331295;
tables[84][5] = 331316;
tables[84][6] = 331329;
tables[84][7] = 331265;
tables[84][8] = 331315;
tables[84][9] = 331284;
tables[84][10] = 331328;
tables[84][11] = 331337;
tables[84][12] = 331299;
tables[84][13] = 331336;
tables[84][14] = 331314;
tables[84][15] = 331306;
tables[84][16] = 331287;
tables[84][17] = 331319;
tables[84][18] = 331289;
tables[84][19] = 331298;
tables[84][20] = 331334;
tables[84][21] = 331294;
tables[84][22] = 331307;
tables[84][23] = 331312;
tables[84][24] = 331317;
tables[84][25] = 331309;
tables[84][26] = 331332;
tables[84][27] = 331291;
tables[84][28] = 331313;
tables[84][29] = 331292;
tables[84][30] = 331333;
tables[84][31] = 327727;
tables[84][32] = 327725;
tables[84][33] = 331296;
tables[84][34] = 331286;
tables[84][35] = 331320;
tables[84][36] = 331318;
tables[84][37] = 331268;
tables[84][38] = 331285;
tables[84][39] = 331272;
tables[84][45] = 331266;
tables[84][46] = 331274;
tables[84][47] = 331290;
tables[84][48] = 331301;
tables[84][49] = 331267;
tables[84][50] = 331267;
tables[84][51] = 331303;
tables[84][52] = 331271;
tables[84][53] = 327775;
tables[84][54] = 331297;
tables[84][55] = 331331;
tables[84][56] = 331293;
tables[84][100] = 331267;
tables[84][103] = 0;
tables[84][133] = 0;
tables[84][134] = 0;
tables[84][140] = 0;
tables[85] = tables[2];
tables[85][4] = 331300;
tables[85][5] = 331322;
tables[85][6] = 331273;
tables[85][7] = 331279;
tables[85][8] = 331278;
tables[85][9] = 331330;
tables[85][10] = 331276;
tables[85][11] = 331335;
tables[85][12] = 331283;
tables[85][13] = 331339;
tables[85][14] = 331305;
tables[85][15] = 331304;
tables[85][16] = 327743;
tables[85][17] = 331340;
tables[85][18] = 331311;
tables[85][19] = 331277;
tables[85][20] = 331344;
tables[85][21] = 331281;
tables[85][22] = 331270;
tables[85][23] = 331288;
tables[85][24] = 331338;
tables[85][25] = 331310;
tables[85][26] = 327714;
tables[85][27] = 327721;
tables[85][28] = 331341;
tables[85][29] = 327720;
tables[85][30] = 327723;
tables[85][31] = 331345;
tables[85][32] = 331346;
tables[85][33] = 331347;
tables[85][34] = 331348;
tables[85][35] = 331321;
tables[85][36] = 331327;
tables[85][37] = 331349;
tables[85][38] = 331350;
tables[85][39] = 331351;
tables[85][45] = 331352;
tables[85][46] = 331353;
tables[85][47] = 331280;
tables[85][48] = 327724;
tables[85][49] = 331269;
tables[85][50] = 331269;
tables[85][51] = 331275;
tables[85][52] = 327726;
tables[85][53] = 327717;
tables[85][54] = 331282;
tables[85][55] = 331308;
tables[85][56] = 331302;
tables[85][100] = 331269;
tables[85][103] = 0;
tables[85][133] = 0;
tables[85][134] = 0;
tables[85][140] = 0;
tables[86] = tables[1];
tables[86][30] = 262187;
tables[86][31] = 327963;
tables[86][32] = 328033;
tables[86][33] = 327949;
tables[86][34] = 328025;
tables[86][35] = 328062;
tables[86][36] = 327933;
tables[86][37] = 327905;
tables[86][38] = 327917;
tables[86][39] = 327913;
tables[86][45] = 262205;
tables[86][46] = 262324;
tables[86][47] = 327930;
tables[86][48] = 262185;
tables[86][49] = 262312;
tables[86][50] = 262312;
tables[86][51] = 328047;
tables[86][52] = 262311;
tables[86][53] = 262203;
tables[86][100] = 262236;
tables[86][103] = 0;
tables[86][133] = 0;
tables[86][134] = 0;
tables[86][140] = 0;
tables[87] = tables[2];
tables[87][30] = 262193;
tables[87][31] = 262194;
tables[87][32] = 262195;
tables[87][33] = 262196;
tables[87][34] = 262197;
tables[87][35] = 262198;
tables[87][36] = 262199;
tables[87][37] = 262200;
tables[87][38] = 262201;
tables[87][39] = 262192;
tables[87][45] = 262181;
tables[87][46] = 262855;
tables[87][47] = 262191;
tables[87][48] = 262184;
tables[87][49] = 262183;
tables[87][50] = 262183;
tables[87][51] = 262178;
tables[87][52] = 262177;
tables[87][54] = 262207;
tables[87][100] = 262268;
tables[87][103] = 0;
tables[87][133] = 0;
tables[87][134] = 0;
tables[87][140] = 0;
tables[88][5] = 262267;
tables[88][6] = 262182;
tables[88][7] = 262416;
tables[88][8] = 270508;
tables[88][9] = 262235;
tables[88][10] = 262237;
tables[88][14] = 262466;
tables[88][15] = 262465;
tables[88][17] = 262269;
tables[88][20] = 262236;
tables[88][22] = 262417;
tables[88][25] = 262208;
tables[88][26] = 262268;
tables[88][27] = 262179;
tables[88][30] = 262270;
tables[88][31] = 262855;
tables[88][32] = 262238;
tables[88][33] = 262872;
tables[88][34] = 262320;
tables[88][35] = 262875;
tables[88][36] = 262240;
tables[88][37] = 262873;
tables[88][38] = 262324;
tables[88][39] = 262877;
tables[88][45] = 262312;
tables[88][46] = 262328;
tables[88][47] = 262391;
tables[88][48] = 262359;
tables[88][49] = 262308;
tables[88][50] = 262308;
tables[88][51] = 262180;
tables[88][52] = 262367;
tables[88][54] = 262204;
tables[88][55] = 262206;
tables[88][56] = 262186;
tables[89] = tables[4];
tables[89][4] = 328625;
tables[89][5] = 328626;
tables[89][6] = 328648;
tables[89][7] = 328628;
tables[89][8] = 328629;
tables[89][9] = 328646;
tables[89][10] = 328627;
tables[89][11] = 328631;
tables[89][12] = 328633;
tables[89][13] = 328638;
tables[89][14] = 328634;
tables[89][15] = 328635;
tables[89][16] = 328636;
tables[89][17] = 328637;
tables[89][18] = 328639;
tables[89][19] = 328640;
tables[89][20] = 262203;
tables[89][21] = 328641;
tables[89][22] = 328643;
tables[89][23] = 328644;
tables[89][24] = 328632;
tables[89][25] = 328649;
tables[89][26] = 263106;
tables[89][27] = 328647;
tables[89][28] = 328645;
tables[89][29] = 328630;
tables[89][51] = 263044;
tables[89][100] = 262204;
tables[89][103] = 0;
tables[89][133] = 0;
tables[89][134] = 0;
tables[89][140] = 0;
tables[90] = tables[5];
tables[90][4] = 328593;
tables[90][5] = 328594;
tables[90][6] = 328616;
tables[90][7] = 328596;
tables[90][8] = 328597;
tables[90][9] = 328614;
tables[90][10] = 328595;
tables[90][11] = 328599;
tables[90][12] = 328601;
tables[90][13] = 328606;
tables[90][14] = 328602;
tables[90][15] = 328603;
tables[90][16] = 328604;
tables[90][17] = 328605;
tables[90][18] = 328607;
tables[90][19] = 328608;
tables[90][20] = 262202;
tables[90][21] = 328609;
tables[90][22] = 328611;
tables[90][23] = 328612;
tables[90][24] = 328600;
tables[90][25] = 328617;
tables[90][26] = 263045;
tables[90][27] = 328615;
tables[90][28] = 328613;
tables[90][29] = 328598;
tables[90][51] = 262312;
tables[90][100] = 262206;
tables[90][103] = 0;
tables[90][133] = 0;
tables[90][134] = 0;
tables[90][140] = 0;
tables[91][6] = 262313;
tables[91][8] = 270508;
tables[91][21] = 262318;
tables[91][28] = 262309;
tables[91][31] = 262322;
tables[91][32] = 262323;
tables[91][33] = 262307;
tables[91][34] = 262311;
tables[91][35] = 262326;
tables[91][37] = 262308;
tables[91][38] = 262310;
tables[91][39] = 262320;
tables[91][45] = 262321;
tables[91][46] = 262333;
tables[91][47] = 262315;
tables[91][48] = 262331;
tables[91][50] = 262316;
tables[91][51] = 263045;
tables[92] = tables[4];
tables[92][103] = 0;
tables[92][133] = 0;
tables[92][134] = 0;
tables[92][140] = 0;
tables[93] = tables[5];
tables[93][103] = 0;
tables[93][133] = 0;
tables[93][134] = 0;
tables[93][140] = 0;
tables[94] = tables[92];
tables[94][30] = 327939;
tables[94][31] = 327906;
tables[94][32] = 327914;
tables[94][33] = 327924;
tables[94][34] = 262912;
tables[94][35] = 262921;
tables[94][36] = 262915;
tables[94][37] = 262913;
tables[94][38] = 262947;
tables[94][39] = 327953;
tables[94][46] = 270507;
tables[94][47] = 328112;
tables[94][48] = 328097;
tables[95] = tables[93];
tables[95][30] = 327938;
tables[95][31] = 327874;
tables[95][32] = 327882;
tables[95][33] = 327892;
tables[95][34] = 262912;
tables[95][35] = 262921;
tables[95][36] = 262915;
tables[95][37] = 262913;
tables[95][38] = 262947;
tables[95][39] = 327952;
tables[95][47] = 328111;
tables[95][48] = 328096;
tables[96] = tables[92];
tables[96][40] = 0;
tables[96][42] = 0;
tables[96][43] = 0;
tables[96][44] = 0;
tables[96][83] = 0;
tables[96][84] = 0;
tables[96][85] = 0;
tables[96][86] = 0;
tables[96][87] = 0;
tables[96][88] = 0;
tables[96][89] = 0;
tables[96][90] = 0;
tables[96][91] = 0;
tables[96][92] = 0;
tables[96][93] = 0;
tables[96][94] = 0;
tables[96][95] = 0;
tables[96][96] = 0;
tables[96][97] = 0;
tables[96][98] = 0;
tables[96][99] = 0;
tables[97] = tables[93];
tables[97][40] = 0;
tables[97][42] = 0;
tables[97][43] = 0;
tables[97][44] = 0;
tables[97][83] = 0;
tables[97][84] = 0;
tables[97][85] = 0;
tables[97][86] = 0;
tables[97][87] = 0;
tables[97][88] = 0;
tables[97][89] = 0;
tables[97][90] = 0;
tables[97][91] = 0;
tables[97][92] = 0;
tables[97][93] = 0;
tables[97][94] = 0;
tables[97][95] = 0;
tables[97][96] = 0;
tables[97][97] = 0;
tables[97][98] = 0;
tables[97][99] = 0;
tables[98] = tables[92];
tables[98][47] = 327939;
tables[98][48] = 327918;
tables[98][49] = 327906;
tables[98][50] = 327906;
tables[98][51] = 328217;
tables[98][52] = 328219;
tables[98][53] = 270366;
tables[99] = tables[93];
tables[99][47] = 327938;
tables[99][48] = 327886;
tables[99][49] = 327874;
tables[99][50] = 327874;
tables[99][51] = 328216;
tables[99][52] = 328218;
tables[99][53] = 270365;
tables[99][54] = 262203;
tables[99][55] = 262202;
tables[100] = tables[88];
tables[100][5] = 0;
tables[100][6] = 262313;
tables[100][7] = 327953;
tables[100][9] = 0;
tables[100][10] = 0;
tables[100][14] = 0;
tables[100][15] = 328002;
tables[100][17] = 0;
tables[100][19] = 262311;
tables[100][20] = 0;
tables[100][22] = 262367;
tables[100][25] = 0;
tables[100][26] = 0;
tables[100][27] = 0;
tables[100][47] = 262235;
tables[100][48] = 262237;
tables[100][49] = 262236;
tables[100][50] = 262236;
tables[100][51] = 262203;
tables[100][52] = 262183;
tables[100][53] = 262240;
tables[100][56] = 0;
tables[101] = tables[29];
tables[101][7] = 327952;
tables[101][15] = 328001;
tables[101][45] = 270355;
tables[101][46] = 262321;
tables[101][49] = 262268;
tables[101][50] = 262268;
tables[101][51] = 262202;
tables[101][52] = 262178;
tables[101][53] = 262270;
tables[101][54] = 262315;
tables[101][55] = 262331;
tables[102] = tables[92];
tables[102][28] = 327802;
tables[102][29] = 327801;
tables[102][39] = 327926;
tables[102][45] = 327932;
tables[102][46] = 327923;
tables[102][47] = 328017;
tables[102][48] = 327930;
tables[102][49] = 328049;
tables[102][50] = 328049;
tables[102][51] = 327913;
tables[102][52] = 327905;
tables[102][53] = 262192;
tables[102][56] = 262189;
tables[102][100] = 327917;
tables[103] = tables[87];
tables[103][30] = 262183;
tables[103][31] = 262178;
tables[103][32] = 262187;
tables[103][33] = 262177;
tables[103][34] = 262181;
tables[103][35] = 262191;
tables[103][36] = 262205;
tables[103][37] = 262184;
tables[103][38] = 262185;
tables[103][39] = 327894;
tables[103][45] = 327900;
tables[103][46] = 327891;
tables[103][47] = 328016;
tables[103][48] = 327898;
tables[103][49] = 328048;
tables[103][50] = 328048;
tables[103][51] = 327881;
tables[103][52] = 327873;
tables[103][53] = 262311;
tables[103][100] = 327885;
tables[104] = tables[88];
tables[104][4] = 262372;
tables[104][8] = 262340;
tables[104][12] = 262349;
tables[104][13] = 262381;
tables[104][16] = 262204;
tables[104][24] = 270508;
tables[104][29] = 262206;
tables[104][54] = 262203;
tables[104][100] = 262204;
tables[105] = tables[36];
tables[105][22] = 328790;
tables[105][48] = 328791;
tables[105][52] = 328788;
tables[105][53] = 327719;
tables[105][83] = 0;
tables[105][100] = 263313;
tables[106] = tables[37];
tables[106][22] = 328710;
tables[106][48] = 328711;
tables[106][52] = 328708;
tables[106][53] = 0;
tables[106][100] = 263312;
tables[107][24] = 263313;
tables[108][24] = 263312;
tables[109][40] = 262154;
tables[109][42] = 262152;
tables[109][43] = 262153;
tables[109][88] = 262154;
tables[109][186] = 262152;
tables[109][187] = 262153;
tables[110][31] = 327962;
tables[110][32] = 328032;
tables[110][33] = 327948;
tables[110][34] = 328024;
tables[110][35] = 328061;
tables[110][36] = 327901;
tables[110][37] = 327873;
tables[110][38] = 327885;
tables[110][39] = 327881;
tables[110][47] = 327898;
tables[110][51] = 328046;
return tables;
}();
constexpr std::array<std::array<std::uint8_t, 4>, 41> CharacterLayouts = {{
{1, 2, 3, 0},
{4, 5, 6, 0},
{7, 8, 0, 0},
{9, 10, 0, 0},
{11, 12, 0, 0},
{13, 14, 0, 0},
{15, 16, 0, 0},
{17, 18, 19, 0},
{20, 21, 22, 0},
{23, 24, 25, 0},
{26, 27, 28, 29},
{30, 31, 32, 0},
{33, 34, 35, 0},
{36, 37, 0, 0},
{38, 39, 40, 41},
{42, 43, 0, 0},
{44, 45, 46, 0},
{47, 48, 49, 0},
{50, 51, 52, 0},
{47, 48, 49, 0},
{53, 54, 0, 55},
{56, 57, 0, 0},
{58, 54, 0, 55},
{59, 60, 3, 0},
{61, 62, 63, 0},
{64, 65, 66, 67},
{68, 69, 70, 71},
{72, 73, 74, 0},
{75, 76, 77, 78},
{79, 80, 81, 0},
{82, 83, 0, 0},
{84, 85, 0, 0},
{86, 87, 88, 0},
{89, 90, 91, 0},
{92, 93, 0, 0},
{94, 95, 96, 97},
{98, 99, 100, 101},
{102, 103, 104, 0},
{105, 106, 107, 108},
{109, 109, 109, 109},
{110, 110, 110, 110},
}};
constexpr std::array<char16_t, 19> KoreanInitial = {
12593, 12594, 12596, 12599, 12600, 12601, 12609, 12610, 12611, 12613, 12614, 12615, 12616, 12617, 12618, 12619, 12620, 12621, 12622
};
constexpr std::array<char16_t, 27> KoreanFinal = {
12593, 12594, 12595, 12596, 12597, 12598, 12599, 12601, 12602, 12603, 12604, 12605, 12606, 12607, 12608, 12609, 12610, 12612, 12613, 12614, 12615, 12616, 12618, 12619, 12620, 12621, 12622
};
std::size_t CharacterLayout(std::uint32_t type, std::uint32_t state) {
constexpr std::array<std::uint8_t, 39> layouts = {18, 7, 0, 1, 14, 8, 29, 17, 9, 25, 24, 23, 10, 11, 16, 26, 27, 12, 1, 19, 28, 3, 3, 1, 1, 1, 1, 1, 1, 1, 14, 32, 14, 34, 35, 36, 37, 1, 1};
const bool imeMode = (state & 0x4000000u) != 0;
const bool alternateMode = (state & 0x10000000u) != 0;
switch (type) {
case 19: return imeMode ? 13 : 1;
case 22: return alternateMode ? 2 : 3;
case 23:
if (!imeMode) return alternateMode ? 2 : 3;
if ((state & 0x8000000u) == 0) return 6;
return alternateMode ? 4 : 5;
case 24: return imeMode ? 15 : 1;
case 26:
if (imeMode) return 20;
return alternateMode ? 21 : 1;
case 29:
case 39:
if (imeMode) return 22;
return alternateMode ? 21 : 1;
case 25:
case 27:
case 28: return alternateMode ? 21 : 1;
case 30: return imeMode ? 30 : 1;
case 31: return imeMode ? 31 : 14;
case 33: return imeMode ? 33 : 14;
case 38: return imeMode ? 38 : 1;
default: return layouts[type - 1];
}
}
std::uint32_t CharacterEntry(std::size_t layout, std::size_t layer, std::uint16_t keycode) {
if (keycode >= 256) return 0;
return CharacterTables[CharacterLayouts[layout][layer]][keycode];
}
char16_t ConvertCharacter(std::uint16_t keycode, std::uint32_t state, std::uint32_t type) {
if (keycode == 83 || (keycode & 0xFFF8u) == 224) return 0;
const auto layout = CharacterLayout(type, state);
const bool shifted = (state & 0x2200u) != 0;
const bool caps = (state & 0x20000u) != 0;
if (layout == 0 && caps) {
if (keycode == 47) return shifted ? 200 : 220;
if (keycode == 52) return shifted ? 192 : 196;
if (keycode == 51) return shifted ? 201 : 214;
}
const auto& layers = CharacterLayouts[layout];
if ((state & 0x4000u) != 0 && (layers[2] != 0 || layers[3] != 0)) {
auto entry = CharacterEntry(layout, shifted ? 3 : 2, keycode);
if (entry == 0) return static_cast<char16_t>(CharacterEntry(39, 0, keycode));
if (caps && (entry & 0x10000u) != 0) {
const auto opposite = CharacterEntry(layout, shifted ? 2 : 3, keycode);
if (opposite != 0) entry = opposite;
}
return static_cast<char16_t>(entry);
}
auto entry = CharacterEntry(layout, shifted ? 1 : 0, keycode);
if (entry == 0) return 0;
if (caps) {
if ((type == 26 || type == 29 || type == 39) && (state & 0x4000000u) != 0) {
entry = CharacterEntry(layout, shifted ? 3 : 0, keycode);
} else if (type == 32 && !shifted && ((keycode >= 31 && keycode <= 39) || keycode == 47 || keycode == 51)) {
entry = CharacterEntry(40, 0, keycode);
} else if ((entry & 0x10000u) != 0) {
entry = CharacterEntry(layout, shifted ? 0 : 1, keycode);
}
if (entry == 0) return 0;
}
if ((entry & 0x20000u) != 0) {
const bool numLock = (state & 0x10000u) != 0;
if (!numLock && keycode >= 89 && keycode <= 99) return 0;
entry = CharacterEntry(layout, numLock ? 1 : 0, keycode);
if (entry == 0) return 0;
}
auto character = static_cast<char16_t>(entry);
if ((state & 0x4000000u) != 0 && type == 24) {
if ((character >= 12592 && character < 12688) || (character >= 44032 && character < 55216) || (character & 0xFF00u) == 0x1100) {
if (character >= 4352 && character <= 4370) return KoreanInitial[character - 4352];
if (character >= 4449 && character <= 4469) return static_cast<char16_t>(character + 8174);
if (character >= 4520 && character <= 4546) return KoreanFinal[character - 4520];
return 0;
}
}
if ((state & 0x4000000u) != 0 && type == 30) {
if ((state & 0x80u) == 0) {
if (keycode == 5) character = shifted ? 1570 : 1575;
if (shifted && keycode == 10) character = 1571;
if (shifted && keycode == 23) character = 1573;
}
const auto modifiers = state & 0xFFF8FFFFu;
if (modifiers == 67117312 || modifiers == 67121152 || modifiers == 67109632 || modifiers == 67113472) {
constexpr std::array<char16_t, 4> formatting = {0x200D, 0x200C, 0x200E, 0x200F};
return keycode >= 30 && keycode <= 33 ? formatting[keycode - 30] : 0;
}
if ((state & 0x1100u) != 0 && shifted) return 0;
}
return character;
}
} // namespace
extern "C" {
int APS5_VABI sceConvertKeycodeGetImeKeyboardType(int32_t userId, uint32_t* type) {
if (type == nullptr) return kErrInvalidAddress;
if (userId < 0) return kErrInvalidUserId;
throw std::runtime_error("sceConvertKeycodeGetImeKeyboardType: user keyboard language and variant are unavailable");
}
int APS5_VABI sceConvertKeycodeGetVirtualKeycode(std::uint16_t keycode, std::uint32_t keyboardType, std::uint16_t* virtualKeycode) {
if (virtualKeycode == nullptr) return kErrInvalidAddress;
if (keyboardType == 0 || keyboardType > VirtualKeys.size()) return kErrInvalidKeyboardType;
if (keyboardType >= 31) throw std::runtime_error("sceConvertKeycodeGetVirtualKeycode: guest sdk version is unavailable");
auto value = keycode < BaseVirtualKeys.size() ? VirtualKeys[keyboardType - 1][keycode] : 255;
if ((keyboardType == 2 || keyboardType == 3 || keyboardType == 12) && (value == 89 || value == 90)) throw std::runtime_error("sceConvertKeycodeGetVirtualKeycode: guest sdk version is unavailable");
*virtualKeycode = static_cast<std::uint16_t>(value);
return 0;
}
int APS5_VABI sceConvertKeycodeGetCharacterFromKeyboardData(const KeyboardData* keyData, std::int32_t index, std::uint32_t state, std::uint32_t keyboardType, char16_t* character) {
NotImplemented_nid_no_patch(__func__);
return 0;
}
int APS5_VABI sceConvertKeycodeGetCharacter(std::uint16_t keycode, std::uint32_t state, std::uint32_t type, char16_t* character) {
if (character == nullptr) return kErrInvalidAddress;
if (type == 0 || type > 39) return kErrInvalidKeyboardType;
if (type >= 31) throw std::runtime_error("sceConvertKeycodeGetCharacter: guest sdk version is unavailable");
*character = ConvertCharacter(keycode, state, type);
return 0;
}
}