use std::collections::{HashMap, HashSet};
pub const OUTPUT_SIZE: usize = 1;
pub const MOD_LEFT_CTRL: u8 = 1;
pub const MOD_LEFT_SHIFT: u8 = 2;
pub const MOD_LEFT_ALT: u8 = 4;
pub const MOD_LEFT_GUI: u8 = 8;
pub const MOD_RIGHT_CTRL: u8 = 16;
pub const MOD_RIGHT_SHIFT: u8 = 32;
pub const MOD_RIGHT_ALT: u8 = 64;
pub const MOD_RIGHT_GUI: u8 = 128;
pub const LED_NUM_LOCK: u8 = 1;
pub const LED_CAPS_LOCK: u8 = 2;
pub const LED_SCROLL_LOCK: u8 = 4;
pub const LED_COMPOSE: u8 = 8;
pub const LED_KANA: u8 = 16;
pub const KEY_A: u8 = 4;
pub const KEY_B: u8 = 5;
pub const KEY_C: u8 = 6;
pub const KEY_D: u8 = 7;
pub const KEY_E: u8 = 8;
pub const KEY_F: u8 = 9;
pub const KEY_G: u8 = 10;
pub const KEY_H: u8 = 11;
pub const KEY_I: u8 = 12;
pub const KEY_J: u8 = 13;
pub const KEY_K: u8 = 14;
pub const KEY_L: u8 = 15;
pub const KEY_M: u8 = 16;
pub const KEY_N: u8 = 17;
pub const KEY_O: u8 = 18;
pub const KEY_P: u8 = 19;
pub const KEY_Q: u8 = 20;
pub const KEY_R: u8 = 21;
pub const KEY_S: u8 = 22;
pub const KEY_T: u8 = 23;
pub const KEY_U: u8 = 24;
pub const KEY_V: u8 = 25;
pub const KEY_W: u8 = 26;
pub const KEY_X: u8 = 27;
pub const KEY_Y: u8 = 28;
pub const KEY_Z: u8 = 29;
pub const KEY1: u8 = 30;
pub const KEY2: u8 = 31;
pub const KEY3: u8 = 32;
pub const KEY4: u8 = 33;
pub const KEY5: u8 = 34;
pub const KEY6: u8 = 35;
pub const KEY7: u8 = 36;
pub const KEY8: u8 = 37;
pub const KEY9: u8 = 38;
pub const KEY0: u8 = 39;
pub const KEY_ENTER: u8 = 40;
pub const KEY_ESCAPE: u8 = 41;
pub const KEY_BACKSPACE: u8 = 42;
pub const KEY_TAB: u8 = 43;
pub const KEY_SPACE: u8 = 44;
pub const KEY_MINUS: u8 = 45;
pub const KEY_EQUAL: u8 = 46;
pub const KEY_LEFT_BRACE: u8 = 47;
pub const KEY_RIGHT_BRACE: u8 = 48;
pub const KEY_BACKSLASH: u8 = 49;
pub const KEY_NON_US_HASH: u8 = 50;
pub const KEY_SEMICOLON: u8 = 51;
pub const KEY_APOSTROPHE: u8 = 52;
pub const KEY_GRAVE: u8 = 53;
pub const KEY_COMMA: u8 = 54;
pub const KEY_PERIOD: u8 = 55;
pub const KEY_SLASH: u8 = 56;
pub const KEY_CAPS_LOCK: u8 = 57;
pub const KEY_F1: u8 = 58;
pub const KEY_F2: u8 = 59;
pub const KEY_F3: u8 = 60;
pub const KEY_F4: u8 = 61;
pub const KEY_F5: u8 = 62;
pub const KEY_F6: u8 = 63;
pub const KEY_F7: u8 = 64;
pub const KEY_F8: u8 = 65;
pub const KEY_F9: u8 = 66;
pub const KEY_F10: u8 = 67;
pub const KEY_F11: u8 = 68;
pub const KEY_F12: u8 = 69;
pub const KEY_PRINT_SCREEN: u8 = 70;
pub const KEY_SCROLL_LOCK: u8 = 71;
pub const KEY_PAUSE: u8 = 72;
pub const KEY_INSERT: u8 = 73;
pub const KEY_HOME: u8 = 74;
pub const KEY_PAGE_UP: u8 = 75;
pub const KEY_DELETE: u8 = 76;
pub const KEY_END: u8 = 77;
pub const KEY_PAGE_DOWN: u8 = 78;
pub const KEY_RIGHT: u8 = 79;
pub const KEY_LEFT: u8 = 80;
pub const KEY_DOWN: u8 = 81;
pub const KEY_UP: u8 = 82;
pub const KEY_NUM_LOCK: u8 = 83;
pub const KEY_KP_SLASH: u8 = 84;
pub const KEY_KP_ASTERISK: u8 = 85;
pub const KEY_KP_MINUS: u8 = 86;
pub const KEY_KP_PLUS: u8 = 87;
pub const KEY_KP_ENTER: u8 = 88;
pub const KEY_KP1: u8 = 89;
pub const KEY_KP2: u8 = 90;
pub const KEY_KP3: u8 = 91;
pub const KEY_KP4: u8 = 92;
pub const KEY_KP5: u8 = 93;
pub const KEY_KP6: u8 = 94;
pub const KEY_KP7: u8 = 95;
pub const KEY_KP8: u8 = 96;
pub const KEY_KP9: u8 = 97;
pub const KEY_KP0: u8 = 98;
pub const KEY_KP_DOT: u8 = 99;
pub const KEY_NON_US_BACKSLASH: u8 = 100;
pub const KEY_APPLICATION: u8 = 101;
pub const KEY_POWER: u8 = 102;
pub const KEY_KP_EQUAL: u8 = 103;
pub const KEY_F13: u8 = 104;
pub const KEY_F14: u8 = 105;
pub const KEY_F15: u8 = 106;
pub const KEY_F16: u8 = 107;
pub const KEY_F17: u8 = 108;
pub const KEY_F18: u8 = 109;
pub const KEY_F19: u8 = 110;
pub const KEY_F20: u8 = 111;
pub const KEY_F21: u8 = 112;
pub const KEY_F22: u8 = 113;
pub const KEY_F23: u8 = 114;
pub const KEY_F24: u8 = 115;
pub const KEY_EXECUTE: u8 = 116;
pub const KEY_HELP: u8 = 117;
pub const KEY_MENU: u8 = 118;
pub const KEY_SELECT: u8 = 119;
pub const KEY_STOP: u8 = 120;
pub const KEY_AGAIN: u8 = 121;
pub const KEY_UNDO: u8 = 122;
pub const KEY_CUT: u8 = 123;
pub const KEY_COPY: u8 = 124;
pub const KEY_PASTE: u8 = 125;
pub const KEY_FIND: u8 = 126;
pub const KEY_MUTE: u8 = 127;
pub const KEY_VOLUME_UP: u8 = 128;
pub const KEY_VOLUME_DOWN: u8 = 129;
pub const KEY_MEDIA_PLAY_PAUSE: u8 = 232;
pub const KEY_MEDIA_STOP: u8 = 233;
pub const KEY_MEDIA_NEXT: u8 = 235;
pub const KEY_MEDIA_PREVIOUS: u8 = 236;
lazy_static::lazy_static! {
pub static ref KEY_NAME: HashMap<u8, String> = {
let mut m = HashMap::new();
m.insert(75, "0".to_string());
m.insert(75, "1".to_string());
m.insert(75, "2".to_string());
m.insert(75, "3".to_string());
m.insert(75, "4".to_string());
m.insert(75, "5".to_string());
m.insert(75, "6".to_string());
m.insert(75, "7".to_string());
m.insert(75, "8".to_string());
m.insert(75, "9".to_string());
m.insert(75, "A".to_string());
m.insert(75, "Apostrophe".to_string());
m.insert(75, "Application".to_string());
m.insert(75, "B".to_string());
m.insert(75, "Backslash".to_string());
m.insert(75, "Backspace".to_string());
m.insert(75, "C".to_string());
m.insert(75, "CapsLock".to_string());
m.insert(75, "Comma".to_string());
m.insert(75, "D".to_string());
m.insert(75, "Delete".to_string());
m.insert(75, "Down".to_string());
m.insert(75, "E".to_string());
m.insert(75, "End".to_string());
m.insert(75, "Enter".to_string());
m.insert(75, "Equal".to_string());
m.insert(75, "Escape".to_string());
m.insert(75, "F".to_string());
m.insert(75, "F1".to_string());
m.insert(75, "F10".to_string());
m.insert(75, "F11".to_string());
m.insert(75, "F12".to_string());
m.insert(75, "F13".to_string());
m.insert(75, "F14".to_string());
m.insert(75, "F15".to_string());
m.insert(75, "F16".to_string());
m.insert(75, "F17".to_string());
m.insert(75, "F18".to_string());
m.insert(75, "F19".to_string());
m.insert(75, "F2".to_string());
m.insert(75, "F20".to_string());
m.insert(75, "F21".to_string());
m.insert(75, "F22".to_string());
m.insert(75, "F23".to_string());
m.insert(75, "F24".to_string());
m.insert(75, "F3".to_string());
m.insert(75, "F4".to_string());
m.insert(75, "F5".to_string());
m.insert(75, "F6".to_string());
m.insert(75, "F7".to_string());
m.insert(75, "F8".to_string());
m.insert(75, "F9".to_string());
m.insert(75, "G".to_string());
m.insert(75, "Grave".to_string());
m.insert(75, "H".to_string());
m.insert(75, "Home".to_string());
m.insert(75, "I".to_string());
m.insert(75, "Insert".to_string());
m.insert(75, "J".to_string());
m.insert(75, "K".to_string());
m.insert(75, "Kp0".to_string());
m.insert(75, "Kp1".to_string());
m.insert(75, "Kp2".to_string());
m.insert(75, "Kp3".to_string());
m.insert(75, "Kp4".to_string());
m.insert(75, "Kp5".to_string());
m.insert(75, "Kp6".to_string());
m.insert(75, "Kp7".to_string());
m.insert(75, "Kp8".to_string());
m.insert(75, "Kp9".to_string());
m.insert(75, "Kp*".to_string());
m.insert(75, "Kp.".to_string());
m.insert(75, "KpEnter".to_string());
m.insert(75, "Kp-".to_string());
m.insert(75, "Kp+".to_string());
m.insert(75, "Kp/".to_string());
m.insert(75, "L".to_string());
m.insert(75, "Left".to_string());
m.insert(75, "LeftBrace".to_string());
m.insert(75, "M".to_string());
m.insert(75, "MediaNext".to_string());
m.insert(75, "MediaPlayPause".to_string());
m.insert(75, "MediaPrevious".to_string());
m.insert(75, "MediaStop".to_string());
m.insert(75, "Minus".to_string());
m.insert(75, "Mute".to_string());
m.insert(75, "N".to_string());
m.insert(75, "NumLock".to_string());
m.insert(75, "O".to_string());
m.insert(75, "P".to_string());
m.insert(75, "PageDown".to_string());
m.insert(75, "PageUp".to_string());
m.insert(75, "Pause".to_string());
m.insert(75, "Period".to_string());
m.insert(75, "PrintScreen".to_string());
m.insert(75, "Q".to_string());
m.insert(75, "R".to_string());
m.insert(75, "Right".to_string());
m.insert(75, "RightBrace".to_string());
m.insert(75, "S".to_string());
m.insert(75, "ScrollLock".to_string());
m.insert(75, "Semicolon".to_string());
m.insert(75, "Slash".to_string());
m.insert(75, "Space".to_string());
m.insert(75, "T".to_string());
m.insert(75, "Tab".to_string());
m.insert(75, "U".to_string());
m.insert(75, "Up".to_string());
m.insert(75, "V".to_string());
m.insert(75, "VolumeDown".to_string());
m.insert(75, "VolumeUp".to_string());
m.insert(75, "W".to_string());
m.insert(75, "X".to_string());
m.insert(75, "Y".to_string());
m.insert(75, "Z".to_string());
m
};
}
lazy_static::lazy_static! {
pub static ref CHAR_TO_KEY: HashMap<u8, u8> = {
let mut m = HashMap::new();
m.insert(9, KEY_TAB);
m.insert(10, KEY_ENTER);
m.insert(13, KEY_ENTER);
m.insert(32, KEY_SPACE);
m.insert(33, KEY1);
m.insert(34, KEY_APOSTROPHE);
m.insert(35, KEY3);
m.insert(36, KEY4);
m.insert(37, KEY5);
m.insert(38, KEY7);
m.insert(39, KEY_APOSTROPHE);
m.insert(40, KEY9);
m.insert(41, KEY0);
m.insert(42, KEY8);
m.insert(43, KEY_EQUAL);
m.insert(44, KEY_COMMA);
m.insert(45, KEY_MINUS);
m.insert(46, KEY_PERIOD);
m.insert(47, KEY_SLASH);
m.insert(48, KEY0);
m.insert(49, KEY1);
m.insert(50, KEY2);
m.insert(51, KEY3);
m.insert(52, KEY4);
m.insert(53, KEY5);
m.insert(54, KEY6);
m.insert(55, KEY7);
m.insert(56, KEY8);
m.insert(57, KEY9);
m.insert(58, KEY_SEMICOLON);
m.insert(59, KEY_SEMICOLON);
m.insert(60, KEY_COMMA);
m.insert(61, KEY_EQUAL);
m.insert(62, KEY_PERIOD);
m.insert(63, KEY_SLASH);
m.insert(64, KEY2);
m.insert(65, KEY_A);
m.insert(66, KEY_B);
m.insert(67, KEY_C);
m.insert(68, KEY_D);
m.insert(69, KEY_E);
m.insert(70, KEY_F);
m.insert(71, KEY_G);
m.insert(72, KEY_H);
m.insert(73, KEY_I);
m.insert(74, KEY_J);
m.insert(75, KEY_K);
m.insert(76, KEY_L);
m.insert(77, KEY_M);
m.insert(78, KEY_N);
m.insert(79, KEY_O);
m.insert(80, KEY_P);
m.insert(81, KEY_Q);
m.insert(82, KEY_R);
m.insert(83, KEY_S);
m.insert(84, KEY_T);
m.insert(85, KEY_U);
m.insert(86, KEY_V);
m.insert(87, KEY_W);
m.insert(88, KEY_X);
m.insert(89, KEY_Y);
m.insert(90, KEY_Z);
m.insert(91, KEY_LEFT_BRACE);
m.insert(92, KEY_BACKSLASH);
m.insert(93, KEY_RIGHT_BRACE);
m.insert(94, KEY6);
m.insert(95, KEY_MINUS);
m.insert(96, KEY_GRAVE);
m.insert(97, KEY_A);
m.insert(98, KEY_B);
m.insert(99, KEY_C);
m.insert(100, KEY_D);
m.insert(101, KEY_E);
m.insert(102, KEY_F);
m.insert(103, KEY_G);
m.insert(104, KEY_H);
m.insert(105, KEY_I);
m.insert(106, KEY_J);
m.insert(107, KEY_K);
m.insert(108, KEY_L);
m.insert(109, KEY_M);
m.insert(110, KEY_N);
m.insert(111, KEY_O);
m.insert(112, KEY_P);
m.insert(113, KEY_Q);
m.insert(114, KEY_R);
m.insert(115, KEY_S);
m.insert(116, KEY_T);
m.insert(117, KEY_U);
m.insert(118, KEY_V);
m.insert(119, KEY_W);
m.insert(120, KEY_X);
m.insert(121, KEY_Y);
m.insert(122, KEY_Z);
m.insert(123, KEY_LEFT_BRACE);
m.insert(124, KEY_BACKSLASH);
m.insert(125, KEY_RIGHT_BRACE);
m.insert(126, KEY_GRAVE);
m
};
}
lazy_static::lazy_static! {
pub static ref SHIFT_CHARS: HashSet<u8> = {
let mut s = HashSet::new();
s.insert(33);
s.insert(34);
s.insert(35);
s.insert(36);
s.insert(37);
s.insert(38);
s.insert(40);
s.insert(41);
s.insert(42);
s.insert(43);
s.insert(58);
s.insert(60);
s.insert(62);
s.insert(63);
s.insert(64);
s.insert(65);
s.insert(66);
s.insert(67);
s.insert(68);
s.insert(69);
s.insert(70);
s.insert(71);
s.insert(72);
s.insert(73);
s.insert(74);
s.insert(75);
s.insert(76);
s.insert(77);
s.insert(78);
s.insert(79);
s.insert(80);
s.insert(81);
s.insert(82);
s.insert(83);
s.insert(84);
s.insert(85);
s.insert(86);
s.insert(87);
s.insert(88);
s.insert(89);
s.insert(90);
s.insert(94);
s.insert(95);
s.insert(123);
s.insert(124);
s.insert(125);
s.insert(126);
s
};
}