[
  {
    "path": ".gitignore",
    "content": "# Windows image file caches\nThumbs.db\nehthumbs.db\n\n# Folder config file\nDesktop.ini\n\n# Recycle Bin used on file shares\n$RECYCLE.BIN/\n\n# Windows Installer files\n*.cab\n*.msi\n*.msm\n*.msp\n\n# Windows shortcuts\n*.lnk\n\n# =========================\n# Operating System Files\n# =========================\n\n# OSX\n# =========================\n\n.DS_Store\n.AppleDouble\n.LSOverride\n\n# Thumbnails\n._*\n\n# Files that might appear in the root of a volume\n.DocumentRevisions-V100\n.fseventsd\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n\n# Directories potentially created on remote AFP share\n.AppleDB\n.AppleDesktop\nNetwork Trash Folder\nTemporary Items\n.apdisk\nOnlyKey_NOPIN/OnlyKey_NOPIN.ino\n"
  },
  {
    "path": "OnlyKey/OnlyKey.ino",
    "content": "/* \n * Copyright (c) 2015-2022, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp.to>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n * \n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://crp.to/ok)\"\n *\n * 4. The names \"OnlyKey\" and \"CryptoTrust\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    admin@crp.to.\n *\n * 5. Products derived from this software may not be called \"OnlyKey\"\n *    nor may \"OnlyKey\" or \"CryptoTrust\" appear in their names without\n *    specific prior written permission. For written permission, please\n *    contact admin@crp.to.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://crp.to/ok)\"\n *\n * 7. Redistributions in any form must be accompanied by information on\n *    how to obtain complete source code for this software and any\n *    accompanying software that uses this software. The source code\n *    must either be included in the distribution or be available for\n *    no more than the cost of distribution plus a nominal fee, and must\n *    be freely redistributable under reasonable conditions. For a\n *    binary file, complete source code means the source code for all\n *    modules it contains.\n *\n * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS\n * ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT\n * LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM\n * IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE\n * SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE\n * RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY\n * THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF\n * ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER\n * APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE\n * REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION\n * BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM\n * EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL\n * SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT\n * FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS\n * AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF\n * TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS\n * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*************************************/\n//Firmware Build Options\n/*************************************/\n#define DEBUG //Enable Serial Monitor, debug firmware\n#define STD_VERSION //Define for STD edition firmare, undefine for IN TRVL edition firmware\n#define OK_Color //Define for hardware with color LED\n//#define FACTORYKEYS2 // Attestation key and other keys encrypted using CHIP ID and RNG for unique per device\n#ifndef STD_VERSION\n#undef FACTORYKEYS2\n#endif\n/*************************************/\n//Standard Libraries \n/*************************************/\n#include \"sha256.h\"\n#include \"EEPROM.h\"\n#include \"T3MacLib.h\"\n#include \"SoftTimer.h\"\n#include \"password.h\"\n#include \"sha1.h\"\n#include \"totp.h\"\n#include \"Time.h\"\n#include \"onlykey.h\"\n#include \"flashkinetis.h\"\n#include \"RNG.h\"\n#include \"base64.h\"\n#include \"ADC.h\"\n#include \"usb_dev.h\"\n/*************************************/\n//Color LED Libraries \n/*************************************/\n#ifdef OK_Color\n#include \"Adafruit_NeoPixel.h\"\n#endif\n/*************************************/\n//Additional Libraries to Load for STD firmware version\n//These libraries will only be used if STD_VERSION is defined\n/*************************************/\nextern uint8_t profilemode;\n#ifdef STD_VERSION\n#define OKSOLO //Using FIDO2 from SOLO\n#include \"yksim.h\"\n#include \"uECC.h\"\n#include \"ykcore.h\"\n#include \"AES.h\"\n#include \"GCM.h\"\n#include \"rsa.h\"\n#include \"tweetnacl.h\"\n/*************************************/\n//FIDO2 Libraries\n/*************************************/\n#ifdef OKSOLO\n#include \"ctap.h\"\n#include \"ctaphid.h\"\n#include \"cbor.h\"\n#include \"ctap_parse.h\"\n#include \"ctap_errors.h\"\n#include \"device.h\"\n#include \"storage.h\"\n#include \"wallet.h\"\n#include \"solo.h\"\n#include \"extensions.h\"\n#include \"ok_extension.h\"\n#include \"crypto.h\"\n#include \"u2f.h\"\n#endif\n#endif\n/*************************************/\n//LED Assignments\n/*************************************/\nextern uint8_t NEO_Color;\nextern uint8_t NEO_Brightness[1];\nextern uint8_t touchoffset;\nextern uint8_t Profile_Offset;\n/*************************************/\n//RNG Assignments\n/*************************************/\nbool calibrating = false;\nextern char ID[36];\n/*************************************/\n//PIN Assigment Variables\n/*************************************/\nextern uint8_t BLINKPIN;\nextern uint8_t TOUCHPIN1;\nextern uint8_t TOUCHPIN2;\nextern uint8_t TOUCHPIN3;\nextern uint8_t TOUCHPIN4;\nextern uint8_t TOUCHPIN5;\nextern uint8_t TOUCHPIN6;\nextern uint8_t ANALOGPIN1;\nextern uint8_t ANALOGPIN2;\nextern unsigned int sumofall;\n/*************************************/\n//Keypad / Password Assignments\n/*************************************/\nextern int button_selected;    //Key selected 1-6\nstatic int pass_keypress = 1;  //The number key presses in current password attempt\nstatic int session_attempts = 0; //The number of password attempts this session\nstatic bool firsttime = true;\nextern Password password;\nextern uint8_t TIMEOUT[1];\nextern uint8_t TYPESPEED[1];\nextern uint8_t KeyboardLayout[1];\nextern uint8_t mod_keys_enabled;\n/*************************************/\n//Capacitive Touch Variables\n/*************************************/\nextern unsigned int touchread1;\nextern unsigned int touchread2;\nextern unsigned int touchread3;\nextern unsigned int touchread4;\nextern unsigned int touchread5;\nextern unsigned int touchread6;\nextern unsigned int touchread1ref;\nextern unsigned int touchread2ref;\nextern unsigned int touchread3ref;\nextern unsigned int touchread4ref;\nextern unsigned int touchread5ref;\nextern unsigned int touchread6ref;\n/*************************************/\n//Keys, Hashes, Integrity Counters\n/*************************************/\nextern uint8_t profilekey[32];\nextern uint8_t p1hash[32];\nextern uint8_t sdhash[32];\nextern uint8_t p2hash[32];\nextern uint8_t nonce[32];\nextern int initcheck;\nextern int integrityctr1;\nextern int integrityctr2;\n/*************************************/\n//SoftTimer Tasks\n/*************************************/\n#define TIME_POLL 50 // poll \"key\" every 50 ms\nTask taskKey(TIME_POLL, checkKey);\nTask taskKB(50, sendKey); // Default send kb codes every 50 ms\nTask taskInitialized(1000, sendInitialized);\n/*************************************/\n//CRYPTO\n/*************************************/\nextern uint8_t Challenge_button1;\nextern uint8_t Challenge_button2;\nextern uint8_t Challenge_button3;\nextern uint8_t CRYPTO_AUTH;\nextern int packet_buffer_offset;\nextern uint8_t packet_buffer_details[5];\nextern uint8_t outputmode;\nextern uint8_t derived_key_challenge_mode;\nextern uint8_t stored_key_challenge_mode;\n/*************************************/\n//Other\n/*************************************/\nextern uint8_t recv_buffer[64];\nchar keybuffer[EElen_url+EElen_addchar+EElen_delay+EElen_addchar+EElen_username+EElen_delay+EElen_addchar+EElen_password+EElen_addchar+EElen_2FAtype+64+EElen_addchar+EElen_addchar+10]; //Buffer to hold all keystrokes\nchar *pos;\nextern uint8_t isfade;\n#ifdef STD_VERSION\nextern uint8_t ctap_buffer[CTAPHID_BUFFER_SIZE];\n#endif\nextern uint8_t pending_operation;\nuint8_t modkey;\nextern uint8_t onlykeyhw;\nextern uint8_t Duo_config[2];\n\nextern \"C\" {\n  int _getpid(){ return -1;}\n  int _kill(int pid, int sig){ return -1; }\n  int _write(){return -1;}\n}\n\n/*************************************/\n//Arduino Setup\n/*************************************/\nvoid setup() {\n  // Delay may be needed for serial debug\n  // delay(3000);\n  analogReadResolution(16);\n  #ifdef DEBUG\n  Serial.begin(9600);\n  #endif\n  #ifdef STD_VERSION\n  profilemode = STDPROFILE1;\n  #else\n  profilemode = NONENCRYPTEDPROFILE; \n  #endif\n  /*************************************/\n  //PIN Assigments\n  /*************************************/\n  BLINKPIN=6;\n  TOUCHPIN1=1; // #define CORE_PIN1_CONFIG  PORTB_PCR17\n  TOUCHPIN2=22; //#define CORE_PIN22_CONFIG  PORTC_PCR1\n  TOUCHPIN3=23; //#define CORE_PIN23_CONFIG  PORTC_PCR2 OnlyKey DUO Button #1\n  TOUCHPIN4=17; //#define CORE_PIN17_CONFIG  PORTB_PCR1\n  TOUCHPIN5=15; //#define CORE_PIN15_CONFIG  PORTC_PCR0 OnlyKey DUO Button #2\n  TOUCHPIN6=16; //#define CORE_PIN16_CONFIG  PORTB_PCR0\n  ANALOGPIN1=A0; //#define CORE_PIN14_CONFIG PORTD_PCR1\n  ANALOGPIN2=A7; //#define CORE_PIN21_CONFIG PORTD_PCR6\n  /*************************************/\n  initcheck = okcore_flashget_noncehash ((uint8_t*)nonce, 32); //Check if first time use\n  CHIP_ID(); // Get Unique chip ID from ROM\n  unsigned int analog1 = analogRead(ANALOGPIN1);\n  unsigned int analog2 = analogRead(ANALOGPIN2);\n  integrityctr1++;\n  /* \n  //dump flash storage, useful for verifying contents\n  Serial.println(initcheck);\n  char temp[32];\n  wipeEEPROM();\n  unsigned long readadr = flashstorestart;\n  while (readadr <= flashend) {\n    for(int i =0; i<=2048; i=i+4){\n      sprintf (temp, \"%.8X\", *((unsigned int*)readadr));\n      Serial.print(temp);\n      readadr = readadr + 4;\n    }\n    Serial.println();\n  }\n  */  \n  //FSEC currently set to 0x44, everything disabled except mass erase https://forum.pjrc.com/threads/28783-Upload-Hex-file-from-Teensy-3-1\n  if (FTFL_FSEC!=0x44) {\n    // First time starting up, three steps to complete:\n    // 1) Read factory loaded device keys and generate custom device keys\n    // Get factory default flash contents\n    #ifdef FACTORYKEYS2\n    okcore_flashget_common(ctap_buffer, (unsigned long *)factorysectoradr, 1025);\n    #ifdef DEBUG\n    Serial.println(\"Factory Key Values\");\n    byteprint(ctap_buffer, 1025);\n    #endif\n    if (ctap_buffer[480] != 0xFF) { // Attestation key loaded\n      // Hash factory bytes with unique chip ID and random \n      SHA256_CTX hash;\n      for (int i=0; i<=14; i++) {\n        analog1 = analogRead(ANALOGPIN1);\n        analog2 = analogRead(ANALOGPIN1);\n        sha256_init(&hash);\n        sha256_update(&hash, ctap_buffer+(32*i), 32);\n        sha256_update(&hash, ctap_buffer+(32*(i+1)), 32);\n        sha256_update(&hash, (uint8_t*)ID, 36);\n        sha256_update(&hash, (uint8_t*)&analog1, 4);\n        sha256_update(&hash, (uint8_t*)&analog2, 4);\n        sha256_final(&hash, ctap_buffer+(32*i));\n      }\n      #ifdef DEBUG\n      Serial.println(\"KDF Hashed Factory Values\");\n      byteprint(ctap_buffer, 512);\n      #endif\n      // Write everything to flash\n      if (*certified_hw != 1) {\n        // Encrypt attestation key with generated KEK\n        ctap_buffer[435]=3;\n        //Write keys\n        okcore_flashset_common(ctap_buffer, (unsigned long *)enckeysectoradr, 436); \n        okcrypto_aes_gcm_encrypt2(ctap_buffer+480, ctap_buffer+436, ctap_buffer+448, 32, true);\n        //Write encrypted contents to flash\n        okcore_flashset_common(ctap_buffer, (unsigned long *)enckeysectoradr, 513); \n        // Set write flag \n        ctap_buffer[435]=1;\n        // Write flag to flash\n        okcore_flashset_common(ctap_buffer, (unsigned long *)enckeysectoradr, 513); \n      }\n      // Erase factory keys\n      memset(ctap_buffer, 0, 2048);\n      okcore_flashset_common(ctap_buffer, (unsigned long *)factorysectoradr, 512); \n    } \n    #endif // end FACTORYKEYS\n    // 2) Store factory firmware hash for integrity verification\n    //create hash of firmware in hash buffer\n    #ifdef STD_VERSION\n    fw_hash(ctap_buffer); \n    for (int i = 0; i < crypto_hash_BYTES; i++) { //write 64byte hash to eeprom\n      eeprom_write_byte((unsigned char*)(2+i), ctap_buffer[i]); // 2-65 used for fw integrity hash\n    }\n    memset(ctap_buffer, 0, 2048);\n    #endif\n    // 3) Enable flash security after writing\n    int nn = 0;\n    nn=flashSecurityLockBits();\n    #ifdef DEBUG\n    Serial.print(\"Flash security bits \");\n    if(nn) Serial.print(\"not \");\n    Serial.println(\"written successfully\");\n    #endif\n  }\n  if(!initcheck) {\n      wipeEEPROM();\n      eeprom_write_byte((unsigned char *)1984, (OKversionmaj[0] - '0')); //write fwvermaj, prevents downgrade to previous majver\n      okeeprom_eeset_timeout((uint8_t*)TIMEOUT); //Default lockout 30 min\n      unlocked = true; //Flash is not protected, First time use\n      initialized = false;\n      #ifdef DEBUG\n      Serial.println(\"UNLOCKED, NO PIN SET\");\n      #endif\n  } else if(FTFL_FSEC==0x44 && initcheck) {\n        okcore_flashget_pinhashpublic ((uint8_t*)p1hash, 32); //store PIN hash\n        okcore_flashget_selfdestructhash ((uint8_t*)sdhash); //store self destruct PIN hash\n        okcore_flashget_2ndpinhashpublic ((uint8_t*)p2hash); //store plausible deniability PIN hash\n        okeeprom_eeget_typespeed((uint8_t*)TYPESPEED, 0);\n        okeeprom_eeget_modkey(&mod_keys_enabled);\n        #ifdef DEBUG\n        Serial.println(\"typespeed = \");\n        Serial.println(TYPESPEED[0]);\n        #endif\n        if (TYPESPEED[0] == 0) {\n          TYPESPEED[0] = 4;\n         } else if (TYPESPEED[0] <= 10) {\n         }\n        okeeprom_eeget_ledbrightness((uint8_t*)NEO_Brightness);\n        okeeprom_eeget_touchoffset(&touchoffset);\n        okeeprom_eeget_timeout((uint8_t*)TIMEOUT);\n        okeeprom_eeget_keyboardlayout((uint8_t*)KeyboardLayout);\n        #ifdef DEBUG\n        Serial.println(\"KeyboardLayout = \");\n        Serial.println(KeyboardLayout[0]);\n        #endif\n        update_keyboard_layout();\n        unlocked = false;\n        initialized = true;\n        #ifdef DEBUG\n        Serial.println(\"INITIALIZED\");\n        #endif\n        SoftTimer.add(&taskInitialized);\n  } else { //Glitch detect, somehow device is initialized but flash security is not on\n    CPU_RESTART();\n  }\n  integrityctr2++;\n  /*************************************/\n  //Initialize the random number generator with analog noise, stored NONCE, and chip ID\n  /*************************************/\n  RNG.begin(OKversion, 2045); //Start RNG with the device version\n  RNG.stir((uint8_t *)&analog1, 2, 4);\n  RNG.stir((uint8_t *)&analog2, 2, 4);\n  #ifdef DEBUG\n  Serial.print(\"EEPROM Used \");\n  Serial.println(EEpos_slottypespeed+12);\n  Serial.println(FTFL_FSEC, HEX);\n  #endif\n  rngloop(); //Start RNG\n  #ifdef OK_Color\n  initColor();\n  rainbowCycle();\n  #else\n  pinMode(BLINKPIN, OUTPUT);\n  fadein();//Additional delay to make sure button is not pressed during plug into USB\n  fadeout();\n  fadein();\n  fadeout();\n  #endif\n  SoftTimer.add(&taskKey);\n\n   if (!initcheck) {\n    //Default set to no challenge code required for OnlyKey Agent\n    //User can enable challenge code in OnlyKey app preferences\n    derived_key_challenge_mode = 1;\n    stored_key_challenge_mode = 1;\n    okeeprom_eeset_derived_key_challenge_mode(&derived_key_challenge_mode); \n    okeeprom_eeset_stored_key_challenge_mode(&stored_key_challenge_mode);\n  } \n  \n  if (onlykeyhw==OK_HW_DUO) {\n      if (initialized == true && password.profile1hashevaluate()) {\n          payload(10); \n      }\n  }\n}\n\nextern elapsedMillis idletimer;\n\n/*************************************/\n//Main Loop, Read Key Press Using Capacitive Touch\n//Called every 50ms\n/*************************************/\nvoid checkKey(Task* me) {\n  \n  //Check for bootloader trigger\n  if (!digitalRead(33)) { //Trigger bootloader to load firmware by PTA4 low for 3 sec\n    elapsedMillis waiting;\n    int jumptobootloader = 0;\n    while (waiting < 3000) {\n    delay(100);\n    jumptobootloader = jumptobootloader + digitalRead(33);\n    }\n    if (jumptobootloader==0) {\n    eeprom_write_byte(0x00, 1); //Go to bootloader\n    eeprom_write_byte((unsigned char *)0x01, 1); //Firmware ready to load\n    CPU_RESTART(); //Reboot\n    }\n  }\n\n  #ifndef STD_VERSION\n  // Disable OK_HW_DUO hardware for IN_TRVL firmware\n  if (onlykeyhw==OK_HW_DUO) {\n    eeprom_write_byte(0x00, 1); //Go to bootloader\n    eeprom_write_byte((unsigned char *)0x01, 1); //Firmware ready to load\n    CPU_RESTART(); //Reboot\n  }\n  #endif\n\n  if (setBuffer[8] == 1 && (!isfade || configmode)) //Done receiving packets\n  {                 \n    if (outputmode != KEYBOARD_USB) changeoutputmode(KEYBOARD_USB); //Keyboard USB\n    process_setreport();\n  }\n  //Check integrity counters and recv usb data\n  integrityctr1++;\n  delay(sumofall % 6); //delay 0 - 5 ms\n  if (unlocked) {\n    integrityctr2++;\n    recvmsg(0);\n    if(initialized && initcheck) {\n    #ifdef STD_VERSION\n    yubikey_incr_time();\n    #endif\n    if (TIMEOUT[0] && idletimer >= (TIMEOUT[0]*60000)) {\n      unlocked = false;\n      firsttime = true;\n      password.reset(); //reset the guessed password to NULL\n      pass_keypress=1;\n      memset(profilekey, 0, 32);  \n      SoftTimer.add(&taskInitialized);\n      CPU_RESTART();\n    }\n    }\n  } else{\n    integrityctr2++;\n  }\n\n  if(configmode && unlocked && !isfade) {\n    #ifdef OK_Color\n    NEO_Color = 1; //Red\n    #endif\n    fadeon(1);\n  }\n\n  #ifdef DEBUG\n  // Auto set default PINs and passphrase for testing\n  //if (!initialized) {\n  // okeeprom_eeset_timeout(0); //Disable lockout\n  //  okcore_quick_setup(AUTO_PIN_SET);  \n  //}\n  #endif\n  \n\n  int press_duration = touch_sense_loop();\n  if (pending_operation==0xF6 || pending_operation==0xF7) { //CTAP2_ERR_DATA_READY or CTAP2_ERR_DATA_WIPE\n    setcolor(45); //yellow\n  } else {\n    if (press_duration) payload(press_duration);\n  }\n\n}\n/*************************************/\n//Type out on Keyboard the contents of Keybuffer\n/*************************************/\nvoid sendKey(Task* me) {\n    while ( isfade && NEO_Color == 170 && (uint8_t)*pos != 00 && (uint8_t)*pos != 9 ) {\n       pos++;\n    }\n    int delay1 = (TYPESPEED[0]*TYPESPEED[0]/3)*8;\n    int delay2 = ((TYPESPEED[0]*TYPESPEED[0])*2);\n    if ((uint8_t)*pos == 00) {\n      #ifdef DEBUG\n      Serial.print(pos);\n      #endif\n      Keyboard.end();\n      SoftTimer.remove(&taskKB);\n      SoftTimer.add(&taskKey);\n      // Set back to default type speed\n      okeeprom_eeget_typespeed((uint8_t*)TYPESPEED, 0);\n      if (TYPESPEED[0]==0) TYPESPEED[0] = 4;\n      return;\n    }\n    else if ((uint8_t)*pos == 1) {\n        if (!isfade) {\n          Keyboard.press(KEY_TAB);\n          delay(delay1);\n          Keyboard.releaseAll();\n          delay(delay2);\n        }\n        pos++;\n    }\n    else if ((uint8_t)*pos == 2) {\n        if (!isfade) {\n          Keyboard.press(KEY_RETURN);\n          delay(delay1);\n          Keyboard.releaseAll();\n          delay(delay2);\n        }\n        pos++;\n    }\n    else if ((uint8_t)*pos == 9) {\n        if(profilemode==NONENCRYPTEDPROFILE) return;\n        #ifdef STD_VERSION\n        #ifdef DEBUG\n        Serial.println(\"Starting U2F...\");\n        #endif\n        u2f_button = 1;\n        unsigned long u2fwait = millis() + 4000;\n        while(u2f_button && millis() < u2fwait) {\n        recvmsg(0);\n        }\n        u2f_button = 0;\n        Keyboard.end();\n        SoftTimer.remove(&taskKB);\n        SoftTimer.add(&taskKey);\n        #endif\n        return;\n    }\n    else if ((uint8_t)*pos >= 10 && (uint8_t)*pos <= 31) {\n        if (!isfade) {    \n          delay((*pos - 10)*1000);\n          pos++;       \n        }       \n    }\n    else if ((uint8_t)*pos == ' ' && (uint8_t)*(pos+1) == 0x5c) {\n        pos++; \n        if (!isfade) {\n          while(*pos) {\n            if ((uint8_t)*pos == 0x5c) { //modifier/special key comes next\n              pos++;\n              keymap_press(0);\n              delay(delay1);\n            } else { //regular key\n              keymap_press(1);\n              delay(delay1);\n            }\n            pos++;\n            if ((uint8_t)*pos == ' ' || (uint8_t)*pos == 0) {\n              if ((uint8_t)*pos == ' ') pos++;\n              Keyboard.releaseAll();\n              delay(delay1);  \n              Keyboard.releaseAll();\n              resetkeys();\n              delay(delay2);\n              return;\n            } \n          }\n        }   \n    }\n    else if (*pos){\n        if (!isfade) {\n          Keyboard.press(*pos);\n          delay(delay1);\n          Keyboard.releaseAll();\n          delay(delay2);\n        }\n        pos++;\n    }\n}\n/*************************************/\n//Password Checking Loop\n/*************************************/\nvoid payload(int duration) {   \n    if (!unlocked) {\n      // OnlyKey Go has only 3 buttons, longer press to enter PIN of 4 - 6\n      if (onlykeyhw==OK_HW_DUO && duration >= 21) { \n        // <1 sec OK_HW_DUO buttons 1,2,3 = 4,5,6\n        button_selected = button_selected + 3;\n      }\n      #ifdef OK_Color\n      setcolor(45); // NEO Pixel ON Yellow\n      #else\n      analogWrite(BLINKPIN, 255); //LED ON\n      #endif\n    }\n    else {\n      #ifdef OK_Color\n      setcolor(0); // NEO Pixel OFF\n      #else\n      analogWrite(BLINKPIN, 0); //LED OFF\n      #endif\n    }\n    uint8_t pass_attempts[1];\n    uint8_t sincelastregularlogin[1];\n    if (session_attempts >= 3) { //Limit 3 password attempts per session to make sure that someone does not accidentally wipe device\n      exceeded_login_attempts();\n    return;\n    }\n    integrityctr1++;\n    if (firsttime) //Get failed login counter from eeprom and increment for new login attempt\n    {\n      okeeprom_eeget_failedlogins ((uint8_t*)pass_attempts);\n      if (pass_attempts[0]) {\n        okeeprom_eeget_sincelastregularlogin ((uint8_t*)sincelastregularlogin);\n        if (sincelastregularlogin[0] >= 20) {\n          for (int i =0; i<32; i++) {\n            p1hash[i] = 0xFF;\n          }\n          okcore_flashset_pinhashpublic ((uint8_t*)p1hash); //permanently wipe pinhash\n          okeeprom_eeset_sincelastregularlogin (0);\n       } else {\n        sincelastregularlogin[0]++;\n        okeeprom_eeset_sincelastregularlogin ((uint8_t*)sincelastregularlogin);\n       }\n       #ifdef DEBUG\n       Serial.println(\"Failed PIN attempts since last successful regular PIN entry\");\n       Serial.println(sincelastregularlogin[0]);\n       #endif\n     }\n     integrityctr2++;\n     pass_attempts[0]++;\n     integrityctr1++;\n     if (pass_attempts[0] > 10) {\n        #ifdef DEBUG\n        Serial.println(\"Password attempts exhausted\");\n        Serial.println(pass_attempts[0]);\n        #endif\n        factorydefault();\n        pass_attempts[0] = 0;\n        return;\n     }\n     okeeprom_eeset_failedlogins ((uint8_t*)pass_attempts);\n     firsttime = false;\n   }\n   integrityctr2++;\n   password.append(button_selected);\n   integrityctr1++;\n   delay((sumofall % 4)+(sumofall % 3)); //delay 0 - 5 ms\n   if (unlocked || password.profile1hashevaluate() || password.profile2hashevaluate()) {\n    integrityctr2++;\n    if (unlocked != true) { //A correct PIN was just entered do the following for first login\n      okeeprom_eeset_failedlogins(0); //Set failed login counter to 0\n      password.reset(); //reset the guessed password to NULL\n      session_attempts=0;\n      if (!configmode) hidprint(HW_MODEL(UNLOCKED));\n      SoftTimer.remove(&taskInitialized);\n      #ifdef DEBUG\n      Serial.println(\"UNLOCKED\"); \n      #endif      \n      fadeon(NEO_Color);\n      fadeoff(85);  \n      if (profilemode!=NONENCRYPTEDPROFILE) {\n        #ifdef STD_VERSION\n        U2Finit();\n        okeeprom_eeset_sincelastregularlogin(0); //Set failed logins since last regular login to 0\n        fw_version_changes();\n        #endif\n      }\n      idletimer=0;\n      unlocked = true;\n      if (configmode) {\n        #ifdef OK_Color\n        NEO_Color = 1; //Red\n        #endif\n        fadeon(1);\n      }\n\n      unsigned long wait = millis() + 200;\n      while(millis() < wait) { //Process waiting messages\n          recvmsg(0);\n      }\n      \n      wipe_usb_buffer(); // Wipe old responses\n      return;\n    } else if (!initialized && duration >= 85 && button_selected=='1' && profilemode!=NONENCRYPTEDPROFILE) {\n      if (onlykeyhw==OK_HW_DUO) okcore_quick_setup(KEYBOARD_ONLYKEY_DUO_NO_BACKUP);\n      else okcore_quick_setup(KEYBOARD_MANUAL_PIN_SET);\n      return;\n    } else if (!initialized && duration >= 85 && button_selected=='2' && profilemode!=NONENCRYPTEDPROFILE) {\n      if (onlykeyhw==OK_HW_DUO) okcore_quick_setup(KEYBOARD_ONLYKEY_DUO_BACKUP);\n      else okcore_quick_setup(KEYBOARD_AUTO_PIN_SET);\n      return;\n    } else if (!initialized && duration >= 85 && button_selected=='3' && profilemode!=NONENCRYPTEDPROFILE) {\n      okcore_quick_setup(0); //Setup with keyboard prompt\n      return;\n    } else if (pin_set==0 && !initcheck) {\n      return;\n    }\n    else if (pin_set==0) {\n    }\n    else if (pin_set<=3) { \n      #ifdef DEBUG\n      Serial.print(\"password appended with \");\n      Serial.println(button_selected-'0');\n      #endif\n      if (configmode) {\n        NEO_Color = 45;\n        blink(1);\n        NEO_Color = 1;\n      }\n      return;\n    }\n    else if (pin_set<=6) {\n        #ifdef DEBUG\n        Serial.print(\"SD password appended with \");\n        Serial.println(button_selected-'0');\n        #endif\n        if (configmode) {\n          NEO_Color = 45;\n          blink(1);\n          NEO_Color = 1;\n        }\n        return;\n    }\n    else if (pin_set<=9) {\n        if(profilemode!=NONENCRYPTEDPROFILE){\n        #ifdef STD_VERSION\n        #ifdef DEBUG\n        Serial.print(\"2nd profile password appended with \");\n        Serial.println(button_selected-'0');\n        #endif\n        #endif\n        }\n        if (configmode) {\n          NEO_Color = 45;\n          blink(1);\n          NEO_Color = 1;\n        }\n        return;\n    } else if (pin_set==10) {\n        cancelfadeoffafter20();\n        if (button_selected=='1') okcore_quick_setup(KEYBOARD_MANUAL_PIN_SET); //Manual\n        else okcore_quick_setup(KEYBOARD_AUTO_PIN_SET); //Manual\n        return;\n    }\n    Keyboard.begin();\n    *keybuffer = '\\0';\n    #ifdef DEBUG\n    Serial.print(\"Button selected \");\n    Serial.println(button_selected-'0');\n    #endif\n    idletimer=0;\n    if (profilemode!=NONENCRYPTEDPROFILE) {\n      #ifdef STD_VERSION\n      if (CRYPTO_AUTH == 1 && button_selected==Challenge_button1 && isfade) {\n          #ifdef DEBUG\n          Serial.print(\"Challenge1 entered\");\n          Serial.println(button_selected-'0');\n          #endif\n          CRYPTO_AUTH++;\n          return;\n      } else if (CRYPTO_AUTH == 2 && button_selected==Challenge_button2 && isfade) {\n        #ifdef DEBUG\n        Serial.print(\"Challenge2 entered\");\n        Serial.println(button_selected-'0');\n        #endif\n        CRYPTO_AUTH++;\n        return;\n      } else if ((CRYPTO_AUTH == 3 && button_selected==Challenge_button3 && isfade && packet_buffer_details[0]) || (derived_key_challenge_mode==1 && isfade && packet_buffer_details[0]) || (stored_key_challenge_mode==1 && isfade && packet_buffer_details[0]) || (CRYPTO_AUTH == 3 && packet_buffer_details[0] == OKHMAC && isfade) || (packet_buffer_details[0] == OKWEBAUTHN && isfade)) {\n        #ifdef DEBUG\n        Serial.print(\"Challenge3 entered\");\n        Serial.println(button_selected-'0');\n        #endif\n        CRYPTO_AUTH = 4;\n        derived_key_challenge_mode = 0;\n        stored_key_challenge_mode = 0;\n        if(packet_buffer_details[0] == OKSIGN) {\n          recv_buffer[4] = packet_buffer_details[0];\n          recv_buffer[5] = packet_buffer_details[1];\n          okcrypto_sign(recv_buffer);\n        } else if (packet_buffer_details[0] == OKDECRYPT) {\n          recv_buffer[4] = packet_buffer_details[0];\n          recv_buffer[5] = packet_buffer_details[1];\n          okcrypto_decrypt(recv_buffer);\n        } else if (packet_buffer_details[0] == OKHMAC) {\n          okcrypto_hmacsha1();\n        } else if (packet_buffer_details[0] == OKWEBAUTHN) {\n          u2f_button = 1;\n          unsigned long u2fwait = millis() + 4000;\n          while(u2f_button && millis() < u2fwait) {\n          recvmsg(0);\n          }\n          u2f_button = 0;\n        }\n          CRYPTO_AUTH = 0;\n          packet_buffer_details[0]=0;\n          fadeoff(0);\n          return;\n        } else if (CRYPTO_AUTH) { //Wrong challenge was entered\n            CRYPTO_AUTH = 0;\n            Challenge_button1 = 0;\n            Challenge_button2 = 0;\n            Challenge_button3 = 0;\n            fadeoff(1);\n            hidprint(\"Error incorrect challenge was entered\");\n            analogWrite(BLINKPIN, 255); //LED ON\n            return;\n        } else if (duration < 180 && duration >= 72 && button_selected=='1' && !isfade) {\n            // Backup <4 sec \n            SoftTimer.remove(&taskKey);\n            backup();\n            SoftTimer.add(&taskKey);\n            return;\n        } else if (onlykeyhw==OK_HW_DUO && duration >= 360 && button_selected=='2' && configmode==true) {\n          factorydefault();\n        } else if (duration >= 72 && button_selected=='2' && !isfade) {\n            // Slot Labels <4 sec \n            get_slot_labels(1);\n            if (duration >= 140) get_key_labels(1);\n            return;\n        } else if (duration >= 72 && button_selected=='3' && !isfade) {\n            // Lock and/or switch profiles <4 sec\n            if (onlykeyhw==OK_HW_DUO && duration < 180) {\n              if (Duo_config[1] == 0){ // Profile 1\n                Profile_Offset = 84; //Profile 2 Blue\n                Duo_config[1] = 1;\n              } else if (Duo_config[1] == 1){ // Profile 2 \n                Profile_Offset = -42; //Profile 3 Yellow\n                Duo_config[1] = 2;\n              } else if (Duo_config[1] == 2){ // Profile 3\n                Profile_Offset = 128; //Profile 4 Purple\n                Duo_config[1] = 3;\n              } else if (Duo_config[1] == 3){ // Profile 4\n                Profile_Offset = 0; //Profile 1 Green\n                Duo_config[1] = 0;\n              }\n              return;\n            }\n            unlocked = false;\n            firsttime = true;\n            password.reset(); //reset the guessed password to NULL\n            pass_keypress=1;\n            memset(profilekey, 0, 32);        \n            SoftTimer.add(&taskInitialized);\n            button_selected=0;\n            CPU_RESTART(); \n            return;\n        } \n        else if (((onlykeyhw==OK_HW_DUO && duration >= 180 && button_selected=='1') || (onlykeyhw!=OK_HW_DUO && duration >= 72 && button_selected=='6')) && !isfade) {\n          // Config mode \n          integrityctr1++;\n          configmode=true;\n          if (Duo_config[0]!=1) {\n            unlocked = false;\n            firsttime = true;\n            password.reset(); //reset the guessed password to NULL\n            pass_keypress=1;\n            SoftTimer.add(&taskInitialized);\n          }\n          integrityctr2++;\n          return;\n        }\n      #endif\n     }\n    #ifdef OK_Color\n    setcolor(0); // NEO Pixel OFF\n    #else\n    analogWrite(BLINKPIN, 0); //LED OFF\n    #endif\n      \n    if (duration <= 20 && !configmode) {\n      gen_press();\n    }\n    else if (duration >= 21 && duration < 90 && !configmode) {\n      gen_hold();\n    }\n    else if (duration >= 90 && !configmode) {\n      NEO_Color = 1;\n      blink(2);\n    }\n    pos = keybuffer;\n    SoftTimer.remove(&taskKey);\n    SoftTimer.add(&taskKB, (unsigned long)TYPESPEED[0]);\n    return;\n  }\n  else if (password.sdhashevaluate()) {\n    #ifdef DEBUG\n    Serial.println(\"Self Destruct PIN entered\");\n    #endif\n    factorydefault();\n  }\n  else {\n    integrityctr2++;\n    if (pass_keypress < 10) {\n      #ifdef DEBUG\n      Serial.print(\"password appended with \");\n      Serial.println(button_selected-'0');\n      Serial.print(\"Number of keys entered for this passcode = \");\n      Serial.println(pass_keypress);\n      #endif\n      pass_keypress++;\n      return;\n    } else {\n      firsttime = true;\n      session_attempts++;\n      #ifdef OK_Color\n      NEO_Color = 1;\n      #endif\n      blink(3);\n      #ifdef DEBUG\n      Serial.print(\"Login Failed, there are \");\n      #endif\n      okeeprom_eeget_failedlogins ((uint8_t*)pass_attempts);\n      #ifdef DEBUG\n      Serial.print(10 - pass_attempts[0]);\n      Serial.println(\" remaining attempts before a factory reset will occur\");\n      Serial.println(\"WARNING: This will render all device information unrecoverable\");\n      #endif\n      password.reset(); //reset the guessed password to NULL\n      pass_keypress=1;\n      if (session_attempts >= 3) { //Limit 3 password attempts per session to make sure that someone does not accidentally wipe device\n        exceeded_login_attempts();\n      }\n      return;\n    }\n }\n}\n/*************************************/\n//Trigger on short button press\n/*************************************/\nvoid gen_press(void) {\n  int slot;\n\n  if (profilemode || Duo_config[1] == 2) {\n    slot=(button_selected-'0')+12;\n  } else if (Duo_config[1] == 1) {\n    slot=(button_selected-'0')+6;\n  } else if (Duo_config[1] == 3) {\n    slot=(button_selected-'0')+18;\n  } else {\n    slot=button_selected-'0';\n  }\n      process_slot(slot);\n}\n/*************************************/\n//Trigger on long button press\n/*************************************/\nvoid gen_hold(void) {\n  int slot;\n  if (profilemode || Duo_config[1] == 2) {\n    slot=(button_selected-'0')+12;\n  } else if (Duo_config[1] == 1) {\n    slot=(button_selected-'0')+6;\n  } else if (Duo_config[1] == 3) {\n    slot=(button_selected-'0')+18;\n  } else {\n    slot=button_selected-'0';\n  }\n\n  if (onlykeyhw==OK_HW_DUO){\n    process_slot(slot+3);\n  } else {\n    process_slot(slot+6);\n  }\n      \n}\n/*************************************/\n//Load Set Values to Keybuffer\n/*************************************/\nvoid process_slot(int s) {\n      long GMT;\n      char* newcode;\n      static uint8_t index;\n      uint8_t temp[64];\n      int urllength;\n      int usernamelength;\n      int passwordlength;\n      int otplength;\n      uint8_t addchar1;\n      uint8_t addchar2;\n      uint8_t addchar3;\n      uint8_t addchar4;\n      uint8_t addchar5;\n      uint8_t addchar6;\n      uint8_t autolockslot;\n      int delay1 = 0;\n      int delay2 = 0;\n      int delay3 = 0;\n      uint8_t *ptr;\n      int slot=s;\n      bool scripted_mode = false;\n      index = 0;\n      \n      okeeprom_eeget_autolockslot(&autolockslot);\n      if ((profilemode==STDPROFILE1 && (slot==(autolockslot & 0xF))) || (profilemode==STDPROFILE2 && slot==((autolockslot >> 4) & 0xF)+12)) {\n        lock_ok_and_screen ();\n        return;\n      }\n      okeeprom_eeget_typespeed((uint8_t*)TYPESPEED, slot);\n      if (TYPESPEED[0]==0) okeeprom_eeget_typespeed((uint8_t*)TYPESPEED, 0);\n      if (TYPESPEED[0]==0) TYPESPEED[0] = 4;\n      \n      okeeprom_eeget_addchar(&addchar5, slot);\n      #ifdef DEBUG\n      Serial.println(\"Additional Character\");\n      Serial.println(addchar5); \n      #endif\n      addchar1 = addchar5 & 0x3; //After Username\n      addchar2 = (addchar5 >> 4) & 0x3; //After Password\n      addchar3 = (addchar5 >> 6) & 0x1; //After OTP\n      addchar6 = (addchar5 >> 7) & 0x1; //After OTP 2\n      addchar4 = (addchar5 >> 2) & 0x1; //Before Username\n      addchar5 = (addchar5 >> 3) & 0x1; //Before OTP\n      \n      if (isfade) return; \n      #ifdef DEBUG\n      Serial.print(\"Slot Number \");\n      Serial.println(button_selected-'0');\n      #endif\n      memset(temp, 0, 64); //Wipe all data from buffer\n      memset(keybuffer, 0, sizeof(keybuffer)); //Wipe all data from keybuffer\n      ptr = temp;\n      urllength = okcore_flashget_url(ptr, slot);\n      if(urllength > 0)\n      {\n        #ifdef DEBUG\n        Serial.println(\"Reading URL from Flash...\");\n        Serial.print(\"URL Length = \");\n        Serial.println(urllength);\n        #endif\n        #ifdef DEBUG\n        Serial.println(\"Encrypted\");\n        byteprint(temp, urllength);\n        #endif\n        okcore_aes_gcm_decrypt(temp, slot, 15, profilekey, urllength);\n        if (temp[0]==0x08) { // Scripted Mode\n          scripted_mode=true;\n          ByteToChar2(temp+1, keybuffer, urllength-1, index);\n          index=urllength-1;\n        } else {\n          ByteToChar2(temp, keybuffer, urllength, index);\n          index=urllength;\n          keybuffer[index] = 2;\n          index++;\n          #ifdef DEBUG\n          Serial.println(\"Unencrypted\");\n          byteprint(temp, urllength);\n          Serial.println(\"Setting RETURN after URL\");\n          #endif\n        }\n      }\n      memset(temp, 0, 64); //Wipe all data from buffer\n      okeeprom_eeget_delay1(ptr, slot);\n      if(temp[0] > 0 && !scripted_mode)\n      {\n        #ifdef DEBUG\n        Serial.println(\"Reading Delay1 from EEPROM...\");\n        Serial.print(\"Delay \");\n        Serial.print(temp[0]);\n        Serial.println(\" Seconds before entering username\");\n        #endif\n        if (temp[0] <= 30)\n        {\n        delay1=temp[0];\n        keybuffer[index] = temp[0] + 10;\n        index++;\n        }\n      }\n      if(addchar4 && !scripted_mode)\n      {\n        #ifdef DEBUG\n        Serial.println(\"Reading before Username addchar...\");\n        #endif\n        keybuffer[index] = 1;\n        #ifdef DEBUG\n        Serial.println(\"TAB\");\n        #endif\n        index++;\n      }\n      usernamelength = okcore_flashget_username(ptr, slot);\n      if(usernamelength > 0)\n      {\n        #ifdef DEBUG\n        Serial.println(\"Reading Username from Flash...\");\n        Serial.print(\"Username Length = \");\n        Serial.println(usernamelength);\n        byteprint(temp, usernamelength);\n        #endif\n        okcore_aes_gcm_decrypt(temp, slot, 2, profilekey, usernamelength);\n        \n        ByteToChar2(temp, keybuffer, usernamelength, index);\n        #ifdef DEBUG\n        byteprint(temp, usernamelength);\n        #endif\n        index=usernamelength+index;\n      }\n      memset(temp, 0, 64); //Wipe all data from buffer\n      if(addchar1 && !scripted_mode)\n      {\n        if(addchar1 == 1) {\n        #ifdef DEBUG\n        Serial.println(\"Reading after username addchar...\");\n        #endif\n        keybuffer[index] = 1;\n        #ifdef DEBUG\n        Serial.println(\"TAB\");\n        #endif\n        index++;\n        }\n        else if(addchar1 == 2) {\n        #ifdef DEBUG\n        Serial.println(\"Reading after username addchar...\");\n        #endif\n        keybuffer[index] = 2;\n        #ifdef DEBUG\n        Serial.println(\"RETURN\");\n        #endif\n        index++;\n        }\n      }\n      memset(temp, 0, 64); //Wipe all data from buffer\n      okeeprom_eeget_delay2(ptr, slot);\n      if(temp[0] > 0 && !scripted_mode)\n      {\n        #ifdef DEBUG\n        Serial.println(\"Reading Delay2 from EEPROM...\");\n        Serial.print(\"Delay \");\n        Serial.print(temp[0]);\n        Serial.println(\" Seconds before entering password\");\n        #endif\n        if (temp[0] <= 30)\n        {\n        delay2=temp[0];\n        keybuffer[index] = temp[0] + 10;\n        index++;\n        }\n      }\n      passwordlength = okeeprom_eeget_password(ptr, slot);\n      if(passwordlength > 0)\n      {\n        #ifdef DEBUG\n        Serial.println(\"Reading Password from EEPROM...\");\n        Serial.print(\"Password Length = \");\n        Serial.println(passwordlength);\n        Serial.println(\"Encrypted\");\n        byteprint(temp, passwordlength);\n        #endif\n        okcore_aes_gcm_decrypt(temp, slot, 5, profilekey, passwordlength);\n        ByteToChar2(temp, keybuffer, passwordlength, index);\n        #ifdef DEBUG\n        Serial.println(\"Unencrypted\");\n        byteprint(temp, passwordlength);\n        #endif\n        index=passwordlength+index;\n      }\n      memset(temp, 0, 64); //Wipe all data from buffer\n      if(addchar2 && !scripted_mode)\n      {\n        #ifdef DEBUG\n        Serial.println(\"Reading after password addchar...\");\n        #endif\n        if(addchar2 == 1) {\n        keybuffer[index] = 1;\n        #ifdef DEBUG\n        Serial.println(\"TAB\");\n        #endif\n        index++;\n        }\n        else if(addchar2 == 2) {\n        keybuffer[index] = 2;\n        #ifdef DEBUG\n        Serial.println(\"RETURN\");\n        #endif\n        index++;\n        }\n      }\n      memset(temp, 0, 64); //Wipe all data from buffer\n      okeeprom_eeget_delay3(ptr, slot);\n      if(temp[0] > 0 && !scripted_mode)\n      {\n        #ifdef DEBUG\n        Serial.println(\"Reading Delay3 from EEPROM...\");\n        Serial.print(\"Delay \");\n        Serial.print(temp[0]);\n        Serial.println(\" Seconds before entering 2FA\");\n        #endif\n        if (temp[0] <= 30)\n        {\n        delay3=temp[0];\n        keybuffer[index] = temp[0] + 10;\n        index++;\n        }\n      }\n      memset(temp, 0, 64); //Wipe all data from buffer\n      if(addchar5 && !scripted_mode)\n      {\n        #ifdef DEBUG\n        Serial.println(\"Reading before OTP addchar...\");\n        #endif\n        keybuffer[index] = 1;\n        #ifdef DEBUG\n        Serial.println(\"TAB\");\n        #endif\n        index++;\n      }\n      otplength = okeeprom_eeget_2FAtype(ptr, slot);\n      if(temp[0] > 0)\n      {\n        if(temp[0] == MFAGOOGLEAUTH) { //Google Auth\n          #ifdef DEBUG\n          Serial.println(\"Reading TOTP Key from Flash...\");\n          #endif\n          otplength = okcore_flashget_2fa_key(ptr, slot);\n        #ifdef DEBUG\n        Serial.println(\"Encrypted\");\n        byteprint(temp, otplength);\n        Serial.print(\"TOTP Key Length = \");\n        Serial.println(otplength);\n        #endif  \n        okcore_aes_gcm_decrypt(temp, slot, 9, profilekey, otplength); \n        ByteToChar2(temp, keybuffer, otplength, index);\n        #ifdef DEBUG\n        Serial.println(\"Unencrypted\");\n        byteprint(temp, otplength);\n        #endif\n          TOTP totp1 = TOTP(temp, otplength);\n          GMT = now();\n          GMT = GMT + delay1 + delay2 + delay3;\n          #ifdef DEBUG\n          Serial.println(GMT);\n          #endif\n          newcode = totp1.getCode(GMT);\n          if (timeStatus() == timeNotSet) {\n            keybuffer[index]='N';\n            keybuffer[index+1]='O';\n            keybuffer[index+2]='T';\n            keybuffer[index+3]='S';\n            keybuffer[index+4]='E';\n            keybuffer[index+5]='T';\n          } else {\n            keybuffer[index]=*newcode;\n            keybuffer[index+1]=*(newcode+1);\n            keybuffer[index+2]=*(newcode+2);\n            keybuffer[index+3]=*(newcode+3);\n            keybuffer[index+4]=*(newcode+4);\n            keybuffer[index+5]=*(newcode+5);\n          }\n          index=index+6;\n          memset(temp, 0, 64); //Wipe all data from buffer\n        }\n        if(temp[0] == MFAOLDYUBIOTP && profilemode!=NONENCRYPTEDPROFILE) {\n          #ifdef DEBUG\n          Serial.println(\"Generating Yubico OTP Legacy...\");\n          #endif\n          #ifdef STD_VERSION\n          yubikeysim(keybuffer + index, 0);\n          index=index+44;\n          #endif\n        }\n        if((temp[0] == MFAYUBIOTPandHMACSHA1 || temp[0] == MFAYUBIOTP) && profilemode!=NONENCRYPTEDPROFILE) {\n          #ifdef DEBUG\n          Serial.println(\"Generating Yubico OTP...\");\n          #endif\n          #ifdef STD_VERSION\n          int publen;\n          publen = yubikeysim(keybuffer + index, slot);\n          index=index+32+(publen*2);\n          #endif\n        }\n        if(temp[0] == MFAOLDU2F && profilemode!=NONENCRYPTEDPROFILE) { //U2F\n          keybuffer[index] = 9;\n          index++;\n        }\n      }\n      if(addchar6)\n      {\n        #ifdef DEBUG\n        Serial.println(\"Reading after OTP addchar...\");\n        #endif\n        keybuffer[index] = 1;\n        #ifdef DEBUG\n        Serial.println(\"TAB\");\n        #endif\n        index++;\n      }\n      if(addchar3)\n      {\n        #ifdef DEBUG\n        Serial.println(\"Reading after OTP addchar...\");\n        #endif\n        keybuffer[index] = 2;\n        #ifdef DEBUG\n        Serial.println(\"RETURN\");\n        #endif\n        index++;\n      }\n      keybuffer[index] = 0;\n          #ifdef DEBUG\n          Serial.println(\"Displaying Full Keybuffer\");\n          for (int i=0; keybuffer[i]!=0x00; i++) {\n            Serial.print\n            (keybuffer[i]);\n          }\n          #endif\n}\n\nvoid sendInitialized(Task* me) {\n    if (onlykeyhw==OK_HW_DUO){\n      int n = RawHID.recv(recv_buffer, 0); // 0 timeout = do not wait\n      if (n && recv_buffer[4] == OKPIN && recv_buffer[5]>='0' && initialized == true && unlocked == false && onlykeyhw==OK_HW_DUO) {\n        unlocked = false;\n        firsttime = true;\n        password.reset(); //reset the guessed password to NULL\n        okcore_pin_login(); // Received PIN Login Attempt for OnlyKey Duo\n        pass_keypress=10;\n        button_selected=0;\n        payload(10); // Try the PIN\n        memset(recv_buffer, 0, sizeof(recv_buffer));\n        if (unlocked == true) {\n          hidprint(HW_MODEL(UNLOCKED));\n        }\n      } else {\n        hidprint(\"INITIALIZED-D\");\n      }\n    } else hidprint(\"INITIALIZED\");\n    #ifdef DEBUG\n    Serial.println(\"INITIALIZED\");\n    #endif\n}\n\nvoid resetkeys () {\n  delay(200);\n  Keyboard.set_key1(0);\n  Keyboard.set_key2(0);\n  Keyboard.set_key3(0);\n  Keyboard.set_key4(0);\n  Keyboard.set_key5(0);\n  Keyboard.set_key6(0);\n  Keyboard.set_modifier(0);\n  Keyboard.set_media(0);\n  Keyboard.send_now();\n}\n\nvoid ctrl_alt_del () {\n  //Keyboard.set_modifier(MODIFIERKEY_CTRL);  \n // Keyboard.send_now();\n // Keyboard.set_modifier(MODIFIERKEY_CTRL | MODIFIERKEY_ALT);  \n  Keyboard.send_now();\n // Keyboard.set_key1(KEY_DELETE);  \n  Keyboard.send_now();\n  resetkeys();\n // Keyboard.set_key1(KEY_ESC);  \n  Keyboard.send_now();\n  resetkeys();\n}\n\nvoid lock_ok_and_screen () {\n    unlocked = false;\n    firsttime = true;\n    password.reset(); //reset the guessed password to NULL\n    pass_keypress=1;\n    memset(profilekey, 0, 32);\n    //Lock Windows and Linux (Gnome Super+L to lock)\n    Keyboard.set_modifier(MODIFIERKEY_GUI);  \n    Keyboard.send_now();\n    Keyboard.set_key1(KEY_L);  \n    Keyboard.send_now();\n    resetkeys();\n    //Lock Mac\n    Keyboard.set_modifier(MODIFIERKEY_CTRL);  \n    Keyboard.send_now();\n    Keyboard.set_modifier(MODIFIERKEY_CTRL | MODIFIERKEY_GUI); \n    Keyboard.send_now();\n    Keyboard.set_key1(KEY_Q); \n    Keyboard.send_now();  \n    delay(500);  // Mac OS-X will not recognize a very short eject press\n    Keyboard.set_media(0);\n    Keyboard.send_now(); \n    resetkeys();\n    CPU_RESTART();\n}\n\nvoid fw_hash(unsigned char* hashptr) {\n  #ifdef STD_VERSION\n   unsigned char smesg[17000];\n   unsigned long adr = fwstartadr;\n   //Hash current fw in hashptr   \n   while (adr <= 0x36060) { //13 blocks of 16384 bytes, last block 0x36060 - 0x3A060\n     okcore_flashget_common (smesg, (unsigned long*)adr, 16384); //Read each block\n     if (adr == (unsigned long)fwstartadr) { \n       crypto_hash(hashptr,smesg,16384); //hash this block\n     }\n     else { //if not first block, hash with previous block hash\n     memcpy(smesg + 16384, hashptr, crypto_hash_BYTES);\n     crypto_hash(hashptr,smesg,(16384+crypto_hash_BYTES)); \n     }\n     adr = adr + 16384;\n  }\n  return;\n  #endif\n}\n\nvoid keymap_press (char key) {\n  extern uint8_t keyboard_modifier_keys;\n  extern uint8_t keyboard_keys[6];\n  if ((uint8_t)*pos>'0' && (uint8_t)*pos<='9') {\n    delay((*(pos)-'0')*1000);\n  } else if ((uint8_t)*pos=='t' || (uint8_t)*pos=='r') {\n    if (key) {\n      Keyboard.press(*pos);\n      key=0;\n    }\n    else if ((uint8_t)*pos=='t') {\n      key = KEY_TAB;\n    }\n    else if ((uint8_t)*pos=='r') {\n      key = KEY_RETURN;\n    }\n  } else if (mod_keys_enabled) {\n    if (key) {\n      Keyboard.press(*pos);\n      key=0;\n    } else {  \n      if ((uint8_t)*pos=='p') key = KEY_PRINTSCREEN;\n      else if ((uint8_t)*pos=='h') key = KEY_HOME;\n      else if ((uint8_t)*pos=='u') key = KEY_PAGE_UP;\n      else if ((uint8_t)*pos=='o') key = KEY_PAGE_DOWN;\n      else if ((uint8_t)*pos=='e') key = KEY_END;\n      else if ((uint8_t)*pos=='d') key = KEY_DELETE;\n      else if ((uint8_t)*pos=='b') key = KEY_BACKSPACE;\n      else if ((uint8_t)*pos=='L') key = KEY_LEFT;\n      else if ((uint8_t)*pos=='R') key = KEY_RIGHT;\n      else if ((uint8_t)*pos=='U') key = KEY_UP;\n      else if ((uint8_t)*pos=='D') key = KEY_DOWN;\n      else if ((uint8_t)*pos=='E') key = KEY_ESC;\n\n      if ((uint8_t)*pos=='c') keyboard_modifier_keys |= MODIFIERKEY_CTRL;\n      else if ((uint8_t)*pos=='s') keyboard_modifier_keys |= MODIFIERKEY_SHIFT;\n      else if ((uint8_t)*pos=='a') keyboard_modifier_keys |= MODIFIERKEY_ALT;\n      else if ((uint8_t)*pos=='g') keyboard_modifier_keys |= MODIFIERKEY_GUI; \n    }\n  } \n  \n  if (keyboard_keys[0] == 0) keyboard_keys[0] = key;\n  else if (keyboard_keys[1] == 0) keyboard_keys[1] = key;\n  else if (keyboard_keys[2] == 0) keyboard_keys[2] = key;\n  else if (keyboard_keys[3] == 0) keyboard_keys[3] = key;\n  else if (keyboard_keys[4] == 0) keyboard_keys[4] = key;\n  else if (keyboard_keys[5] == 0) keyboard_keys[5] = key;\n  Keyboard.send_now();\n}\n\nvoid exceeded_login_attempts() {\n  #ifdef DEBUG\n  Serial.print(\"password attempts for this session exceeded, remove OnlyKey and reinsert to attempt login\");\n  #endif\n  while(1==1)\n    {\n    hidprint(\"Error password attempts for this session exceeded, remove OnlyKey and reinsert to attempt login\");\n    #ifdef OK_Color\n    NEO_Color = 1; //Red\n    #endif\n    blink(5);\n    }\n}\n\n\n\n"
  },
  {
    "path": "README.md",
    "content": "# OnlyKey Firmware\n\nThis is the official firmware for **OnlyKey**\n\nOnlyKey can be purchased here: [OnlyKey order](https://onlykey.io)\n\n## Getting Started\n\nJust getting started with OnlyKey?\n\n[Start here](https://onlykey.io/start)\n\n## About\n\nThe firmware is the software that runs on the OnlyKey itself. In order to load firmware follow the instructions in the [User's Guide here](https://docs.crp.to/usersguide.html#loading-onlykey-firmware)\n\n## Development\n\nOnlyKey firmware is open source and new features are added with each firmware release. A list of of supported features are available [here](https://docs.crp.to/features.html)\n\n## Support\n\nCheck out the [OnlyKey Support Forum](https://forum.onlykey.io)\n\nCheck out the [OnlyKey Documentation](https://docs.crp.to)\n\n## Libraries\n\nOnlyKey firmware uses additional libraries that are available [here](https://github.com/trustcrypto/libraries).\n\n# Legal things\n## Cryptography Notice\n\nThis distribution includes cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software.\nBEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\nSee <http://www.wassenaar.org/> for more information.\n\nThe U.S. Government Department of Commerce, Bureau of Industry and Security (BIS), has classified this software as Export Commodity Control Number (ECCN) 5D002.C.1, which includes information security software using or performing cryptographic functions with asymmetric algorithms.\nThe form and manner of this distribution makes it eligible for export under the License Exception ENC Technology Software Unrestricted (TSU) exception (see the BIS Export Administration Regulations, Section 740.13) for both object code and source code.\n\nThe following cryptographic software is included in this distribution:\n\n                      \"MBED TLS PROJECT\" - https://github.com/ARMmbed/mbedtls\n                      \"MICRO-ECC PROJECT\" - https://github.com/kmackay/micro-ecc\n                      \"ARDUINOLIBS PROJECT\" - https://rweather.github.io/arduinolibs/crypto.html\n                      \"YUBICO-C PROJECT\" - https://github.com/Yubico/yubico-c\n\nFor more information on export restrictions see: http://www.apache.org/licenses/exports/\n\n## Source\n\n[OnlyKey Firmware on Github](https://github.com/trustcrypto/OnlyKey-Firmware)\n"
  },
  {
    "path": "keylayouts.c",
    "content": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp.to>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 4. The names \"OnlyKey\" and \"CryptoTrust\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    admin@crp.to.\n *\n * 5. Products derived from this software may not be called \"OnlyKey\"\n *    nor may \"OnlyKey\" or \"CryptoTrust\" appear in their names without\n *    specific prior written permission. For written permission, please\n *    contact admin@crp.to.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 7. Redistributions in any form must be accompanied by information on\n *    how to obtain complete source code for this software and any\n *    accompanying software that uses this software. The source code\n *    must either be included in the distribution or be available for\n *    no more than the cost of distribution plus a nominal fee, and must\n *    be freely redistributable under reasonable conditions. For a\n *    binary file, complete source code means the source code for all\n *    modules it contains.\n *\n * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS\n * ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT\n * LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM\n * IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE\n * SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE\n * RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY\n * THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF\n * ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER\n * APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE\n * REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION\n * BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM\n * EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL\n * SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT\n * FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS\n * AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF\n * TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS\n * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Original Teensyduino Core Library\n * http://www.pjrc.com/teensy/\n * Copyright (c) 2013 PJRC.COM, LLC.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * 1. The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * 2. If the Software is incorporated into a build system that allows\n * selection among a list of target devices, then similar target\n * devices manufactured by PJRC.COM must be included in the list of\n * target devices and selectable in the same manner.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include <avr/pgmspace.h>\n#include <stdint.h>\n\n#include \"keylayouts.h\"\n\n#ifdef M\n#undef M\n#endif\n#define M(n) ((n) & KEYCODE_MASK)\n\nKEYCODE_TYPE keycodes_ascii[96] = {0};\n\nKEYCODE_TYPE keycodes_iso_8859_1[96] = {0};\n\nuint8_t KeyboardLayout[1];\nuint16_t SHIFT_MASK = 0;\nuint16_t ALTGR_MASK = 0;\nuint16_t RCTRL_MASK = 0;\nuint16_t KEY_NON_US_100 = 0;\nuint16_t DEADKEYS_MASK = 0;\nuint16_t CIRCUMFLEX_BITS = 0;\nuint16_t ACUTE_ACCENT_BITS = 0;\nuint16_t GRAVE_ACCENT_BITS = 0;\nuint16_t TILDE_BITS = 0;\nuint16_t DIAERESIS_BITS = 0;\nuint16_t DEADKEY_CIRCUMFLEX = 0;\nuint16_t DEADKEY_ACUTE_ACCENT = 0;\nuint16_t DEADKEY_GRAVE_ACCENT = 0;\nuint16_t DEADKEY_TILDE = 0;\nuint16_t DEADKEY_DIAERESIS = 0;\nuint16_t UNICODE_20AC = 0;\nuint16_t CEDILLA_BITS = 0;\nuint16_t DEADKEY_CEDILLA = 0;\nuint16_t RING_ABOVE_BITS = 0;\nuint16_t DEADKEY_RING_ABOVE = 0;\nuint16_t DEGREE_SIGN_BITS = 0;\nuint16_t CARON_BITS = 0;\nuint16_t BREVE_BITS = 0;\nuint16_t OGONEK_BITS = 0;\nuint16_t DOT_ABOVE_BITS = 0;\nuint16_t DOUBLE_ACUTE_BITS = 0;\nuint16_t DEADKEY_DEGREE_SIGN = 0;\nuint16_t DEADKEY_CARON = 0;\nuint16_t DEADKEY_BREVE = 0;\nuint16_t DEADKEY_OGONEK = 0;\nuint16_t DEADKEY_DOT_ABOVE = 0;\nuint16_t DEADKEY_DOUBLE_ACUTE = 0;\nuint16_t UNICODE_EXTRA0A = 0;\nuint16_t KEYCODE_EXTRA0A = 0;\nuint16_t ISO_8859_1_A0 = 0;\nuint16_t UNICODE_EXTRA00 = 0;\nuint16_t UNICODE_EXTRA01 = 0;\nuint16_t UNICODE_EXTRA02 = 0;\nuint16_t UNICODE_EXTRA03 = 0;\nuint16_t UNICODE_EXTRA04 = 0;\nuint16_t UNICODE_EXTRA05 = 0;\nuint16_t UNICODE_EXTRA06 = 0;\nuint16_t UNICODE_EXTRA07 = 0;\nuint16_t UNICODE_EXTRA08 = 0;\nuint16_t UNICODE_EXTRA09 = 0;\nuint16_t KEYCODE_EXTRA00 = 0;\nuint16_t KEYCODE_EXTRA01 = 0;\nuint16_t KEYCODE_EXTRA02 = 0;\nuint16_t KEYCODE_EXTRA03 = 0;\nuint16_t KEYCODE_EXTRA04 = 0;\nuint16_t KEYCODE_EXTRA05 = 0;\nuint16_t KEYCODE_EXTRA06 = 0;\nuint16_t KEYCODE_EXTRA07 = 0;\nuint16_t KEYCODE_EXTRA08 = 0;\nuint16_t KEYCODE_EXTRA09 = 0;\nuint16_t KEYCODE_MASK = 0;\n\nvoid update_keyboard_layout() {\n\nSHIFT_MASK = 0;\nALTGR_MASK = 0;\nRCTRL_MASK = 0;\nKEY_NON_US_100 = 0;\nDEADKEYS_MASK = 0;\nCIRCUMFLEX_BITS = 0;\nACUTE_ACCENT_BITS = 0;\nGRAVE_ACCENT_BITS = 0;\nTILDE_BITS = 0;\nDIAERESIS_BITS = 0;\nDEADKEY_CIRCUMFLEX = 0;\nDEADKEY_ACUTE_ACCENT = 0;\nDEADKEY_GRAVE_ACCENT = 0;\nDEADKEY_TILDE = 0;\nDEADKEY_DIAERESIS = 0;\nUNICODE_20AC = 0;\nCEDILLA_BITS = 0;\nDEADKEY_CEDILLA = 0;\nRING_ABOVE_BITS = 0;\nDEADKEY_RING_ABOVE = 0;\nDEGREE_SIGN_BITS = 0;\nCARON_BITS = 0;\nBREVE_BITS = 0;\nOGONEK_BITS = 0;\nDOT_ABOVE_BITS = 0;\nDOUBLE_ACUTE_BITS = 0;\nDEADKEY_DEGREE_SIGN = 0;\nDEADKEY_CARON = 0;\nDEADKEY_BREVE = 0;\nDEADKEY_OGONEK = 0;\nDEADKEY_DOT_ABOVE = 0;\nDEADKEY_DOUBLE_ACUTE = 0;\nUNICODE_EXTRA0A = 0;\nKEYCODE_EXTRA0A = 0;\n\nuint16_t ASCII_20 = 0;\nuint16_t ASCII_21 = 0;\nuint16_t ASCII_22 = 0;\nuint16_t ASCII_23 = 0;\nuint16_t ASCII_24 = 0;\nuint16_t ASCII_25 = 0;\nuint16_t ASCII_26 = 0;\nuint16_t ASCII_27 = 0;\nuint16_t ASCII_28 = 0;\nuint16_t ASCII_29 = 0;\nuint16_t ASCII_2A = 0;\nuint16_t ASCII_2B = 0;\nuint16_t ASCII_2C = 0;\nuint16_t ASCII_2D = 0;\nuint16_t ASCII_2E = 0;\nuint16_t ASCII_2F = 0;\nuint16_t ASCII_30 = 0;\nuint16_t ASCII_31 = 0;\nuint16_t ASCII_32 = 0;\nuint16_t ASCII_33 = 0;\nuint16_t ASCII_34 = 0;\nuint16_t ASCII_35 = 0;\nuint16_t ASCII_36 = 0;\nuint16_t ASCII_37 = 0;\nuint16_t ASCII_38 = 0;\nuint16_t ASCII_39 = 0;\nuint16_t ASCII_3A = 0;\nuint16_t ASCII_3B = 0;\nuint16_t ASCII_3C = 0;\nuint16_t ASCII_3D = 0;\nuint16_t ASCII_3E = 0;\nuint16_t ASCII_3F = 0;\nuint16_t ASCII_40 = 0;\nuint16_t ASCII_41 = 0;\nuint16_t ASCII_42 = 0;\nuint16_t ASCII_43 = 0;\nuint16_t ASCII_44 = 0;\nuint16_t ASCII_45 = 0;\nuint16_t ASCII_46 = 0;\nuint16_t ASCII_47 = 0;\nuint16_t ASCII_48 = 0;\nuint16_t ASCII_49 = 0;\nuint16_t ASCII_4A = 0;\nuint16_t ASCII_4B = 0;\nuint16_t ASCII_4C = 0;\nuint16_t ASCII_4D = 0;\nuint16_t ASCII_4E = 0;\nuint16_t ASCII_4F = 0;\nuint16_t ASCII_50 = 0;\nuint16_t ASCII_51 = 0;\nuint16_t ASCII_52 = 0;\nuint16_t ASCII_53 = 0;\nuint16_t ASCII_54 = 0;\nuint16_t ASCII_55 = 0;\nuint16_t ASCII_56 = 0;\nuint16_t ASCII_57 = 0;\nuint16_t ASCII_58 = 0;\nuint16_t ASCII_59 = 0;\nuint16_t ASCII_5A = 0;\nuint16_t ASCII_5B = 0;\nuint16_t ASCII_5C = 0;\nuint16_t ASCII_5D = 0;\nuint16_t ASCII_5E = 0;\nuint16_t ASCII_5F = 0;\nuint16_t ASCII_60 = 0;\nuint16_t ASCII_61 = 0;\nuint16_t ASCII_62 = 0;\nuint16_t ASCII_63 = 0;\nuint16_t ASCII_64 = 0;\nuint16_t ASCII_65 = 0;\nuint16_t ASCII_66 = 0;\nuint16_t ASCII_67 = 0;\nuint16_t ASCII_68 = 0;\nuint16_t ASCII_69 = 0;\nuint16_t ASCII_6A = 0;\nuint16_t ASCII_6B = 0;\nuint16_t ASCII_6C = 0;\nuint16_t ASCII_6D = 0;\nuint16_t ASCII_6E = 0;\nuint16_t ASCII_6F = 0;\nuint16_t ASCII_70 = 0;\nuint16_t ASCII_71 = 0;\nuint16_t ASCII_72 = 0;\nuint16_t ASCII_73 = 0;\nuint16_t ASCII_74 = 0;\nuint16_t ASCII_75 = 0;\nuint16_t ASCII_76 = 0;\nuint16_t ASCII_77 = 0;\nuint16_t ASCII_78 = 0;\nuint16_t ASCII_79 = 0;\nuint16_t ASCII_7A = 0;\nuint16_t ASCII_7B = 0;\nuint16_t ASCII_7C = 0;\nuint16_t ASCII_7D = 0;\nuint16_t ASCII_7E = 0;\nuint16_t ASCII_7F = 0;\n\nISO_8859_1_A0 = 0;\nuint16_t ISO_8859_1_A1 = 0;\nuint16_t ISO_8859_1_A2 = 0;\nuint16_t ISO_8859_1_A3 = 0;\nuint16_t ISO_8859_1_A4 = 0;\nuint16_t ISO_8859_1_A5 = 0;\nuint16_t ISO_8859_1_A6 = 0;\nuint16_t ISO_8859_1_A7 = 0;\nuint16_t ISO_8859_1_A8 = 0;\nuint16_t ISO_8859_1_A9 = 0;\nuint16_t ISO_8859_1_AA = 0;\nuint16_t ISO_8859_1_AB = 0;\nuint16_t ISO_8859_1_AC = 0;\nuint16_t ISO_8859_1_AD = 0;\nuint16_t ISO_8859_1_AE = 0;\nuint16_t ISO_8859_1_AF = 0;\nuint16_t ISO_8859_1_B0 = 0;\nuint16_t ISO_8859_1_B1 = 0;\nuint16_t ISO_8859_1_B2 = 0;\nuint16_t ISO_8859_1_B3 = 0;\nuint16_t ISO_8859_1_B4 = 0;\nuint16_t ISO_8859_1_B5 = 0;\nuint16_t ISO_8859_1_B6 = 0;\nuint16_t ISO_8859_1_B7 = 0;\nuint16_t ISO_8859_1_B8 = 0;\nuint16_t ISO_8859_1_B9 = 0;\nuint16_t ISO_8859_1_BA = 0;\nuint16_t ISO_8859_1_BB = 0;\nuint16_t ISO_8859_1_BC = 0;\nuint16_t ISO_8859_1_BD = 0;\nuint16_t ISO_8859_1_BE = 0;\nuint16_t ISO_8859_1_BF = 0;\nuint16_t ISO_8859_1_C0 = 0;\nuint16_t ISO_8859_1_C1 = 0;\nuint16_t ISO_8859_1_C2 = 0;\nuint16_t ISO_8859_1_C3 = 0;\nuint16_t ISO_8859_1_C4 = 0;\nuint16_t ISO_8859_1_C5 = 0;\nuint16_t ISO_8859_1_C6 = 0;\nuint16_t ISO_8859_1_C7 = 0;\nuint16_t ISO_8859_1_C8 = 0;\nuint16_t ISO_8859_1_C9 = 0;\nuint16_t ISO_8859_1_CA = 0;\nuint16_t ISO_8859_1_CB = 0;\nuint16_t ISO_8859_1_CC = 0;\nuint16_t ISO_8859_1_CD = 0;\nuint16_t ISO_8859_1_CE = 0;\nuint16_t ISO_8859_1_CF = 0;\nuint16_t ISO_8859_1_D0 = 0;\nuint16_t ISO_8859_1_D1 = 0;\nuint16_t ISO_8859_1_D2 = 0;\nuint16_t ISO_8859_1_D3 = 0;\nuint16_t ISO_8859_1_D4 = 0;\nuint16_t ISO_8859_1_D5 = 0;\nuint16_t ISO_8859_1_D6 = 0;\nuint16_t ISO_8859_1_D7 = 0;\nuint16_t ISO_8859_1_D8 = 0;\nuint16_t ISO_8859_1_D9 = 0;\nuint16_t ISO_8859_1_DA = 0;\nuint16_t ISO_8859_1_DB = 0;\nuint16_t ISO_8859_1_DC = 0;\nuint16_t ISO_8859_1_DD = 0;\nuint16_t ISO_8859_1_DE = 0;\nuint16_t ISO_8859_1_DF = 0;\nuint16_t ISO_8859_1_E0 = 0;\nuint16_t ISO_8859_1_E1 = 0;\nuint16_t ISO_8859_1_E2 = 0;\nuint16_t ISO_8859_1_E3 = 0;\nuint16_t ISO_8859_1_E4 = 0;\nuint16_t ISO_8859_1_E5 = 0;\nuint16_t ISO_8859_1_E6 = 0;\nuint16_t ISO_8859_1_E7 = 0;\nuint16_t ISO_8859_1_E8 = 0;\nuint16_t ISO_8859_1_E9 = 0;\nuint16_t ISO_8859_1_EA = 0;\nuint16_t ISO_8859_1_EB = 0;\nuint16_t ISO_8859_1_EC = 0;\nuint16_t ISO_8859_1_ED = 0;\nuint16_t ISO_8859_1_EE = 0;\nuint16_t ISO_8859_1_EF = 0;\nuint16_t ISO_8859_1_F0 = 0;\nuint16_t ISO_8859_1_F1 = 0;\nuint16_t ISO_8859_1_F2 = 0;\nuint16_t ISO_8859_1_F3 = 0;\nuint16_t ISO_8859_1_F4 = 0;\nuint16_t ISO_8859_1_F5 = 0;\nuint16_t ISO_8859_1_F6 = 0;\nuint16_t ISO_8859_1_F7 = 0;\nuint16_t ISO_8859_1_F8 = 0;\nuint16_t ISO_8859_1_F9 = 0;\nuint16_t ISO_8859_1_FA = 0;\nuint16_t ISO_8859_1_FB = 0;\nuint16_t ISO_8859_1_FC = 0;\nuint16_t ISO_8859_1_FD = 0;\nuint16_t ISO_8859_1_FE = 0;\nuint16_t ISO_8859_1_FF = 0;\n\nUNICODE_EXTRA00 = 0;\nUNICODE_EXTRA01 = 0;\nUNICODE_EXTRA02 = 0;\nUNICODE_EXTRA03 = 0;\nUNICODE_EXTRA04 = 0;\nUNICODE_EXTRA05 = 0;\nUNICODE_EXTRA06 = 0;\nUNICODE_EXTRA07 = 0;\nUNICODE_EXTRA08 = 0;\nUNICODE_EXTRA09 = 0;\nuint16_t UNICODE_EXTRA10 = 0;\nuint16_t UNICODE_EXTRA11 = 0;\nuint16_t UNICODE_EXTRA12 = 0;\nuint16_t UNICODE_EXTRA13 = 0;\nuint16_t UNICODE_EXTRA14 = 0;\nuint16_t UNICODE_EXTRA15 = 0;\nuint16_t UNICODE_EXTRA16 = 0;\nuint16_t UNICODE_EXTRA17 = 0;\nuint16_t UNICODE_EXTRA18 = 0;\nuint16_t UNICODE_EXTRA19 = 0;\nuint16_t UNICODE_EXTRA20 = 0;\nuint16_t UNICODE_EXTRA21 = 0;\nuint16_t UNICODE_EXTRA22 = 0;\nuint16_t UNICODE_EXTRA23 = 0;\nuint16_t UNICODE_EXTRA24 = 0;\nuint16_t UNICODE_EXTRA25 = 0;\nuint16_t UNICODE_EXTRA26 = 0;\nuint16_t UNICODE_EXTRA27 = 0;\nuint16_t UNICODE_EXTRA28 = 0;\nuint16_t UNICODE_EXTRA29 = 0;\nuint16_t UNICODE_EXTRA30 = 0;\nuint16_t UNICODE_EXTRA31 = 0;\nuint16_t UNICODE_EXTRA32 = 0;\nuint16_t UNICODE_EXTRA33 = 0;\nuint16_t UNICODE_EXTRA34 = 0;\nuint16_t UNICODE_EXTRA35 = 0;\nuint16_t UNICODE_EXTRA36 = 0;\nuint16_t UNICODE_EXTRA37 = 0;\nuint16_t UNICODE_EXTRA38 = 0;\nuint16_t UNICODE_EXTRA39 = 0;\nuint16_t UNICODE_EXTRA40 = 0;\nuint16_t UNICODE_EXTRA41 = 0;\nuint16_t UNICODE_EXTRA42 = 0;\nuint16_t UNICODE_EXTRA43 = 0;\nuint16_t UNICODE_EXTRA44 = 0;\nuint16_t UNICODE_EXTRA45 = 0;\nuint16_t UNICODE_EXTRA46 = 0;\nuint16_t UNICODE_EXTRA47 = 0;\nuint16_t UNICODE_EXTRA48 = 0;\nuint16_t UNICODE_EXTRA49 = 0;\nuint16_t UNICODE_EXTRA50 = 0;\nuint16_t UNICODE_EXTRA51 = 0;\n\nKEYCODE_EXTRA00 = 0;\nKEYCODE_EXTRA01 = 0;\nKEYCODE_EXTRA02 = 0;\nKEYCODE_EXTRA03 = 0;\nKEYCODE_EXTRA04 = 0;\nKEYCODE_EXTRA05 = 0;\nKEYCODE_EXTRA06 = 0;\nKEYCODE_EXTRA07 = 0;\nKEYCODE_EXTRA08 = 0;\nKEYCODE_EXTRA09 = 0;\nuint16_t KEYCODE_EXTRA10 = 0;\nuint16_t KEYCODE_EXTRA11 = 0;\nuint16_t KEYCODE_EXTRA12 = 0;\nuint16_t KEYCODE_EXTRA13 = 0;\nuint16_t KEYCODE_EXTRA14 = 0;\nuint16_t KEYCODE_EXTRA15 = 0;\nuint16_t KEYCODE_EXTRA16 = 0;\nuint16_t KEYCODE_EXTRA17 = 0;\nuint16_t KEYCODE_EXTRA18 = 0;\nuint16_t KEYCODE_EXTRA19 = 0;\nuint16_t KEYCODE_EXTRA20 = 0;\nuint16_t KEYCODE_EXTRA21 = 0;\nuint16_t KEYCODE_EXTRA22 = 0;\nuint16_t KEYCODE_EXTRA23 = 0;\nuint16_t KEYCODE_EXTRA24 = 0;\nuint16_t KEYCODE_EXTRA25 = 0;\nuint16_t KEYCODE_EXTRA26 = 0;\nuint16_t KEYCODE_EXTRA27 = 0;\nuint16_t KEYCODE_EXTRA28 = 0;\nuint16_t KEYCODE_EXTRA29 = 0;\nuint16_t KEYCODE_EXTRA30 = 0;\nuint16_t KEYCODE_EXTRA31 = 0;\nuint16_t KEYCODE_EXTRA32 = 0;\nuint16_t KEYCODE_EXTRA33 = 0;\nuint16_t KEYCODE_EXTRA34 = 0;\nuint16_t KEYCODE_EXTRA35 = 0;\nuint16_t KEYCODE_EXTRA36 = 0;\nuint16_t KEYCODE_EXTRA37 = 0;\nuint16_t KEYCODE_EXTRA38 = 0;\nuint16_t KEYCODE_EXTRA39 = 0;\nuint16_t KEYCODE_EXTRA40 = 0;\nuint16_t KEYCODE_EXTRA41 = 0;\nuint16_t KEYCODE_EXTRA42 = 0;\nuint16_t KEYCODE_EXTRA43 = 0;\nuint16_t KEYCODE_EXTRA44 = 0;\nuint16_t KEYCODE_EXTRA45 = 0;\nuint16_t KEYCODE_EXTRA46 = 0;\nuint16_t KEYCODE_EXTRA47 = 0;\nuint16_t KEYCODE_EXTRA48 = 0;\nuint16_t KEYCODE_EXTRA49 = 0;\nuint16_t KEYCODE_EXTRA50 = 0;\nuint16_t KEYCODE_EXTRA51 = 0;\n\n\nif (KeyboardLayout[0] == LAYOUT_USA_ENGLISH || KeyboardLayout[0] == LAYOUT_DVORAK || KeyboardLayout[0] == 0x00) {\nSHIFT_MASK=0x0040;\n//KEYCODE_TYPE=uint8_t\nKEYCODE_MASK=0x007F;\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_QUOTE + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + SHIFT_MASK;// 35 #\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_7 + SHIFT_MASK;// 38 &\nASCII_27=KEY_QUOTE;// 39 '\nASCII_28=KEY_9 + SHIFT_MASK;// 40 (\nASCII_29=KEY_0 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_8 + SHIFT_MASK;// 42 *\nASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_MINUS;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_SLASH;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :\nASCII_3B=KEY_SEMICOLON;// 59 ;\nASCII_3C=KEY_COMMA + SHIFT_MASK;// 60 <\nASCII_3D=KEY_EQUAL;// 61 )=\nASCII_3E=KEY_PERIOD + SHIFT_MASK;// 62 >\nASCII_3F=KEY_SLASH + SHIFT_MASK;// 63 ?\nASCII_40=KEY_2 + SHIFT_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_LEFT_BRACE;// 91 [\nASCII_5C=KEY_BACKSLASH;// 92\nASCII_5D=KEY_RIGHT_BRACE;// 93 ]\nASCII_5E=KEY_6 + SHIFT_MASK;// 94 ^\nASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _\nASCII_60=KEY_TILDE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_LEFT_BRACE + SHIFT_MASK;// 123 {\nASCII_7C=KEY_BACKSLASH + SHIFT_MASK;// 124 |\nASCII_7D=KEY_RIGHT_BRACE + SHIFT_MASK;// 125 }\nASCII_7E=KEY_TILDE + SHIFT_MASK;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\n\nif (KeyboardLayout[0] == LAYOUT_DVORAK) {\n    ASCII_2D=KEY_QUOTE; // -\n    ASCII_5F=KEY_QUOTE + SHIFT_MASK; // _\n    ASCII_3D=KEY_RIGHT_BRACE; // =\n    ASCII_2B=KEY_RIGHT_BRACE + SHIFT_MASK; // +\n    ASCII_71=KEY_X; // q\n    ASCII_51=KEY_X + SHIFT_MASK;// Q\n    ASCII_77=KEY_COMMA; // w\n    ASCII_57=KEY_COMMA + SHIFT_MASK; // W\n    ASCII_65=KEY_D; // e\n    ASCII_45=KEY_D + SHIFT_MASK; // E\n    ASCII_72=KEY_O; // r\n    ASCII_52=KEY_O + SHIFT_MASK; // R\n    ASCII_74=KEY_K; // t\n    ASCII_54=KEY_K + SHIFT_MASK; // T\n    ASCII_79=KEY_T; // y\n    ASCII_59=KEY_T + SHIFT_MASK; // Y\n    ASCII_75=KEY_F; // u\n    ASCII_55=KEY_F + SHIFT_MASK; // U\n    ASCII_69=KEY_G; // i\n    ASCII_49=KEY_G + SHIFT_MASK; // I\n    ASCII_6F=KEY_S; // o\n    ASCII_4F=KEY_S + SHIFT_MASK; // O\n    ASCII_70=KEY_R; // p\n    ASCII_50=KEY_R + SHIFT_MASK; // P\n    ASCII_5B=KEY_MINUS; // [\n    ASCII_7B=KEY_MINUS + SHIFT_MASK; // {\n    ASCII_5D=KEY_EQUAL; // ]\n    ASCII_7D=KEY_EQUAL + SHIFT_MASK; // }\n    ASCII_73=KEY_SEMICOLON; // s\n    ASCII_53=KEY_SEMICOLON + SHIFT_MASK; // S\n    ASCII_64=KEY_H; // d\n    ASCII_44=KEY_H + SHIFT_MASK; // D\n    ASCII_66=KEY_Y; // f \n    ASCII_46=KEY_Y + SHIFT_MASK; // F\n    ASCII_67=KEY_U; // g\n    ASCII_47=KEY_U + SHIFT_MASK; // G\n    ASCII_68=KEY_J; // h\n    ASCII_48=KEY_J + SHIFT_MASK; // H\n    ASCII_6A=KEY_C; // j\n    ASCII_4A=KEY_C + SHIFT_MASK; // J\n    ASCII_6B=KEY_V; // k\n    ASCII_4B=KEY_V + SHIFT_MASK; // K\n    ASCII_6C=KEY_P; // l\n    ASCII_4C=KEY_P + SHIFT_MASK; // L\n    ASCII_3B=KEY_Z; // ;\n    ASCII_3A=KEY_Z + SHIFT_MASK; // :\n    ASCII_27=KEY_Q; // '\n    ASCII_22=KEY_Q + SHIFT_MASK; // \"\n    ASCII_7A=KEY_SLASH; // z\n    ASCII_5A=KEY_SLASH + SHIFT_MASK; // Z\n    ASCII_78=KEY_B; // x\n    ASCII_58=KEY_B + SHIFT_MASK; // X\n    ASCII_63=KEY_I; // c\n    ASCII_43=KEY_I + SHIFT_MASK; // C\n    ASCII_76=KEY_PERIOD; // v\n    ASCII_56=KEY_PERIOD + SHIFT_MASK; // V\n    ASCII_62=KEY_N; // b\n    ASCII_42=KEY_N + SHIFT_MASK; // B\n    ASCII_6E=KEY_L; // n\n    ASCII_4E=KEY_L + SHIFT_MASK; // N\n    ASCII_2C=KEY_W; // ,\n    ASCII_3C=KEY_W + SHIFT_MASK; // <\n    ASCII_2E=KEY_E; // .\n    ASCII_3E=KEY_E + SHIFT_MASK; // >\n    ASCII_2F=KEY_LEFT_BRACE; // /\n    ASCII_3F=KEY_LEFT_BRACE + SHIFT_MASK; // ?\n}\n\n// LAYOUT_USA_ENGLISH\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_US_INTERNATIONAL) {\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nACUTE_ACCENT_BITS=0x0200;\nGRAVE_ACCENT_BITS=0x0300;\nTILDE_BITS=0x0400;\nDIAERESIS_BITS=0x0500;\n//KEYCODE_TYPE=uint16_t\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_6 + SHIFT_MASK;\nDEADKEY_ACUTE_ACCENT=KEY_QUOTE;\nDEADKEY_GRAVE_ACCENT=KEY_TILDE;\nDEADKEY_TILDE=KEY_TILDE + SHIFT_MASK;\nDEADKEY_DIAERESIS=KEY_QUOTE + SHIFT_MASK;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=DIAERESIS_BITS + KEY_SPACE;// 34 \"\nASCII_23=KEY_3 + SHIFT_MASK;// 35 #\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_7 + SHIFT_MASK;// 38 &\nASCII_27=ACUTE_ACCENT_BITS + KEY_SPACE;// 39 '\nASCII_28=KEY_9 + SHIFT_MASK;// 40 (\nASCII_29=KEY_0 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_8 + SHIFT_MASK;// 42 *\nASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_MINUS;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_SLASH;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :\nASCII_3B=KEY_SEMICOLON;// 59 ;\nASCII_3C=KEY_COMMA + SHIFT_MASK;// 60 <\nASCII_3D=KEY_EQUAL;// 61 =\nASCII_3E=KEY_PERIOD + SHIFT_MASK;// 62 >\nASCII_3F=KEY_SLASH + SHIFT_MASK;// 63 ?\nASCII_40=KEY_2 + SHIFT_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_LEFT_BRACE;// 91 [\nASCII_5C=KEY_BACKSLASH;// 92\nASCII_5D=KEY_RIGHT_BRACE;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_LEFT_BRACE + SHIFT_MASK;// 123 {\nASCII_7C=KEY_BACKSLASH + SHIFT_MASK;// 124 |\nASCII_7D=KEY_RIGHT_BRACE + SHIFT_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=KEY_1 + ALTGR_MASK;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=KEY_C + ALTGR_MASK + SHIFT_MASK;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_4 + ALTGR_MASK + SHIFT_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=KEY_4 + ALTGR_MASK;// 164 ¤     Currency or Euro Sign\nISO_8859_1_A5=KEY_MINUS + ALTGR_MASK;// 165 ¥     YEN SIGN\nISO_8859_1_A6=KEY_BACKSLASH + ALTGR_MASK + SHIFT_MASK;// 166 ¦     BROKEN BAR;??\nISO_8859_1_A7=KEY_S + ALTGR_MASK + SHIFT_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=KEY_QUOTE + ALTGR_MASK + SHIFT_MASK;// 168 ¨     DIAERESIS\nISO_8859_1_A9=KEY_C + ALTGR_MASK;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=KEY_LEFT_BRACE + ALTGR_MASK;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=KEY_BACKSLASH + ALTGR_MASK;// 172 ¬     NOT SIGN;??\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=KEY_R + ALTGR_MASK;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=KEY_SEMICOLON + ALTGR_MASK + SHIFT_MASK;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=KEY_2 + ALTGR_MASK;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=KEY_3 + ALTGR_MASK;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=KEY_QUOTE + ALTGR_MASK;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN\nISO_8859_1_B6=KEY_SEMICOLON + ALTGR_MASK;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=KEY_1 + ALTGR_MASK + SHIFT_MASK;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=KEY_RIGHT_BRACE + ALTGR_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=KEY_6 + ALTGR_MASK;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=KEY_7 + ALTGR_MASK;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=KEY_8 + ALTGR_MASK;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=KEY_SLASH + ALTGR_MASK;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=KEY_A + ALTGR_MASK + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=KEY_Q + ALTGR_MASK + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=KEY_W + ALTGR_MASK + SHIFT_MASK;// 197 Å     A RING ABOVE\nISO_8859_1_C6=KEY_Z + ALTGR_MASK + SHIFT_MASK;// 198 Æ     AE\nISO_8859_1_C7=KEY_COMMA + ALTGR_MASK + SHIFT_MASK;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=KEY_E + ALTGR_MASK + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=KEY_I + ALTGR_MASK + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð     ETH\nISO_8859_1_D1=KEY_N + ALTGR_MASK + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=KEY_O + ALTGR_MASK + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=KEY_P + ALTGR_MASK + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=KEY_EQUAL + ALTGR_MASK;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=KEY_L + ALTGR_MASK + SHIFT_MASK;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=KEY_U + ALTGR_MASK + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=KEY_Y + ALTGR_MASK + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ     THORN\nISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=KEY_A + ALTGR_MASK;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS\nISO_8859_1_E5=KEY_W + ALTGR_MASK;// 229 å     a RING ABOVE\nISO_8859_1_E6=KEY_Z + ALTGR_MASK;// 230 æ     ae\nISO_8859_1_E7=KEY_COMMA + ALTGR_MASK;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=KEY_I + ALTGR_MASK;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð     ETH\nISO_8859_1_F1=KEY_N + ALTGR_MASK;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=KEY_O + ALTGR_MASK;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O ;// 245 õ     o TILDE\nISO_8859_1_F6=KEY_P + ALTGR_MASK;// 246 ö     o DIAERESIS\nISO_8859_1_F7=KEY_EQUAL + ALTGR_MASK + SHIFT_MASK;// 247 ÷     DIVISION\nISO_8859_1_F8=KEY_L + ALTGR_MASK;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=KEY_U + ALTGR_MASK;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=KEY_Y + ALTGR_MASK;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_5 + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_5 + ALTGR_MASK;// 20AC €    Euro Sign\n\n// LAYOUT_US_INTERNATIONAL\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_GERMAN) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0300;\nACUTE_ACCENT_BITS=0x0400;\nGRAVE_ACCENT_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_TILDE;\nDEADKEY_ACUTE_ACCENT=KEY_EQUAL;\nDEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_BACKSLASH;// 35 #=??\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_BACKSLASH + SHIFT_MASK;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *\nASCII_2B=KEY_RIGHT_BRACE;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_Q + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Z + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Y + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_8 + ALTGR_MASK;// 91 [\nASCII_5C=KEY_MINUS + ALTGR_MASK;// 92\nASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Z;// 121 y\nASCII_7A=KEY_Y;// 122 z\nASCII_7B=KEY_7 + ALTGR_MASK;// 123 {\nASCII_7C=KEY_NON_US_100 + ALTGR_MASK;// 124 |\nASCII_7D=KEY_0 + ALTGR_MASK;// 125 }\nASCII_7E=KEY_RIGHT_BRACE + ALTGR_MASK;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent Sign\nISO_8859_1_A3=0;// 163 £     Pound Sign\nISO_8859_1_A4=KEY_E + ALTGR_MASK;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_3 + SHIFT_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=0;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=KEY_TILDE + SHIFT_MASK;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=KEY_2 + ALTGR_MASK;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=KEY_3 + ALTGR_MASK;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=0;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=0;// 195 Ã     A TILDE\nISO_8859_1_C4=KEY_QUOTE + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=0;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=0;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=0;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=0;// 213 Õ     O TILDE\nISO_8859_1_D6=KEY_SEMICOLON + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=KEY_LEFT_BRACE + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Z + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=KEY_MINUS;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=0;// 227 ã     a TILDE\nISO_8859_1_E4=KEY_QUOTE;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=0;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=0;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=0;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=0;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=0;// 245 õ     o TILDE\nISO_8859_1_F6=KEY_SEMICOLON;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=KEY_LEFT_BRACE;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Z;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=0;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign\n\n// LAYOUT_GERMAN\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_GERMAN_MAC) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nACUTE_ACCENT_BITS=0x0100;\nGRAVE_ACCENT_BITS=0x0200;\nCIRCUMFLEX_BITS=0x0300;\nDIAERESIS_BITS=0x0400;\nTILDE_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_ACUTE_ACCENT=KEY_EQUAL;\nDEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;\nDEADKEY_CIRCUMFLEX=KEY_6 + SHIFT_MASK + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_U + ALTGR_MASK;\nDEADKEY_TILDE=KEY_N + ALTGR_MASK;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_BACKSLASH;// 35 #=??\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_BACKSLASH + SHIFT_MASK;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *\nASCII_2B=KEY_RIGHT_BRACE;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_TILDE;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_TILDE + SHIFT_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_L + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Z + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Y + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_5 + ALTGR_MASK;// 91 [\nASCII_5C=KEY_7 + ALTGR_MASK + SHIFT_MASK;// 92\nASCII_5D=KEY_6 + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Z;// 121 y\nASCII_7A=KEY_Y;// 122 z\nASCII_7B=KEY_8 + ALTGR_MASK;// 123 {\nASCII_7C=KEY_7 + ALTGR_MASK;// 124 |\nASCII_7D=KEY_9 + ALTGR_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=KEY_1 + ALTGR_MASK;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=KEY_4 + ALTGR_MASK;// 162 ¢     Cent Sign\nISO_8859_1_A3=KEY_4 + SHIFT_MASK + ALTGR_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=KEY_E + ALTGR_MASK;// 164 ¤     Currency Sign\nISO_8859_1_A5=KEY_Z + ALTGR_MASK;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_3 + SHIFT_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=KEY_G + ALTGR_MASK;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=KEY_H + ALTGR_MASK;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=KEY_Q + ALTGR_MASK;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=KEY_R + ALTGR_MASK;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=KEY_0 + SHIFT_MASK + ALTGR_MASK;// 175 ¯     MACRON\nISO_8859_1_B0=KEY_LEFT_BRACE + ALTGR_MASK + SHIFT_MASK; // 176 °     DEGREE SIGN\nISO_8859_1_B1=KEY_RIGHT_BRACE + ALTGR_MASK;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN\nISO_8859_1_B6=KEY_3 + ALTGR_MASK;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=KEY_9 + SHIFT_MASK + ALTGR_MASK;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=KEY_J + ALTGR_MASK;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=KEY_Q + SHIFT_MASK + ALTGR_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=KEY_MINUS + ALTGR_MASK;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=KEY_QUOTE + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=KEY_A + ALTGR_MASK + SHIFT_MASK;// 197 Å     A RING ABOVE\nISO_8859_1_C6=KEY_QUOTE + ALTGR_MASK + SHIFT_MASK;// 198 Æ     AE\nISO_8859_1_C7=KEY_C + ALTGR_MASK + SHIFT_MASK;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=KEY_SEMICOLON + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=KEY_O + ALTGR_MASK + SHIFT_MASK;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=KEY_LEFT_BRACE + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Z + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=KEY_MINUS;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE\nISO_8859_1_E4=KEY_QUOTE;// 228 ä     a DIAERESIS\nISO_8859_1_E5=KEY_A + ALTGR_MASK;// 229 å     a RING ABOVE\nISO_8859_1_E6=KEY_QUOTE + ALTGR_MASK;// 230 æ     ae\nISO_8859_1_E7=KEY_C + ALTGR_MASK;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE\nISO_8859_1_F6=KEY_SEMICOLON;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=KEY_O + ALTGR_MASK;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=KEY_LEFT_BRACE;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Z;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Z;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign\n\n// LAYOUT_GERMAN_MAC\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_CANADIAN_FRENCH) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nACUTE_ACCENT_BITS=0x0200;\nGRAVE_ACCENT_BITS=0x0300;\nDIAERESIS_BITS=0x0400;\nCEDILLA_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_LEFT_BRACE;\nDEADKEY_ACUTE_ACCENT=KEY_SLASH + ALTGR_MASK;\nDEADKEY_GRAVE_ACCENT=KEY_QUOTE;\nDEADKEY_DIAERESIS=KEY_RIGHT_BRACE + SHIFT_MASK;\nDEADKEY_CEDILLA=KEY_RIGHT_BRACE;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_TILDE + SHIFT_MASK;// 35 #\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_7 + SHIFT_MASK;// 38 &\nASCII_27=KEY_COMMA + SHIFT_MASK;// 39 '\n//ASCII_27=ACUTE_ACCENT_BITS + KEY_SPACE;// 39 '\nASCII_28=KEY_9 + SHIFT_MASK;// 40 (\nASCII_29=KEY_0 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_8 + SHIFT_MASK;// 42 *\nASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_MINUS;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_3 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :\nASCII_3B=KEY_SEMICOLON;// 59 ;\nASCII_3C=KEY_BACKSLASH;// 60 <\nASCII_3D=KEY_EQUAL;// 61 =\nASCII_3E=KEY_BACKSLASH + SHIFT_MASK;// 62 >\nASCII_3F=KEY_6 + SHIFT_MASK;// 63 ?\nASCII_40=KEY_2 + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_LEFT_BRACE + ALTGR_MASK;// 91 [\nASCII_5C=KEY_TILDE + ALTGR_MASK;// 92\nASCII_5D=KEY_RIGHT_BRACE + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_QUOTE + ALTGR_MASK;// 123 {\nASCII_7C=KEY_TILDE + SHIFT_MASK;// 124 |\nASCII_7D=KEY_BACKSLASH + ALTGR_MASK;// 125 }\nASCII_7E=KEY_SEMICOLON + ALTGR_MASK;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=KEY_4 + ALTGR_MASK;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=KEY_5 + ALTGR_MASK;// 164 ¤     Currency or Euro Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=KEY_7 + ALTGR_MASK;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_O + ALTGR_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=0;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=KEY_NON_US_100;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=KEY_6 + ALTGR_MASK;// 172 ¬     NOT SIGN\nISO_8859_1_AD=KEY_PERIOD + ALTGR_MASK;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=KEY_COMMA + ALTGR_MASK;// 175 ¯     MACRON\nISO_8859_1_B0=KEY_NON_US_100 + ALTGR_MASK;// 176 °     DEGREE SIGN\nISO_8859_1_B1=KEY_1 + ALTGR_MASK;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=KEY_8 + ALTGR_MASK;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=KEY_9 + ALTGR_MASK;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=0;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN\nISO_8859_1_B6=KEY_P + ALTGR_MASK;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=KEY_NON_US_100 + SHIFT_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=KEY_0 + ALTGR_MASK;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=KEY_MINUS + ALTGR_MASK;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=KEY_EQUAL + ALTGR_MASK;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=0;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=CEDILLA_BITS + KEY_C + SHIFT_MASK;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=KEY_SLASH + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=0;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=0;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=0;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=0;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=CEDILLA_BITS + KEY_C;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=KEY_SLASH;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=0;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=0;// 245 õ     o TILDE\nISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\n\n// LAYOUT_CANADIAN_FRENCH\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_CANADIAN_MULTILINGUAL) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nRCTRL_MASK=0x0800;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nDIAERESIS_BITS=0x0200;\nACUTE_ACCENT_BITS=0x0300;\nCEDILLA_BITS=0x0400;\nGRAVE_ACCENT_BITS=0x0500;\nTILDE_BITS=0x0600;\nRING_ABOVE_BITS=0x0700;\nKEYCODE_MASK=0x0FFF;\nDEADKEY_CIRCUMFLEX=KEY_LEFT_BRACE;\nDEADKEY_DIAERESIS=KEY_LEFT_BRACE + SHIFT_MASK;\nDEADKEY_ACUTE_ACCENT=KEY_SEMICOLON + RCTRL_MASK;\nDEADKEY_CEDILLA=KEY_EQUAL + RCTRL_MASK;\nDEADKEY_GRAVE_ACCENT=KEY_LEFT_BRACE + ALTGR_MASK;\nDEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;\nDEADKEY_RING_ABOVE=KEY_LEFT_BRACE + SHIFT_MASK + RCTRL_MASK;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_PERIOD + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + SHIFT_MASK;// 35 #\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_7 + SHIFT_MASK;// 38 &\nASCII_27=KEY_COMMA + SHIFT_MASK;// 39 '\nASCII_28=KEY_9 + SHIFT_MASK;// 40 (\nASCII_29=KEY_0 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_8 + SHIFT_MASK;// 42 *\nASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_MINUS;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_TILDE;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :\nASCII_3B=KEY_SEMICOLON;// 59 ;\nASCII_3C=KEY_COMMA + ALTGR_MASK;// 60 <\nASCII_3D=KEY_EQUAL;// 61 =\nASCII_3E=KEY_PERIOD + ALTGR_MASK;// 62 >\nASCII_3F=KEY_6 + SHIFT_MASK;// 63 ?\nASCII_40=KEY_2 + SHIFT_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_9 + ALTGR_MASK;// 91 [\nASCII_5C=KEY_TILDE + SHIFT_MASK;// 92\nASCII_5D=KEY_0 + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_7 + ALTGR_MASK;// 123 {\nASCII_7C=KEY_TILDE + ALTGR_MASK;// 124 |\nASCII_7D=KEY_8 + ALTGR_MASK;// 125 }\nASCII_7E=KEY_RIGHT_BRACE + RCTRL_MASK;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\nISO_8859_1_A0=KEY_SPACE + ALTGR_MASK;// 160       Nonbreakng Space\nISO_8859_1_A1=KEY_1 + SHIFT_MASK + RCTRL_MASK;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=KEY_C + RCTRL_MASK;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_3 + SHIFT_MASK + RCTRL_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=KEY_4 + SHIFT_MASK + RCTRL_MASK;// 164 ¤     Currency or Euro Sign\nISO_8859_1_A5=KEY_Y + SHIFT_MASK + RCTRL_MASK;// 165 ¥     YEN SIGN\nISO_8859_1_A6=KEY_NON_US_100 + SHIFT_MASK + RCTRL_MASK; // 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_S + SHIFT_MASK + RCTRL_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=KEY_C + SHIFT_MASK + RCTRL_MASK;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=KEY_F + SHIFT_MASK + RCTRL_MASK;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=KEY_Z + ALTGR_MASK;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=KEY_EQUAL + ALTGR_MASK;// 172 ¬     NOT SIGN\nISO_8859_1_AD=KEY_TILDE + SHIFT_MASK + RCTRL_MASK;// 173       SOFT HYPHEN\nISO_8859_1_AE=KEY_R + SHIFT_MASK + RCTRL_MASK;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;  // special dead key - no implemented=// 175 ¯     MACRON\nISO_8859_1_B0=KEY_SEMICOLON + ALTGR_MASK;// 176 °     DEGREE SIGN\nISO_8859_1_B1=KEY_9 + SHIFT_MASK + RCTRL_MASK;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=KEY_2 + RCTRL_MASK;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=KEY_3 + RCTRL_MASK;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=KEY_M + RCTRL_MASK;// 181 µ     MICRO SIGN\nISO_8859_1_B6=KEY_R + RCTRL_MASK;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=CEDILLA_BITS + KEY_SPACE;// 184 ¸     CEDILLA\nISO_8859_1_B9=KEY_1 + RCTRL_MASK;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=KEY_M + SHIFT_MASK + RCTRL_MASK;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=KEY_X + ALTGR_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=KEY_4 + RCTRL_MASK;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=KEY_5 + RCTRL_MASK;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=KEY_6 + RCTRL_MASK;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=KEY_MINUS + SHIFT_MASK + RCTRL_MASK;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=KEY_BACKSLASH + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=RING_ABOVE_BITS + KEY_A + SHIFT_MASK;// 197 Å     A RING ABOVE\nISO_8859_1_C6=KEY_A + SHIFT_MASK + RCTRL_MASK;// 198 Æ     AE\nISO_8859_1_C7=KEY_RIGHT_BRACE + SHIFT_MASK;// 199 Ç     C CEDILLA\nISO_8859_1_C8=KEY_QUOTE + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=KEY_SLASH + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=KEY_D + SHIFT_MASK + RCTRL_MASK;// 208 Ð     ETH\nISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=KEY_COMMA + SHIFT_MASK + RCTRL_MASK;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=KEY_O + SHIFT_MASK + RCTRL_MASK;// 216 Ø     O STROKE\nISO_8859_1_D9=KEY_NON_US_100 + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=KEY_P + RCTRL_MASK + SHIFT_MASK;// 222 Þ     THORN\nISO_8859_1_DF=KEY_S + RCTRL_MASK;// 223 ß     SHARP S\nISO_8859_1_E0=KEY_BACKSLASH;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS\nISO_8859_1_E5=RING_ABOVE_BITS + KEY_A;// 229 å     a RING ABOVE\nISO_8859_1_E6=KEY_A + RCTRL_MASK;// 230 æ     ae\nISO_8859_1_E7=KEY_RIGHT_BRACE;// 231 ç     c CEDILLA\nISO_8859_1_E8=KEY_QUOTE;// 232 è     e GRAVE\nISO_8859_1_E9=KEY_SLASH;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=KEY_D + RCTRL_MASK;// 240 ð     ETH\nISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE\nISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS\nISO_8859_1_F7=KEY_PERIOD + SHIFT_MASK + RCTRL_MASK;// 247 ÷     DIVISION\nISO_8859_1_F8=KEY_O + RCTRL_MASK;// 248 ø     o STROKE\nISO_8859_1_F9=KEY_NON_US_100;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=KEY_P + RCTRL_MASK;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\n\n// LAYOUT_CANADIAN_MULTILINGUAL\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_UNITED_KINGDOM) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nKEYCODE_MASK=0x00FF;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_BACKSLASH;// 35 #\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_7 + SHIFT_MASK;// 38 &\nASCII_27=KEY_QUOTE;// 39 '\nASCII_28=KEY_9 + SHIFT_MASK;// 40 (\nASCII_29=KEY_0 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_8 + SHIFT_MASK;// 42 *\nASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_MINUS;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_SLASH;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :\nASCII_3B=KEY_SEMICOLON;// 59 ;\nASCII_3C=KEY_COMMA + SHIFT_MASK;// 60 <\nASCII_3D=KEY_EQUAL;// 61 =\nASCII_3E=KEY_PERIOD + SHIFT_MASK;// 62 >\nASCII_3F=KEY_SLASH + SHIFT_MASK;// 63 ?\nASCII_40=KEY_QUOTE + SHIFT_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_LEFT_BRACE;// 91 [\nASCII_5C=KEY_NON_US_100;// 92\nASCII_5D=KEY_RIGHT_BRACE;// 93 ]\nASCII_5E=KEY_6 + SHIFT_MASK;// 94 ^\nASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _\nASCII_60=KEY_TILDE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_LEFT_BRACE + SHIFT_MASK;// 123 {\nASCII_7C=KEY_NON_US_100 + SHIFT_MASK;// 124 |\nASCII_7D=KEY_RIGHT_BRACE + SHIFT_MASK;// 125 }\nASCII_7E=KEY_BACKSLASH + SHIFT_MASK;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\n\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_3 + SHIFT_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=0;// 164 ¤     Currency or Euro Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=KEY_TILDE + ALTGR_MASK;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=0;// 167 §     SECTION SIGN\nISO_8859_1_A8=0;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=KEY_TILDE + SHIFT_MASK;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=0;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=0;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=0;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=0;// 192 À     A GRAVE\nISO_8859_1_C1=KEY_A + ALTGR_MASK + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=0;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=0;// 195 Ã     A TILDE\nISO_8859_1_C4=0;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=0;// 200 È     E GRAVE\nISO_8859_1_C9=KEY_E + ALTGR_MASK + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=0;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=0;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=0;// 204 Ì     I GRAVE\nISO_8859_1_CD=KEY_I + ALTGR_MASK + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=0;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=0;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=0;// 209 Ñ     N TILDE\nISO_8859_1_D2=0;// 210 Ò     O GRAVE\nISO_8859_1_D3=KEY_O + ALTGR_MASK + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=0;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=0;// 213 Õ     O TILDE\nISO_8859_1_D6=0;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=0;// 217 Ù     U GRAVE\nISO_8859_1_DA=KEY_U + ALTGR_MASK + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=0;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=0;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=0;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=0;// 223 ß     SHARP S\nISO_8859_1_E0=0;// 224 à     a GRAVE\nISO_8859_1_E1=KEY_A + ALTGR_MASK;// 225 á     a ACUTE\nISO_8859_1_E2=0;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=0;// 227 ã     a TILDE\nISO_8859_1_E4=0;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=0;// 231 ç     c CEDILLA\nISO_8859_1_E8=0;// 232 è     e GRAVE\nISO_8859_1_E9=KEY_E + ALTGR_MASK;// 233 é     e ACUTE\nISO_8859_1_EA=0;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=0;// 235 ë     e DIAERESIS\nISO_8859_1_EC=0;// 236 ì     i GRAVE\nISO_8859_1_ED=KEY_I + ALTGR_MASK;// 237 í     i ACUTE\nISO_8859_1_EE=0;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=0;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=0;// 241 ñ     n TILDE\nISO_8859_1_F2=0;// 242 ò     o GRAVE\nISO_8859_1_F3=KEY_O + ALTGR_MASK;// 243 ó     o ACUTE\nISO_8859_1_F4=0;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=0;// 245 õ     o TILDE\nISO_8859_1_F6=0;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=0;// 249 ù     u GRAVE\nISO_8859_1_FA=KEY_U + ALTGR_MASK;// 250 ú     u ACUTE\nISO_8859_1_FB=0;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=0;// 252 ü     u DIAERESIS\nISO_8859_1_FD=0;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=0;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_4 + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_4 + ALTGR_MASK;// 20AC €    Euro Sign\n\n// LAYOUT_UNITED_KINGDOM\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_FINNISH) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nACUTE_ACCENT_BITS=0x0200;\nGRAVE_ACCENT_BITS=0x0300;\nTILDE_BITS=0x0400;\nDIAERESIS_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_RIGHT_BRACE + SHIFT_MASK;\nDEADKEY_ACUTE_ACCENT=KEY_EQUAL;\nDEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;\nDEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_RIGHT_BRACE;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + SHIFT_MASK;// 35 #\nASCII_24=KEY_4 + ALTGR_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_BACKSLASH;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_BACKSLASH + SHIFT_MASK;// 42 *\nASCII_2B=KEY_MINUS;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_2 + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_8 + ALTGR_MASK;// 91 [\nASCII_5C=KEY_MINUS + ALTGR_MASK;// 92\nASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_7 + ALTGR_MASK;// 123 {\nASCII_7C=KEY_NON_US_100 + ALTGR_MASK;// 124 |\nASCII_7D=KEY_0 + ALTGR_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\nISO_8859_1_A0=KEY_SPACE + ALTGR_MASK;// 160       Nonbreakng Space\nISO_8859_1_A1=KEY_1 + SHIFT_MASK + ALTGR_MASK;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=KEY_4 + SHIFT_MASK;// 164 ¤     Currency or Euro Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_TILDE;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=KEY_4 + ALTGR_MASK + SHIFT_MASK;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN\nISO_8859_1_AD=KEY_SLASH + ALTGR_MASK;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=KEY_0 + ALTGR_MASK + SHIFT_MASK;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=KEY_X + ALTGR_MASK + SHIFT_MASK;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=KEY_3 + ALTGR_MASK + SHIFT_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=KEY_TILDE + SHIFT_MASK;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=KEY_MINUS + ALTGR_MASK + SHIFT_MASK;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=KEY_QUOTE + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=KEY_LEFT_BRACE + SHIFT_MASK;// 197 Å     A RING ABOVE\nISO_8859_1_C6=KEY_QUOTE + ALTGR_MASK + SHIFT_MASK;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð     ETH\nISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=KEY_SEMICOLON + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=KEY_X + ALTGR_MASK;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=KEY_SEMICOLON + ALTGR_MASK + SHIFT_MASK;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ     THORN\nISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE\nISO_8859_1_E4=KEY_QUOTE;// 228 ä     a DIAERESIS\nISO_8859_1_E5=KEY_LEFT_BRACE;// 229 å     a RING ABOVE\nISO_8859_1_E6=KEY_QUOTE + ALTGR_MASK;// 230 æ     ae\nISO_8859_1_E7=0;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð     ETH\nISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE\nISO_8859_1_F6=KEY_SEMICOLON;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=KEY_SEMICOLON + ALTGR_MASK;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign\n// TODO: Finnish Multilingual layout can type many more glyphs\n// but we currently don't have tables tables to store them...\n\n// LAYOUT_FINNISH\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_FRENCH) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nGRAVE_ACCENT_BITS=0x0200;\nDIAERESIS_BITS=0x0300;\nTILDE_BITS=0x0400;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_LEFT_BRACE;\nDEADKEY_GRAVE_ACCENT=KEY_7 + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_LEFT_BRACE + SHIFT_MASK;\nDEADKEY_TILDE=KEY_2 + ALTGR_MASK;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_SLASH;// 33 !\nASCII_22=KEY_3;// 34 \"\nASCII_23=KEY_3 + ALTGR_MASK;// 35 #\nASCII_24=KEY_RIGHT_BRACE;// 36 $\nASCII_25=KEY_QUOTE + SHIFT_MASK;// 37 %\nASCII_26=KEY_1;// 38 &\nASCII_27=KEY_4;// 39 '\nASCII_28=KEY_5;// 40 (\nASCII_29=KEY_MINUS;// 41 )\nASCII_2A=KEY_BACKSLASH;// 42 *\nASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +\nASCII_2C=KEY_M;// 44 ,\nASCII_2D=KEY_6;// 45 -\nASCII_2E=KEY_COMMA + SHIFT_MASK;// 46 .\nASCII_2F=KEY_PERIOD + SHIFT_MASK;// 47 /\nASCII_30=KEY_0 + SHIFT_MASK;// 48 0\nASCII_31=KEY_1 + SHIFT_MASK;// 49 1\nASCII_32=KEY_2 + SHIFT_MASK;// 50 2\nASCII_33=KEY_3 + SHIFT_MASK;// 51 3\nASCII_34=KEY_4 + SHIFT_MASK;// 52 4\nASCII_35=KEY_5 + SHIFT_MASK;// 53 5\nASCII_36=KEY_6 + SHIFT_MASK;// 54 6\nASCII_37=KEY_7 + SHIFT_MASK;// 55 7\nASCII_38=KEY_8 + SHIFT_MASK;// 55 8\nASCII_39=KEY_9 + SHIFT_MASK;// 57 9\nASCII_3A=KEY_PERIOD;// 58 :\nASCII_3B=KEY_COMMA;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_EQUAL;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_M + SHIFT_MASK;// 63 ?\nASCII_40=KEY_0 + ALTGR_MASK;// 64 @\nASCII_41=KEY_Q + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_SEMICOLON + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_A + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_Z + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_W + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_5 + ALTGR_MASK;// 91 [\nASCII_5C=KEY_8 + ALTGR_MASK;// 92\nASCII_5D=KEY_MINUS + ALTGR_MASK;// 93 ]\nASCII_5E=KEY_9 + ALTGR_MASK;// 94 ^\nASCII_5F=KEY_8;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_Q;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_SEMICOLON;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_A;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_Z;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_W;// 122 z\nASCII_7B=KEY_4 + ALTGR_MASK;// 123 {\nASCII_7C=KEY_6 + ALTGR_MASK;// 124 |\nASCII_7D=KEY_EQUAL + ALTGR_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_RIGHT_BRACE + SHIFT_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=KEY_RIGHT_BRACE + ALTGR_MASK;// 164 ¤     Currency or Euro Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_SLASH + SHIFT_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=KEY_MINUS + SHIFT_MASK;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=KEY_TILDE;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=0;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=KEY_BACKSLASH + SHIFT_MASK;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_Q + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=0;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_Q + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_Q + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_Q + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=0;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=0;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=0;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=0;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=0;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=0;// 223 ß     SHARP S\nISO_8859_1_E0=KEY_0;// 224 à     a GRAVE\nISO_8859_1_E1=0;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_Q;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_Q;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_Q;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=KEY_9;// 231 ç     c CEDILLA\nISO_8859_1_E8=KEY_7;// 232 è     e GRAVE\nISO_8859_1_E9=KEY_2;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=0;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=0;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE\nISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=KEY_SEMICOLON;// 249 ù     u GRAVE\nISO_8859_1_FA=0;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=0;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign\n\n// LAYOUT_FRENCH\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_DANISH || KeyboardLayout[0] == LAYOUT_DANISH_MAC) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nACUTE_ACCENT_BITS=0x0200;\nGRAVE_ACCENT_BITS=0x0300;\nTILDE_BITS=0x0400;\nDIAERESIS_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_RIGHT_BRACE + SHIFT_MASK;\nDEADKEY_ACUTE_ACCENT=KEY_EQUAL;\nDEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;\nDEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_RIGHT_BRACE;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + SHIFT_MASK;// 35 #\nASCII_24=KEY_4 + ALTGR_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_BACKSLASH;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_BACKSLASH + SHIFT_MASK;// 42 *\nASCII_2B=KEY_MINUS;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_2 + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_8 + ALTGR_MASK;// 91 [\nASCII_5C=KEY_NON_US_100 + ALTGR_MASK;// 92\nASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_7 + ALTGR_MASK;// 123 {\nASCII_7C=KEY_EQUAL + ALTGR_MASK;// 124 |\nASCII_7D=KEY_0 + ALTGR_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\n\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=KEY_4 + SHIFT_MASK;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_TILDE + SHIFT_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=KEY_4;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=0;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=KEY_TILDE;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=KEY_LEFT_BRACE + SHIFT_MASK;// 197 Å     A RING ABOVE\nISO_8859_1_C6=KEY_SEMICOLON + SHIFT_MASK;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð     ETH\nISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=KEY_QUOTE + SHIFT_MASK;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ     THORN\nISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS\nISO_8859_1_E5=KEY_LEFT_BRACE;// 229 å     a RING ABOVE\nISO_8859_1_E6=KEY_SEMICOLON;// 230 æ     ae\nISO_8859_1_E7=0;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð     ETH\nISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE\nISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=KEY_QUOTE;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign\n\n if (KeyboardLayout[0] == LAYOUT_DANISH_MAC) {\n    ASCII_24=KEY_3 + SHIFT_MASK + ALTGR_MASK;// 36 $\n    ASCII_3C=KEY_TILDE;// 60 <\n\tASCII_3E=KEY_TILDE + SHIFT_MASK;// 62 >\n    ASCII_40=KEY_BACKSLASH + ALTGR_MASK;// 64 @\n\tASCII_5C=KEY_7 + ALTGR_MASK + SHIFT_MASK;// 92 \\\n\tASCII_7B=KEY_8 + ALTGR_MASK + SHIFT_MASK;// 123 {\n\tASCII_7D=KEY_9 + ALTGR_MASK + SHIFT_MASK;// 125 }\n    ISO_8859_1_A1=KEY_1 + ALTGR_MASK;// 161 ¡     Inverted Exclamation\n    ISO_8859_1_A2=KEY_4 + ALTGR_MASK + SHIFT_MASK;// 162 ¢     Cent SIGN\n    ISO_8859_1_A3=KEY_4 + ALTGR_MASK;// 163 £     Pound Sign\n    ISO_8859_1_A5=KEY_Y + ALTGR_MASK;// 165 ¥     YEN SIGN\n    ISO_8859_1_A7=0;// 167 §     SECTION SIGN??\n    ISO_8859_1_A9=KEY_G + ALTGR_MASK;// 169 ©     COPYRIGHT SIGN\n    ISO_8859_1_AA=KEY_A + ALTGR_MASK;// 170 ª     FEMININE ORDINAL\n    ISO_8859_1_AB=KEY_H + ALTGR_MASK;// 171 «     LEFT DOUBLE ANGLE QUOTE\n    ISO_8859_1_AC=KEY_L + ALTGR_MASK;// 172 ¬     NOT SIGN\n    ISO_8859_1_AE=KEY_R + ALTGR_MASK;// 174 ®     REGISTERED SIGN\n    ISO_8859_1_AF=KEY_0 + SHIFT_MASK + ALTGR_MASK;// 175 ¯     MACRON\n    ISO_8859_1_B0=KEY_Q + ALTGR_MASK;// 176 °     DEGREE SIGN\n    ISO_8859_1_B1=KEY_MINUS + ALTGR_MASK;// 177 ±     PLUS-MINUS SIGN\n    ISO_8859_1_B6=KEY_7 + ALTGR_MASK;// 182 ¶     PILCROW SIGN\n    ISO_8859_1_B7=KEY_PERIOD + ALTGR_MASK;// 183 ·     MIDDLE DOT\n    ISO_8859_1_BA=KEY_BACKSLASH + SHIFT_MASK + ALTGR_MASK;// 186 º     MASCULINE ORDINAL\n    ISO_8859_1_BB=KEY_H + SHIFT_MASK + ALTGR_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE\n    ISO_8859_1_BF=KEY_MINUS + SHIFT_MASK + ALTGR_MASK;// 191 ¿     INVERTED QUESTION MARK\n    ISO_8859_1_C7=KEY_C + ALTGR_MASK + SHIFT_MASK;// 199 Ç     C CEDILLA\n    ISO_8859_1_D0=0;// 208 Ð     ETH\n    ISO_8859_1_DE=0;// 222 Þ     THORN\n    ISO_8859_1_E7=KEY_C + ALTGR_MASK;// 231 ç     c CEDILLA\n    ISO_8859_1_FE=0;// 254 þ     THORN\n }\n// LAYOUT_DANISH\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_NORWEGIAN) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nACUTE_ACCENT_BITS=0x0200;\nGRAVE_ACCENT_BITS=0x0300;\nTILDE_BITS=0x0400;\nDIAERESIS_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_RIGHT_BRACE + SHIFT_MASK;\nDEADKEY_ACUTE_ACCENT=KEY_EQUAL + ALTGR_MASK;\nDEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;\nDEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_RIGHT_BRACE;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + SHIFT_MASK;// 35 #\nASCII_24=KEY_4 + ALTGR_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_BACKSLASH;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_BACKSLASH + SHIFT_MASK;// 42 *\nASCII_2B=KEY_MINUS;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_2 + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_8 + ALTGR_MASK;// 91 [\nASCII_5C=KEY_EQUAL;// 92\nASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_7 + ALTGR_MASK;// 123 {\nASCII_7C=KEY_TILDE;// 124 |\nASCII_7D=KEY_0 + ALTGR_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\n\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=KEY_4 + SHIFT_MASK;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_TILDE + SHIFT_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=KEY_4;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=0;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=KEY_TILDE;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=KEY_LEFT_BRACE + SHIFT_MASK;// 197 Å     A RING ABOVE\nISO_8859_1_C6=KEY_QUOTE + SHIFT_MASK;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð     ETH\nISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=KEY_SEMICOLON + SHIFT_MASK;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ     THORN\nISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS\nISO_8859_1_E5=KEY_LEFT_BRACE;// 229 å     a RING ABOVE\nISO_8859_1_E6=KEY_QUOTE;// 230 æ     ae\nISO_8859_1_E7=0;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð     ETH\nISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE\nISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=KEY_SEMICOLON;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign\n\n// LAYOUT_NORWEGIAN\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_SWEDISH) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nACUTE_ACCENT_BITS=0x0200;\nGRAVE_ACCENT_BITS=0x0300;\nTILDE_BITS=0x0400;\nDIAERESIS_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_RIGHT_BRACE + SHIFT_MASK;\nDEADKEY_ACUTE_ACCENT=KEY_EQUAL;\nDEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;\nDEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_RIGHT_BRACE;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + SHIFT_MASK;// 35 #\nASCII_24=KEY_4 + ALTGR_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_BACKSLASH;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_BACKSLASH + SHIFT_MASK;// 42 *\nASCII_2B=KEY_MINUS;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_2 + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_8 + ALTGR_MASK;// 91 [\nASCII_5C=KEY_MINUS + ALTGR_MASK;// 92\nASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_7 + ALTGR_MASK;// 123 {\nASCII_7C=KEY_NON_US_100 + ALTGR_MASK;// 124 |\nASCII_7D=KEY_0 + ALTGR_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\n\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=KEY_4 + SHIFT_MASK;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_TILDE;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=KEY_4;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=0;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=KEY_TILDE + SHIFT_MASK;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=KEY_QUOTE + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=KEY_LEFT_BRACE + SHIFT_MASK;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=KEY_D + ALTGR_MASK + SHIFT_MASK;// 208 Ð     ETH\nISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=KEY_SEMICOLON + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=KEY_T + ALTGR_MASK + SHIFT_MASK;// 222 Þ     THORN\nISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE\nISO_8859_1_E4=KEY_QUOTE;// 228 ä     a DIAERESIS\nISO_8859_1_E5=KEY_LEFT_BRACE;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=0;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=KEY_D + ALTGR_MASK;// 240 ð     ETH\nISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE\nISO_8859_1_F6=KEY_SEMICOLON;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=KEY_T + ALTGR_MASK;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign\n\n// LAYOUT_SWEDISH\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_SPANISH) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nACUTE_ACCENT_BITS=0x0200;\nGRAVE_ACCENT_BITS=0x0300;\nTILDE_BITS=0x0400;\nDIAERESIS_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_LEFT_BRACE + SHIFT_MASK;\nDEADKEY_ACUTE_ACCENT=KEY_QUOTE;\nDEADKEY_GRAVE_ACCENT=KEY_LEFT_BRACE;\nDEADKEY_TILDE=KEY_4 + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_QUOTE + SHIFT_MASK;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + ALTGR_MASK;// 35 #\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_MINUS;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *\nASCII_2B=KEY_RIGHT_BRACE;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_2 + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_LEFT_BRACE + ALTGR_MASK;// 91 [\nASCII_5C=KEY_TILDE + ALTGR_MASK;// 92\nASCII_5D=KEY_RIGHT_BRACE + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_QUOTE + ALTGR_MASK;// 123 {\nASCII_7C=KEY_1 + ALTGR_MASK;// 124 |\nASCII_7D=KEY_BACKSLASH + ALTGR_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\n\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=KEY_EQUAL;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent SIGN\nISO_8859_1_A3=0;// 163 £     Pound Sign\nISO_8859_1_A4=0;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=0;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=KEY_TILDE + SHIFT_MASK;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=KEY_6 + ALTGR_MASK;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=0;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=0;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=KEY_3 + SHIFT_MASK;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=KEY_TILDE;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=KEY_EQUAL;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=KEY_BACKSLASH + SHIFT_MASK;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=KEY_SEMICOLON + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=0;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=KEY_BACKSLASH;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=KEY_SEMICOLON;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE\nISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_5 + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_5 + ALTGR_MASK;// 20AC €    Euro Sign\n\n// LAYOUT_SPANISH\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_PORTUGUESE) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nACUTE_ACCENT_BITS=0x0200;\nGRAVE_ACCENT_BITS=0x0300;\nTILDE_BITS=0x0400;\nDIAERESIS_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_BACKSLASH;\nDEADKEY_ACUTE_ACCENT=KEY_RIGHT_BRACE + SHIFT_MASK;\nDEADKEY_GRAVE_ACCENT=KEY_RIGHT_BRACE + SHIFT_MASK;\nDEADKEY_TILDE=KEY_BACKSLASH;\nDEADKEY_DIAERESIS=KEY_LEFT_BRACE + SHIFT_MASK;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + ALTGR_MASK;// 35 #\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_MINUS;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_LEFT_BRACE + SHIFT_MASK;// 42 *\nASCII_2B=KEY_LEFT_BRACE;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_2 + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_8 + ALTGR_MASK;// 91 [\nASCII_5C=KEY_TILDE + ALTGR_MASK;// 92\nASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_7 + ALTGR_MASK;// 123 {\nASCII_7C=KEY_TILDE + SHIFT_MASK;// 124 |\nASCII_7D=KEY_0 + ALTGR_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\n\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_3 + ALTGR_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=0;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_4 + ALTGR_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=KEY_QUOTE + SHIFT_MASK;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=KEY_EQUAL;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=0;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=0;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=KEY_QUOTE;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=KEY_EQUAL + SHIFT_MASK;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=KEY_SEMICOLON + SHIFT_MASK;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=0;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=KEY_SEMICOLON;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE\nISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign\n\n// LAYOUT_PORTUGUESE\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_ITALIAN) {\n\nSHIFT_MASK=0x40;\nALTGR_MASK=0x80;\nKEYCODE_MASK=0x00FF;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_QUOTE + ALTGR_MASK;// 35 #\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_MINUS;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *\nASCII_2B=KEY_RIGHT_BRACE;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_SEMICOLON + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_LEFT_BRACE + ALTGR_MASK;// 91 [\nASCII_5C=KEY_TILDE;// 92\nASCII_5D=KEY_RIGHT_BRACE + ALTGR_MASK;// 93 ]\nASCII_5E=KEY_EQUAL + SHIFT_MASK;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=0;// 96 `  (how to type this on Italian?)\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_LEFT_BRACE + SHIFT_MASK + ALTGR_MASK; // 123 {\nASCII_7C=KEY_TILDE + SHIFT_MASK;// 124 |\nASCII_7D=KEY_RIGHT_BRACE + SHIFT_MASK + ALTGR_MASK; // 125 }\nASCII_7E=0;// 126 ~   (how to type this on Italian?)\nASCII_7F=KEY_BACKSPACE;// 127\n\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent Sign\nISO_8859_1_A3=KEY_3 + SHIFT_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=0;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_BACKSLASH + SHIFT_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=0;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=KEY_QUOTE + SHIFT_MASK;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=0;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=0;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=0;// 192 À     A GRAVE\nISO_8859_1_C1=0;// 193 Á     A ACUTE\nISO_8859_1_C2=0;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=0;// 195 Ã     A TILDE\nISO_8859_1_C4=0;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=0;// 200 È     E GRAVE\nISO_8859_1_C9=0;// 201 É     E ACUTE\nISO_8859_1_CA=0;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=0;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=0;// 204 Ì     I GRAVE\nISO_8859_1_CD=0;// 205 Í     I ACUTE\nISO_8859_1_CE=0;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=0;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=0;// 209 Ñ     N TILDE\nISO_8859_1_D2=0;// 210 Ò     O GRAVE\nISO_8859_1_D3=0;// 211 Ó     O ACUTE\nISO_8859_1_D4=0;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=0;// 213 Õ     O TILDE\nISO_8859_1_D6=0;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=0;// 217 Ù     U GRAVE\nISO_8859_1_DA=0;// 218 Ú     U ACUTE\nISO_8859_1_DB=0;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=0;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=0;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=0;// 223 ß     SHARP S\nISO_8859_1_E0=KEY_QUOTE;// 224 à     a GRAVE\nISO_8859_1_E1=0;// 225 á     a ACUTE\nISO_8859_1_E2=0;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=0;// 227 ã     a TILDE\nISO_8859_1_E4=0;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=KEY_SEMICOLON + SHIFT_MASK;// 231 ç     c CEDILLA\nISO_8859_1_E8=KEY_LEFT_BRACE;// 232 è     e GRAVE\nISO_8859_1_E9=KEY_LEFT_BRACE + SHIFT_MASK;// 233 é     e ACUTE\nISO_8859_1_EA=0;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=0;// 235 ë     e DIAERESIS\nISO_8859_1_EC=KEY_EQUAL;// 236 ì     i GRAVE\nISO_8859_1_ED=0;// 237 í     i ACUTE\nISO_8859_1_EE=0;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=0;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=0;// 241 ñ     n TILDE\nISO_8859_1_F2=KEY_SEMICOLON;// 242 ò     o GRAVE\nISO_8859_1_F3=0;// 243 ó     o ACUTE\nISO_8859_1_F4=0;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=0;// 245 õ     o TILDE\nISO_8859_1_F6=0;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=KEY_BACKSLASH;// 249 ù     u GRAVE\nISO_8859_1_FA=0;// 250 ú     u ACUTE\nISO_8859_1_FB=0;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=0;// 252 ü     u DIAERESIS\nISO_8859_1_FD=0;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=0;// 255 ÿ     y DIAERESIS\n\n// LAYOUT_ITALIAN\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_PORTUGUESE_BRAZILIAN) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nACUTE_ACCENT_BITS=0x0200;\nGRAVE_ACCENT_BITS=0x0300;\nTILDE_BITS=0x0400;\nDIAERESIS_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_QUOTE + SHIFT_MASK;\nDEADKEY_ACUTE_ACCENT=KEY_LEFT_BRACE;\nDEADKEY_GRAVE_ACCENT=KEY_LEFT_BRACE + SHIFT_MASK;\nDEADKEY_TILDE=KEY_QUOTE;\nDEADKEY_DIAERESIS=KEY_6 + SHIFT_MASK;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_TILDE + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + ALTGR_MASK;// 35 #\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_7 + SHIFT_MASK;// 38 &\nASCII_27=KEY_TILDE;// 39 '\nASCII_28=KEY_9 + SHIFT_MASK;// 40 (\nASCII_29=KEY_0 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_7 + SHIFT_MASK;// 42 *\nASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_MINUS;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_Q + ALTGR_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_SLASH + SHIFT_MASK;// 58 :\nASCII_3B=KEY_SLASH;// 59 ;\nASCII_3C=KEY_COMMA + SHIFT_MASK;// 60 <\nASCII_3D=KEY_EQUAL;// 61 =\nASCII_3E=KEY_PERIOD + SHIFT_MASK;// 62 >\nASCII_3F=KEY_W + ALTGR_MASK;// 63 ?\nASCII_40=KEY_2 + SHIFT_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_RIGHT_BRACE;// 91 [\nASCII_5C=KEY_NON_US_100;// 92\nASCII_5D=KEY_BACKSLASH;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_RIGHT_BRACE + SHIFT_MASK;// 123 {\nASCII_7C=KEY_NON_US_100 + SHIFT_MASK;// 124 |\nASCII_7D=KEY_BACKSLASH + SHIFT_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\n\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=KEY_5 + ALTGR_MASK;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_4 + ALTGR_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=0;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_EQUAL + ALTGR_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=KEY_RIGHT_BRACE + ALTGR_MASK;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=KEY_6 + ALTGR_MASK;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=KEY_E + ALTGR_MASK;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=KEY_2 + ALTGR_MASK;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=KEY_2 + ALTGR_MASK;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=0;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=KEY_1 + ALTGR_MASK;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=KEY_BACKSLASH + ALTGR_MASK;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=0;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=0;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE\nISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\n\n// LAYOUT_PORTUGUESE_BRAZILIAN\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_FRENCH_BELGIAN) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nGRAVE_ACCENT_BITS=0x0200;\nDIAERESIS_BITS=0x0300;\nTILDE_BITS=0x0400;\nACUTE_ACCENT_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_LEFT_BRACE;\nDEADKEY_ACUTE_ACCENT=KEY_QUOTE + ALTGR_MASK;\nDEADKEY_GRAVE_ACCENT=KEY_BACKSLASH + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_LEFT_BRACE + SHIFT_MASK;\nDEADKEY_TILDE=KEY_SLASH + ALTGR_MASK;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_8;// 33 !\nASCII_22=KEY_3;// 34 \"\nASCII_23=KEY_3 + ALTGR_MASK;// 35 #\nASCII_24=KEY_RIGHT_BRACE;// 36 $\nASCII_25=KEY_QUOTE + SHIFT_MASK;// 37 %\nASCII_26=KEY_1;// 38 &\nASCII_27=KEY_4;// 39 '\nASCII_28=KEY_5;// 40 (\nASCII_29=KEY_MINUS;// 41 )\nASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *\nASCII_2B=KEY_SLASH + SHIFT_MASK;// 43 +\nASCII_2C=KEY_M;// 44 ,\nASCII_2D=KEY_EQUAL;// 45 -\nASCII_2E=KEY_COMMA + SHIFT_MASK;// 46 .\nASCII_2F=KEY_PERIOD + SHIFT_MASK;// 47 /\nASCII_30=KEY_0 + SHIFT_MASK;// 48 0\nASCII_31=KEY_1 + SHIFT_MASK;// 49 1\nASCII_32=KEY_2 + SHIFT_MASK;// 50 2\nASCII_33=KEY_3 + SHIFT_MASK;// 51 3\nASCII_34=KEY_4 + SHIFT_MASK;// 52 4\nASCII_35=KEY_5 + SHIFT_MASK;// 53 5\nASCII_36=KEY_6 + SHIFT_MASK;// 54 6\nASCII_37=KEY_7 + SHIFT_MASK;// 55 7\nASCII_38=KEY_8 + SHIFT_MASK;// 55 8\nASCII_39=KEY_9 + SHIFT_MASK;// 57 9\nASCII_3A=KEY_PERIOD;// 58 :\nASCII_3B=KEY_COMMA;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_SLASH;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_M + SHIFT_MASK;// 63 ?\nASCII_40=KEY_2 + ALTGR_MASK;// 64 @\nASCII_41=KEY_Q + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_SEMICOLON + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_A + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_Z + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_W + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_RIGHT_BRACE + ALTGR_MASK;// 91 [\nASCII_5C=KEY_NON_US_100 + ALTGR_MASK;// 92\nASCII_5D=KEY_LEFT_BRACE + ALTGR_MASK;// 93 ]\nASCII_5E=KEY_6 + ALTGR_MASK;// 94 ^\nASCII_5F=KEY_EQUAL + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_Q;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_SEMICOLON;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_A;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_Z;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_W;// 122 z\nASCII_7B=KEY_9 + ALTGR_MASK;// 123 {\nASCII_7C=KEY_1 + ALTGR_MASK;// 124 |\nASCII_7D=KEY_0 + ALTGR_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_BACKSLASH + SHIFT_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=0;// 164 ¤     Currency or Euro Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_6;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=KEY_MINUS + SHIFT_MASK;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=KEY_TILDE;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=KEY_TILDE + SHIFT_MASK;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=KEY_BACKSLASH;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_Q + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_Q + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_Q + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_Q + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_Q + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=0;// 223 ß     SHARP S\nISO_8859_1_E0=KEY_0;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_Q;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_Q;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_Q;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_Q;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=KEY_9;// 231 ç     c CEDILLA\nISO_8859_1_E8=KEY_7;// 232 è     e GRAVE\nISO_8859_1_E9=KEY_2;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE\nISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=KEY_QUOTE;// 249 ù     u GRAVE - TODO; check FRENCH\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign\n\n// LAYOUT_FRENCH_BELGIAN\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_GERMAN_SWISS) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nGRAVE_ACCENT_BITS=0x0200;\nDIAERESIS_BITS=0x0300;\nTILDE_BITS=0x0400;\nACUTE_ACCENT_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_EQUAL;\nDEADKEY_ACUTE_ACCENT=KEY_MINUS + ALTGR_MASK;\nDEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;\nDEADKEY_DIAERESIS=KEY_RIGHT_BRACE;\nDEADKEY_TILDE=KEY_EQUAL + ALTGR_MASK;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_RIGHT_BRACE + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + ALTGR_MASK;// 35 #\nASCII_24=KEY_BACKSLASH;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_MINUS;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_3 + SHIFT_MASK;// 42 *\nASCII_2B=KEY_1 + SHIFT_MASK;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_2 + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Z + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Y + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_LEFT_BRACE + ALTGR_MASK;// 91 [\nASCII_5C=KEY_NON_US_100 + ALTGR_MASK;// 92\nASCII_5D=KEY_RIGHT_BRACE + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Z;// 121 y\nASCII_7A=KEY_Y;// 122 z\nASCII_7B=KEY_QUOTE + ALTGR_MASK;// 123 {\nASCII_7C=KEY_7 + ALTGR_MASK;// 124 |\nASCII_7D=KEY_BACKSLASH + ALTGR_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=KEY_8 + ALTGR_MASK;// 162 ¢     Cent Sign\nISO_8859_1_A3=KEY_BACKSLASH + SHIFT_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=0;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=KEY_1 + ALTGR_MASK;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_5 + ALTGR_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=KEY_6 + ALTGR_MASK;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=KEY_4 + ALTGR_MASK;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=0;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=0;// 223 ß     SHARP S\nISO_8859_1_E0=KEY_QUOTE + SHIFT_MASK;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE\nISO_8859_1_E4=KEY_QUOTE;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=KEY_4 + SHIFT_MASK;// 231 ç     c CEDILLA\nISO_8859_1_E8=KEY_LEFT_BRACE + SHIFT_MASK;// 232 è     e GRAVE\nISO_8859_1_E9=KEY_SEMICOLON + SHIFT_MASK;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS  TODO: check this\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE\nISO_8859_1_F6=KEY_SEMICOLON;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=KEY_LEFT_BRACE;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign\n\n// LAYOUT_GERMAN_SWISS\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_FRENCH_SWISS) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nGRAVE_ACCENT_BITS=0x0200;\nDIAERESIS_BITS=0x0300;\nTILDE_BITS=0x0400;\nACUTE_ACCENT_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_EQUAL;\nDEADKEY_ACUTE_ACCENT=KEY_MINUS + ALTGR_MASK;\nDEADKEY_GRAVE_ACCENT=KEY_EQUAL + SHIFT_MASK;\nDEADKEY_DIAERESIS=KEY_RIGHT_BRACE;\nDEADKEY_TILDE=KEY_EQUAL + ALTGR_MASK;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_RIGHT_BRACE + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + ALTGR_MASK;// 35 #\nASCII_24=KEY_BACKSLASH;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_MINUS;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_3 + SHIFT_MASK;// 42 *\nASCII_2B=KEY_1 + SHIFT_MASK;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_2 + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Z + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Y + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_LEFT_BRACE + ALTGR_MASK;// 91 [\nASCII_5C=KEY_NON_US_100 + ALTGR_MASK;// 92\nASCII_5D=KEY_RIGHT_BRACE + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Z;// 121 y\nASCII_7A=KEY_Y;// 122 z\nASCII_7B=KEY_QUOTE + ALTGR_MASK;// 123 {\nASCII_7C=KEY_7 + ALTGR_MASK;// 124 |\nASCII_7D=KEY_BACKSLASH + ALTGR_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=KEY_8 + ALTGR_MASK;// 162 ¢     Cent Sign\nISO_8859_1_A3=KEY_BACKSLASH + SHIFT_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=0;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=KEY_1 + ALTGR_MASK;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_5 + ALTGR_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=KEY_6 + ALTGR_MASK;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=KEY_4 + ALTGR_MASK;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=0;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=0;// 223 ß     SHARP S\nISO_8859_1_E0=KEY_QUOTE;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE\nISO_8859_1_E4=KEY_QUOTE + SHIFT_MASK;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=KEY_4 + SHIFT_MASK;// 231 ç     c CEDILLA\nISO_8859_1_E8=KEY_LEFT_BRACE;// 232 è     e GRAVE\nISO_8859_1_E9=KEY_SEMICOLON;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O;// 245 õ     o TILDE\nISO_8859_1_F6=KEY_SEMICOLON + SHIFT_MASK;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=KEY_LEFT_BRACE + SHIFT_MASK;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign\n\n// LAYOUT_FRENCH_SWISS\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_SPANISH_LATIN_AMERICA) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nACUTE_ACCENT_BITS=0x0200;\nGRAVE_ACCENT_BITS=0x0300;\nDIAERESIS_BITS=0x0400;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_QUOTE + ALTGR_MASK;\nDEADKEY_ACUTE_ACCENT=KEY_LEFT_BRACE;\nDEADKEY_GRAVE_ACCENT=KEY_BACKSLASH + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_LEFT_BRACE + SHIFT_MASK;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + ALTGR_MASK;// 35 #\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_MINUS;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_RIGHT_BRACE + SHIFT_MASK;// 42 *\nASCII_2B=KEY_RIGHT_BRACE;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_Q + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_QUOTE + SHIFT_MASK;// 91 [\nASCII_5C=KEY_MINUS + ALTGR_MASK;// 92\nASCII_5D=KEY_BACKSLASH + SHIFT_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_QUOTE;// 123 {\nASCII_7C=KEY_TILDE;// 124 |\nASCII_7D=KEY_BACKSLASH;// 125 }\nASCII_7E=KEY_RIGHT_BRACE + ALTGR_MASK;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\n\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=KEY_EQUAL + SHIFT_MASK;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent SIGN\nISO_8859_1_A3=0;// 163 £     Pound Sign\nISO_8859_1_A4=0;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=0;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=KEY_TILDE + ALTGR_MASK;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=KEY_TILDE + SHIFT_MASK;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=0;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=KEY_EQUAL;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS + KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=0;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=KEY_SEMICOLON + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=0;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=0;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=0;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=0;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=KEY_SEMICOLON;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=0;// 245 õ     o TILDE\nISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\n\n// LAYOUT_SPANISH_LATIN_AMERICA\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_IRISH) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0300;\nGRAVE_ACCENT_BITS=0x0100;\nACUTE_ACCENT_BITS=0x0200;\nKEYCODE_MASK=0x03FF;\nDEADKEY_ACUTE_ACCENT=KEY_QUOTE + ALTGR_MASK;\nDEADKEY_GRAVE_ACCENT=KEY_TILDE;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_BACKSLASH;// 35 #\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_7 + SHIFT_MASK;// 38 &\nASCII_27=KEY_QUOTE;// 39 '\nASCII_28=KEY_9 + SHIFT_MASK;// 40 (\nASCII_29=KEY_0 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_8 + SHIFT_MASK;// 42 *\nASCII_2B=KEY_EQUAL + SHIFT_MASK;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_MINUS;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_SLASH;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_SEMICOLON + SHIFT_MASK;// 58 :\nASCII_3B=KEY_SEMICOLON;// 59 ;\nASCII_3C=KEY_COMMA + SHIFT_MASK;// 60 <\nASCII_3D=KEY_EQUAL;// 61 =\nASCII_3E=KEY_PERIOD + SHIFT_MASK;// 62 >\nASCII_3F=KEY_SLASH + SHIFT_MASK;// 63 ?\nASCII_40=KEY_QUOTE + SHIFT_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_LEFT_BRACE;// 91 [\nASCII_5C=KEY_NON_US_100;// 92\nASCII_5D=KEY_RIGHT_BRACE;// 93 ]\nASCII_5E=KEY_6 + SHIFT_MASK;// 94 ^\nASCII_5F=KEY_MINUS + SHIFT_MASK;// 95 _\nASCII_60=KEY_QUOTE + SHIFT_MASK + ALTGR_MASK;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_LEFT_BRACE + SHIFT_MASK;// 123 {\nASCII_7C=KEY_NON_US_100 + SHIFT_MASK;// 124 |\nASCII_7D=KEY_RIGHT_BRACE + SHIFT_MASK;// 125 }\nASCII_7E=KEY_BACKSLASH + SHIFT_MASK;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\n\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_3 + SHIFT_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=0;// 164 ¤     Currency or Euro Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=KEY_TILDE + ALTGR_MASK;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=0;// 167 §     SECTION SIGN\nISO_8859_1_A8=0;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=KEY_TILDE + SHIFT_MASK;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=0;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=0;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=0;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A;// 192 À     A GRAVE\nISO_8859_1_C1=KEY_A + ALTGR_MASK + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=0;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=0;// 195 Ã     A TILDE\nISO_8859_1_C4=0;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E;// 200 È     E GRAVE\nISO_8859_1_C9=KEY_E + ALTGR_MASK + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=0;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=0;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I;// 204 Ì     I GRAVE\nISO_8859_1_CD=KEY_I + ALTGR_MASK + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=0;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=0;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=0;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O;// 210 Ò     O GRAVE\nISO_8859_1_D3=KEY_O + ALTGR_MASK + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=0;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=0;// 213 Õ     O TILDE\nISO_8859_1_D6=0;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U;// 217 Ù     U GRAVE\nISO_8859_1_DA=KEY_U + ALTGR_MASK + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=0;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=0;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=0;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=KEY_A + ALTGR_MASK;// 225 á     a ACUTE\nISO_8859_1_E2=0;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=0;// 227 ã     a TILDE\nISO_8859_1_E4=0;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=0;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=KEY_E + ALTGR_MASK;// 233 é     e ACUTE\nISO_8859_1_EA=0;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=0;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=KEY_I + ALTGR_MASK;// 237 í     i ACUTE\nISO_8859_1_EE=0;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=0;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=0;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=KEY_O + ALTGR_MASK;// 243 ó     o ACUTE\nISO_8859_1_F4=0;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=0;// 245 õ     o TILDE\nISO_8859_1_F6=0;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=KEY_U + ALTGR_MASK;// 250 ú     u ACUTE\nISO_8859_1_FB=0;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=0;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=0;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_4 + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_4 + ALTGR_MASK;// 20AC €    Euro Sign\n\n// LAYOUT_IRISH\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_ICELANDIC) {\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nACUTE_ACCENT_BITS=0x0200;\nGRAVE_ACCENT_BITS=0x0300;\nDIAERESIS_BITS=0x0400;\nRING_ABOVE_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_QUOTE + ALTGR_MASK;\nDEADKEY_ACUTE_ACCENT=KEY_QUOTE;\nDEADKEY_GRAVE_ACCENT=KEY_BACKSLASH + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_TILDE + SHIFT_MASK;\nDEADKEY_RING_ABOVE=KEY_TILDE;\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + SHIFT_MASK;// 35 #\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_QUOTE + SHIFT_MASK;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_BACKSLASH + SHIFT_MASK;// 42 *\nASCII_2B=KEY_BACKSLASH;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_EQUAL;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_RIGHT_BRACE + SHIFT_MASK;// 63 ?\nASCII_40=KEY_Q + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_8 + ALTGR_MASK;// 91 [\nASCII_5C=KEY_MINUS + ALTGR_MASK;// 92\nASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_EQUAL + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_7 + ALTGR_MASK;// 123 {\nASCII_7C=KEY_NON_US_100 + ALTGR_MASK;// 124 |\nASCII_7D=KEY_0 + ALTGR_MASK;// 125 }\nASCII_7E=KEY_RIGHT_BRACE + ALTGR_MASK;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\n\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent SIGN\nISO_8859_1_A3=0;// 163 £     Pound Sign\nISO_8859_1_A4=0;// 164 ¤     Currency or Euro Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR;??\nISO_8859_1_A7=0;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN;??\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=KEY_TILDE + ALTGR_MASK;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=KEY_M + ALTGR_MASK;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + ALTGR_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=0;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=RING_ABOVE_BITS + KEY_A + SHIFT_MASK;// 197 Å     A RING ABOVE\nISO_8859_1_C6=KEY_SEMICOLON + SHIFT_MASK;// 198 Æ     AE\nISO_8859_1_C7=0;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=KEY_LEFT_BRACE + SHIFT_MASK;// 208 Ð     ETH\nISO_8859_1_D1=0;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=0;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=KEY_SLASH + SHIFT_MASK;// 222 Þ     THORN\nISO_8859_1_DF=0;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=0;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS\nISO_8859_1_E5=RING_ABOVE_BITS + KEY_A;// 229 å     a RING ABOVE\nISO_8859_1_E6=KEY_SEMICOLON;// 230 æ     ae\nISO_8859_1_E7=0;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=KEY_LEFT_BRACE;// 240 ð     ETH\nISO_8859_1_F1=0;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=0;// 245 õ     o TILDE\nISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=KEY_SLASH;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_5 + ALTGR_MASK;//     €     Euro Sign\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_5 + ALTGR_MASK;// 20AC €    Euro Sign\n\n // LAYOUT_ICELANDIC\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_TURKISH) {\n// http://forum.pjrc.com/threads/18781-Turkish-Language-Support\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0700;\nCIRCUMFLEX_BITS=0x0100;\nACUTE_ACCENT_BITS=0x0200;\nGRAVE_ACCENT_BITS=0x0300;\nTILDE_BITS=0x0400;\nDIAERESIS_BITS=0x0500;\nKEYCODE_MASK=0x07FF;\nDEADKEY_CIRCUMFLEX=KEY_3 + SHIFT_MASK;\nDEADKEY_ACUTE_ACCENT=KEY_SEMICOLON + ALTGR_MASK;\nDEADKEY_GRAVE_ACCENT=KEY_BACKSLASH + ALTGR_MASK;\nDEADKEY_TILDE=KEY_RIGHT_BRACE + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_LEFT_BRACE + ALTGR_MASK;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_TILDE;// 34 \"\nASCII_23=KEY_3 + ALTGR_MASK;// 35 #\nASCII_24=KEY_4 + ALTGR_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_2 + SHIFT_MASK;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_MINUS;// 42 *\nASCII_2B=KEY_4 + SHIFT_MASK;// 43 +\nASCII_2C=KEY_BACKSLASH;// 44 ,\nASCII_2D=KEY_EQUAL;// 45 -\nASCII_2E=KEY_SLASH;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_SLASH + SHIFT_MASK;// 58 :\nASCII_3B=KEY_BACKSLASH + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_TILDE + ALTGR_MASK;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_1 + ALTGR_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_Q + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Y + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Z + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_8 + ALTGR_MASK;// 91 [\nASCII_5C=KEY_MINUS + ALTGR_MASK;// 92\nASCII_5D=KEY_9 + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_EQUAL + SHIFT_MASK;// 95 _\nASCII_60=GRAVE_ACCENT_BITS + KEY_SPACE;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_QUOTE;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Y;// 121 y\nASCII_7A=KEY_Z;// 122 z\nASCII_7B=KEY_7 + ALTGR_MASK;// 123 {\nASCII_7C=KEY_EQUAL + ALTGR_MASK;// 124 |\nASCII_7D=KEY_0 + ALTGR_MASK;// 125 }\nASCII_7E=TILDE_BITS + KEY_SPACE;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\n\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent SIGN\nISO_8859_1_A3=KEY_2 + ALTGR_MASK;// 163 £     Pound Sign\nISO_8859_1_A4=0;// 164 ¤     Currency or Euro Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR;??\nISO_8859_1_A7=0;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN;??\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=0;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=0;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=0;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=KEY_5 + ALTGR_MASK;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=GRAVE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=TILDE_BITS + KEY_A + SHIFT_MASK;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=KEY_A + ALTGR_MASK;// 198 Æ     AE\nISO_8859_1_C7=KEY_PERIOD + SHIFT_MASK;// 199 Ç     C CEDILLA\nISO_8859_1_C8=GRAVE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=GRAVE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=TILDE_BITS + KEY_N + SHIFT_MASK;// 209 Ñ     N TILDE\nISO_8859_1_D2=GRAVE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=TILDE_BITS + KEY_O + SHIFT_MASK;// 213 Õ     O TILDE\nISO_8859_1_D6=KEY_COMMA + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=0;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=GRAVE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=KEY_RIGHT_BRACE + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Y + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=KEY_S + ALTGR_MASK;// 223 ß     SHARP S\nISO_8859_1_E0=GRAVE_ACCENT_BITS + KEY_A;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=TILDE_BITS + KEY_A;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=KEY_PERIOD;// 231 ç     c CEDILLA\nISO_8859_1_E8=GRAVE_ACCENT_BITS + KEY_E;// 232 è     e GRAVE\nISO_8859_1_E9=KEY_TILDE + SHIFT_MASK;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=GRAVE_ACCENT_BITS + KEY_I;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=TILDE_BITS + KEY_N;// 241 ñ     n TILDE\nISO_8859_1_F2=GRAVE_ACCENT_BITS + KEY_O;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=TILDE_BITS + KEY_O ;// 245 õ     o TILDE\nISO_8859_1_F6=KEY_COMMA;// 246 ö     o DIAERESIS\nISO_8859_1_F7=0;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=GRAVE_ACCENT_BITS + KEY_U;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=KEY_RIGHT_BRACE;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Y;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=DIAERESIS_BITS + KEY_Y;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n\n// not yet implemented\nUNICODE_EXTRA00=0x20AC;\nKEYCODE_EXTRA00=KEY_E + ALTGR_MASK;// 20AC €    Euro Sign\nUNICODE_EXTRA01=0x011E;\nKEYCODE_EXTRA01=KEY_LEFT_BRACE + SHIFT_MASK;// 011E Ğ    Latin capital letter G with breve\nUNICODE_EXTRA02=0x011F;\nKEYCODE_EXTRA02=KEY_LEFT_BRACE;// 011F ğ    Latin small letter g with breve\nUNICODE_EXTRA03=0x0130;\nKEYCODE_EXTRA03=KEY_QUOTE + SHIFT_MASK;// 0130 İ    Latin captial letter I with dot above\nUNICODE_EXTRA04=0x0131;\nKEYCODE_EXTRA04=KEY_I;// 0131 ı    Latin small letter dotless i\nUNICODE_EXTRA05=0x015E;\nKEYCODE_EXTRA05=KEY_SEMICOLON + SHIFT_MASK;// 015E Ş    Latin capital letter S with cedilla\nUNICODE_EXTRA06=0x0151;\nKEYCODE_EXTRA06=KEY_SEMICOLON;// 0151 ş    Latin small letter s with cedilla\n\n// LAYOUT_TURKISH\n\n}\n\nelse if (KeyboardLayout[0] ==  LAYOUT_CZECH) {\n// http://forum.pjrc.com/threads/24495-Czech-keyboard\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0F00;\nACUTE_ACCENT_BITS=0x0100;  // TODO: the Czech might not support some\nDEGREE_SIGN_BITS=0x0200;  // of these deadkeys, perhaps not any???\nCARON_BITS=0x0300;\n//CIRCUMFLEX_BITS=0x0400;\nBREVE_BITS=0x0500;\nOGONEK_BITS=0x0600;\n//GRAVE_ACCENT_BITS=0x0700\nDOT_ABOVE_BITS=0x0800;\nDOUBLE_ACUTE_BITS=0x0900;\n//DIAERESIS_BITS=0x0A00\nCEDILLA_BITS=0x0B00;\nKEYCODE_MASK=0x0FFF;\nDEADKEY_ACUTE_ACCENT=KEY_EQUAL;  // TODO: is it KEY_9 + ALTGR_MASK;\nDEADKEY_DEGREE_SIGN=KEY_TILDE + SHIFT_MASK; // TODO: is it KEY_5 + ALTGR_MASK;\nDEADKEY_CARON=KEY_EQUAL + SHIFT_MASK; // TODO: is it KEY_2 + ALTGR_MASK;\n//DEADKEY_CIRCUMFLEX=KEY_3 + ALTGR_MASK;\nDEADKEY_BREVE=KEY_4 + ALTGR_MASK;\nDEADKEY_OGONEK=KEY_6 + ALTGR_MASK;\n//DEADKEY_GRAVE_ACCENT=KEY_7 + ALTGR_MASK;\nDEADKEY_DOT_ABOVE=KEY_8 + ALTGR_MASK;\nDEADKEY_DOUBLE_ACUTE=KEY_0 + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_MINUS + ALTGR_MASK;\nDEADKEY_CEDILLA=KEY_EQUAL + ALTGR_MASK;\nKEY_NON_US_100=63;\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_QUOTE + SHIFT_MASK;// 33 !\nASCII_22=KEY_SEMICOLON + SHIFT_MASK;// 34 \"\nASCII_23=KEY_X + ALTGR_MASK;// 35 #\nASCII_24=KEY_SEMICOLON + ALTGR_MASK;// 36 $\nASCII_25=KEY_MINUS + SHIFT_MASK;// 37 %\nASCII_26=KEY_C + ALTGR_MASK;// 38 &\nASCII_27=KEY_BACKSLASH + SHIFT_MASK;// 39 '\nASCII_28=KEY_RIGHT_BRACE + SHIFT_MASK;// 40 (\nASCII_29=KEY_RIGHT_BRACE;// 41 )\nASCII_2A=KEY_SLASH + ALTGR_MASK;// 42 *\nASCII_2B=KEY_1;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_LEFT_BRACE + SHIFT_MASK;// 47 /\nASCII_30=KEY_0 + SHIFT_MASK;// 48 0\nASCII_31=KEY_1 + SHIFT_MASK;// 49 1\nASCII_32=KEY_2 + SHIFT_MASK;// 50 2\nASCII_33=KEY_3 + SHIFT_MASK;// 51 3\nASCII_34=KEY_4 + SHIFT_MASK;// 52 4\nASCII_35=KEY_5 + SHIFT_MASK;// 53 5\nASCII_36=KEY_6 + SHIFT_MASK;// 54 6\nASCII_37=KEY_7 + SHIFT_MASK;// 55 7\nASCII_38=KEY_8 + SHIFT_MASK;// 55 8\nASCII_39=KEY_9 + SHIFT_MASK;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_TILDE;// 59 ;\nASCII_3C=KEY_COMMA + ALTGR_MASK;// 60 <\nASCII_3D=KEY_MINUS;// 61 =\nASCII_3E=KEY_PERIOD + ALTGR_MASK;// 62 >\nASCII_3F=KEY_COMMA + SHIFT_MASK;// 63 ?\nASCII_40=KEY_V + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Z + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Y + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_F + ALTGR_MASK;// 91 [\nASCII_5C=KEY_NON_US_100;// 92\nASCII_5D=KEY_G + ALTGR_MASK;// 93 ]\nASCII_5E=KEY_3 + ALTGR_MASK;// 94 ^  TODO: testme\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=KEY_7 + ALTGR_MASK;// 96 `  TODO: testme\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Z;// 121 y\nASCII_7A=KEY_Y;// 122 z\nASCII_7B=KEY_B + ALTGR_MASK;// 123 {\nASCII_7C=KEY_NON_US_100 + SHIFT_MASK;// 124 |\nASCII_7D=KEY_N + ALTGR_MASK;// 125 }\nASCII_7E=KEY_1 + ALTGR_MASK;// 126 ~  TODO: fixme\nASCII_7F=KEY_BACKSPACE;// 127\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent Sign\nISO_8859_1_A3=0;// 163 £     Pound Sign\nISO_8859_1_A4=KEY_BACKSLASH + ALTGR_MASK;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_QUOTE;// 167 §     SECTION SIGN\nISO_8859_1_A8=0;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=DEGREE_SIGN_BITS + KEY_SPACE;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=0;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=CEDILLA_BITS + KEY_SPACE;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=0;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=0;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=0;// 195 Ã     A TILDE\nISO_8859_1_C4=0;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=CEDILLA_BITS + KEY_C + SHIFT_MASK;// 199 Ç     C CEDILLA\nISO_8859_1_C8=0;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=0;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=0;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=0;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=0;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=0;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=0;// 209 Ñ     N TILDE\nISO_8859_1_D2=0;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=0;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=0;// 213 Õ     O TILDE\nISO_8859_1_D6=0;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=KEY_RIGHT_BRACE + ALTGR_MASK;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=0;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=0;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=0;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Z + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=KEY_QUOTE + ALTGR_MASK;// 223 ß     SHARP S  TODO: testme\nISO_8859_1_E0=0;// 224 à     a GRAVE\nISO_8859_1_E1=KEY_8;// 225 á     a ACUTE\nISO_8859_1_E2=0;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=0;// 227 ã     a TILDE\nISO_8859_1_E4=0;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=CEDILLA_BITS + KEY_C;// 231 ç     c CEDILLA\nISO_8859_1_E8=0;// 232 è     e GRAVE\nISO_8859_1_E9=KEY_0;// 233 é     e ACUTE\nISO_8859_1_EA=0;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=0;// 235 ë     e DIAERESIS\nISO_8859_1_EC=0;// 236 ì     i GRAVE\nISO_8859_1_ED=KEY_9;// 237 í     i ACUTE\nISO_8859_1_EE=0;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=0;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=0;// 241 ñ     n TILDE\nISO_8859_1_F2=0;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=0;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=0;// 245 õ     o TILDE\nISO_8859_1_F6=0;// 246 ö     o DIAERESIS\nISO_8859_1_F7=KEY_LEFT_BRACE + ALTGR_MASK;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=0;// 249 ù     u GRAVE\nISO_8859_1_FA=KEY_LEFT_BRACE;// 250 ú     u ACUTE\nISO_8859_1_FB=0;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=0;// 252 ü     u DIAERESIS\nISO_8859_1_FD=KEY_7;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=0;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n\nUNICODE_EXTRA00=0x011B;// ě  Small Letter E with caron\nKEYCODE_EXTRA00=KEY_2;\nUNICODE_EXTRA01=0x0161;// š  Small Letter S with caron\nKEYCODE_EXTRA01=KEY_3;\nUNICODE_EXTRA02=0x010D;// č  Small Letter C with caron\nKEYCODE_EXTRA02=KEY_4;\nUNICODE_EXTRA03=0x0159;// ř  Small Letter R with caron\nKEYCODE_EXTRA03=KEY_5;\nUNICODE_EXTRA04=0x017E;// ž  Small Letter Z with caron\nKEYCODE_EXTRA04=KEY_6;\nUNICODE_EXTRA05=0x016F;// ů  Small Letter U with ring above\nKEYCODE_EXTRA05=KEY_SEMICOLON;\nUNICODE_EXTRA06=0x0111;// đ  Small Letter D with stroke\nKEYCODE_EXTRA06=KEY_S + ALTGR_MASK;\nUNICODE_EXTRA07=0x0110;// Đ  Capital Letter D with stroke\nKEYCODE_EXTRA07=KEY_D + ALTGR_MASK;\nUNICODE_EXTRA08=0x0142;// ł  Small Letter L with stroke\nKEYCODE_EXTRA08=KEY_K + ALTGR_MASK;\nUNICODE_EXTRA09=0x0141;// Ł  Capital Letter L with stroke\nKEYCODE_EXTRA09=KEY_L + ALTGR_MASK;\nUNICODE_EXTRA0A=0x20AC;// €  Euro Sign\nKEYCODE_EXTRA0A=KEY_E + ALTGR_MASK;\n\n// LAYOUT_CZECH\n\n}\n\nelse if (KeyboardLayout[0] == LAYOUT_SERBIAN_LATIN_ONLY) {\n// http://forum.pjrc.com/threads/27032-Serbian-Keyboard-Layout\n\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0F00;\nCEDILLA_BITS=0x0100;\nCARON_BITS=0x0200;\nCIRCUMFLEX_BITS=0x0300;\nBREVE_BITS=0x0400;\nDEGREE_SIGN_BITS=0x0500;\nOGONEK_BITS=0x0600;\nDOT_ABOVE_BITS=0x0700;\nACUTE_ACCENT_BITS=0x0800;\nDOUBLE_ACUTE_BITS=0x0900;\nDIAERESIS_BITS=0x0A00;\nKEYCODE_MASK=0x0FFF;\nDEADKEY_CEDILLA=KEY_TILDE;\nDEADKEY_CARON=KEY_2 + ALTGR_MASK;\nDEADKEY_CIRCUMFLEX=KEY_3 + ALTGR_MASK;\nDEADKEY_BREVE=KEY_4 + ALTGR_MASK;\nDEADKEY_DEGREE_SIGN=KEY_5 + ALTGR_MASK;\nDEADKEY_OGONEK=KEY_6 + ALTGR_MASK;\nDEADKEY_DOT_ABOVE=KEY_8 + ALTGR_MASK;\nDEADKEY_ACUTE_ACCENT=KEY_9 + ALTGR_MASK;\nDEADKEY_DOUBLE_ACUTE=KEY_0 + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_MINUS + ALTGR_MASK;\n//DEADKEY_CEDILLA=KEY_EQUAL + ALTGR_MASK; <-- TODO: why are there 2 Cedilla deadkeys?\nKEY_NON_US_100=63;\n\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_1 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_3 + SHIFT_MASK;// 35 #\nASCII_24=KEY_4 + SHIFT_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_6 + SHIFT_MASK;// 38 &\nASCII_27=KEY_MINUS;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_EQUAL + SHIFT_MASK;// 42 *\nASCII_2B=KEY_EQUAL;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -  TODO: verify\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_7 + SHIFT_MASK;// 47 /\nASCII_30=KEY_0;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + SHIFT_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100;// 60 <\nASCII_3D=KEY_0 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_NON_US_100 + SHIFT_MASK;// 62 >\nASCII_3F=KEY_MINUS + SHIFT_MASK;// 63 ?\nASCII_40=KEY_V + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Z + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Y + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_F + ALTGR_MASK;// 91 [\nASCII_5C=KEY_Q + ALTGR_MASK;// 92\nASCII_5D=KEY_G + ALTGR_MASK;// 93 ]\nASCII_5E=CIRCUMFLEX_BITS + KEY_SPACE;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _   TODO: verify\nASCII_60=KEY_7 + ALTGR_MASK;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Z;// 121 y\nASCII_7A=KEY_Y;// 122 z\nASCII_7B=KEY_B + ALTGR_MASK;// 123 {\nASCII_7C=KEY_W + ALTGR_MASK;// 124 |\nASCII_7D=KEY_N + ALTGR_MASK;// 125 }\nASCII_7E=KEY_1 + ALTGR_MASK;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent Sign\nISO_8859_1_A3=0;// 163 £     Pound Sign\nISO_8859_1_A4=KEY_BACKSLASH + ALTGR_MASK;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_M + ALTGR_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=DIAERESIS_BITS + KEY_SPACE;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=DEGREE_SIGN_BITS + KEY_SPACE;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´     ACUTE ACCENT\nISO_8859_1_B5=0;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=CEDILLA_BITS + KEY_SPACE;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=0;// 192 À     A GRAVE\nISO_8859_1_C1=ACUTE_ACCENT_BITS + KEY_A + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=CIRCUMFLEX_BITS=+ KEY_A + SHIFT_MASK;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=0;// 195 Ã     A TILDE\nISO_8859_1_C4=DIAERESIS_BITS + KEY_A + SHIFT_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=CEDILLA_BITS + KEY_C + SHIFT_MASK;// 199 Ç     C CEDILLA\nISO_8859_1_C8=0;// 200 È     E GRAVE\nISO_8859_1_C9=ACUTE_ACCENT_BITS + KEY_E + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=CIRCUMFLEX_BITS + KEY_E + SHIFT_MASK;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=DIAERESIS_BITS + KEY_E + SHIFT_MASK;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=0;// 204 Ì     I GRAVE\nISO_8859_1_CD=ACUTE_ACCENT_BITS + KEY_I + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=CIRCUMFLEX_BITS + KEY_I + SHIFT_MASK;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=DIAERESIS_BITS + KEY_I + SHIFT_MASK;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=0;// 208 Ð     ETH\nISO_8859_1_D1=0;// 209 Ñ     N TILDE\nISO_8859_1_D2=0;// 210 Ò     O GRAVE\nISO_8859_1_D3=ACUTE_ACCENT_BITS + KEY_O + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=CIRCUMFLEX_BITS + KEY_O + SHIFT_MASK;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=0;// 213 Õ     O TILDE\nISO_8859_1_D6=DIAERESIS_BITS + KEY_O + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=KEY_RIGHT_BRACE + ALTGR_MASK;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=0;// 217 Ù     U GRAVE\nISO_8859_1_DA=ACUTE_ACCENT_BITS + KEY_U + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=CIRCUMFLEX_BITS + KEY_U + SHIFT_MASK;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=DIAERESIS_BITS + KEY_U + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=ACUTE_ACCENT_BITS + KEY_Z + SHIFT_MASK;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=KEY_QUOTE + ALTGR_MASK;// 223 ß     SHARP S\nISO_8859_1_E0=0;// 224 à     a GRAVE\nISO_8859_1_E1=ACUTE_ACCENT_BITS + KEY_A;// 225 á     a ACUTE\nISO_8859_1_E2=CIRCUMFLEX_BITS + KEY_A;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=0;// 227 ã     a TILDE\nISO_8859_1_E4=DIAERESIS_BITS + KEY_A;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=CEDILLA_BITS + KEY_C;// 231 ç     c CEDILLA\nISO_8859_1_E8=0;// 232 è     e GRAVE\nISO_8859_1_E9=ACUTE_ACCENT_BITS + KEY_E;// 233 é     e ACUTE\nISO_8859_1_EA=CIRCUMFLEX_BITS + KEY_E;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=DIAERESIS_BITS + KEY_E;// 235 ë     e DIAERESIS\nISO_8859_1_EC=0;// 236 ì     i GRAVE\nISO_8859_1_ED=ACUTE_ACCENT_BITS + KEY_I;// 237 í     i ACUTE\nISO_8859_1_EE=CIRCUMFLEX_BITS + KEY_I;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=DIAERESIS_BITS + KEY_I;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=0;// 241 ñ     n TILDE\nISO_8859_1_F2=0;// 242 ò     o GRAVE\nISO_8859_1_F3=ACUTE_ACCENT_BITS + KEY_O;// 243 ó     o ACUTE\nISO_8859_1_F4=CIRCUMFLEX_BITS + KEY_O;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=0;// 245 õ     o TILDE\nISO_8859_1_F6=DIAERESIS_BITS + KEY_O;// 246 ö     o DIAERESIS\nISO_8859_1_F7=KEY_LEFT_BRACE + ALTGR_MASK;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=0;// 249 ù     u GRAVE\nISO_8859_1_FA=ACUTE_ACCENT_BITS + KEY_U;// 250 ú     u ACUTE\nISO_8859_1_FB=CIRCUMFLEX_BITS + KEY_U;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=DIAERESIS_BITS + KEY_U;// 252 ü     u DIAERESIS\nISO_8859_1_FD=ACUTE_ACCENT_BITS + KEY_Z;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=0;// 255 ÿ     y DIAERESIS\nUNICODE_20AC=KEY_E + ALTGR_MASK;//     €     Euro Sign\n\nUNICODE_EXTRA00=0x0160; // S caron\nKEYCODE_EXTRA00=KEY_LEFT_BRACE + SHIFT_MASK;\nUNICODE_EXTRA01=0x0161; // s caron\nKEYCODE_EXTRA01=KEY_LEFT_BRACE;\nUNICODE_EXTRA02=0x0110; // D with stroke\nKEYCODE_EXTRA02=KEY_RIGHT_BRACE + SHIFT_MASK;\nUNICODE_EXTRA03=0x0111; // d with stroke\nKEYCODE_EXTRA03=KEY_RIGHT_BRACE;\nUNICODE_EXTRA04=0x010C; // C with caron\nKEYCODE_EXTRA04=KEY_SEMICOLON + SHIFT_MASK;\nUNICODE_EXTRA05=0x010D; // c with caron\nKEYCODE_EXTRA05=KEY_SEMICOLON;\nUNICODE_EXTRA06=0x0106; // C with acute\nKEYCODE_EXTRA06=KEY_QUOTE + SHIFT_MASK;\nUNICODE_EXTRA07=0x0107; // c with acute\nKEYCODE_EXTRA07=KEY_QUOTE;\nUNICODE_EXTRA08=0x017D; // Z with caron\nKEYCODE_EXTRA08=KEY_BACKSLASH + SHIFT_MASK;\nUNICODE_EXTRA09=0x017E; // z with caron\nKEYCODE_EXTRA09=KEY_BACKSLASH;\n\nUNICODE_EXTRA10=0x0141; // L with stroke\nKEYCODE_EXTRA10=KEY_L + ALTGR_MASK;\nUNICODE_EXTRA11=0x0142; // l with stroke\nKEYCODE_EXTRA11=KEY_K + ALTGR_MASK;\nUNICODE_EXTRA12=0x010E; // D with caron\nKEYCODE_EXTRA12=CARON_BITS + KEY_D + SHIFT_MASK;\nUNICODE_EXTRA13=0x010F; // d with caron\nKEYCODE_EXTRA13=CARON_BITS + KEY_D;\nUNICODE_EXTRA14=0x011A; // E with caron\nKEYCODE_EXTRA14=CARON_BITS + KEY_E + SHIFT_MASK;\nUNICODE_EXTRA15=0x011B; // e with caron\nKEYCODE_EXTRA15=CARON_BITS + KEY_E;\nUNICODE_EXTRA16=0x013D; // L with caron\nKEYCODE_EXTRA16=CARON_BITS + KEY_L + SHIFT_MASK;\nUNICODE_EXTRA17=0x013E; // l with caron\nKEYCODE_EXTRA17=CARON_BITS + KEY_L;\nUNICODE_EXTRA18=0x0147; // N with caron\nKEYCODE_EXTRA18=CARON_BITS + KEY_N + SHIFT_MASK;\nUNICODE_EXTRA19=0x0148; // n with caron\nKEYCODE_EXTRA19=CARON_BITS + KEY_N;\n\nUNICODE_EXTRA20=0x0158; // R with caron\nKEYCODE_EXTRA20=CARON_BITS + KEY_R + SHIFT_MASK;\nUNICODE_EXTRA21=0x0159; // r with caron\nKEYCODE_EXTRA21=CARON_BITS + KEY_R;\nUNICODE_EXTRA22=0x0164; // T with caron\nKEYCODE_EXTRA22=CARON_BITS + KEY_T + SHIFT_MASK;\nUNICODE_EXTRA23=0x0165; // t with caron\nKEYCODE_EXTRA23=CARON_BITS + KEY_T;\nUNICODE_EXTRA24=0x0102; // A with breve\nKEYCODE_EXTRA24=BREVE_BITS + KEY_A + SHIFT_MASK;\nUNICODE_EXTRA25=0x0103; // a with breve\nKEYCODE_EXTRA25=BREVE_BITS + KEY_A;\nUNICODE_EXTRA26=0x016E; // U with ring above  TODO: verify\nKEYCODE_EXTRA26=DEADKEY_DEGREE_SIGN + KEY_U + SHIFT_MASK;\nUNICODE_EXTRA27=0x016F; // u with ring above  TODO: verify\nKEYCODE_EXTRA27=DEADKEY_DEGREE_SIGN + KEY_U;\nUNICODE_EXTRA28=0x0104; // A with ogonek\nKEYCODE_EXTRA28=OGONEK_BITS + KEY_A + SHIFT_MASK;\nUNICODE_EXTRA29=0x0105; // a with ogonek\nKEYCODE_EXTRA29=OGONEK_BITS + KEY_A;\n\nUNICODE_EXTRA30=0x0118; // E with ogonek\nKEYCODE_EXTRA30=OGONEK_BITS + KEY_E + SHIFT_MASK;\nUNICODE_EXTRA31=0x0119; // e with ogonek\nKEYCODE_EXTRA31=OGONEK_BITS + KEY_E;\nUNICODE_EXTRA32=0x017B; // Z with dot above\nKEYCODE_EXTRA32=DEADKEY_DOT_ABOVE + KEY_Z + SHIFT_MASK;\nUNICODE_EXTRA33=0x017C; // z with dot above\nKEYCODE_EXTRA33=DEADKEY_DOT_ABOVE + KEY_Z;\nUNICODE_EXTRA34=0x0139; // L with acute\nKEYCODE_EXTRA34=ACUTE_ACCENT_BITS + KEY_L + SHIFT_MASK;\nUNICODE_EXTRA35=0x013A; // l with acute\nKEYCODE_EXTRA35=ACUTE_ACCENT_BITS + KEY_L;\nUNICODE_EXTRA36=0x0143; // N with acute\nKEYCODE_EXTRA36=ACUTE_ACCENT_BITS + KEY_N + SHIFT_MASK;\nUNICODE_EXTRA37=0x0144; // n with acute\nKEYCODE_EXTRA37=ACUTE_ACCENT_BITS + KEY_N;\nUNICODE_EXTRA38=0x0154; // R with acute\nKEYCODE_EXTRA38=ACUTE_ACCENT_BITS + KEY_R + SHIFT_MASK;\nUNICODE_EXTRA39=0x0155; // r with acute\nKEYCODE_EXTRA39=ACUTE_ACCENT_BITS + KEY_R;\n\nUNICODE_EXTRA40=0x015A; // S with acute\nKEYCODE_EXTRA40=ACUTE_ACCENT_BITS + KEY_S + SHIFT_MASK;\nUNICODE_EXTRA41=0x015B; // s with acute\nKEYCODE_EXTRA41=ACUTE_ACCENT_BITS + KEY_S;\nUNICODE_EXTRA42=0x0179; // Z with acute\nKEYCODE_EXTRA42=ACUTE_ACCENT_BITS + KEY_Z + SHIFT_MASK;\nUNICODE_EXTRA43=0x017A; // z with acute\nKEYCODE_EXTRA43=ACUTE_ACCENT_BITS + KEY_Z;\nUNICODE_EXTRA44=0x0150; // O with double acute\nKEYCODE_EXTRA44=DOUBLE_ACUTE_BITS + KEY_O + SHIFT_MASK;\nUNICODE_EXTRA45=0x0151; // o with double acute\nKEYCODE_EXTRA45=DOUBLE_ACUTE_BITS + KEY_O;\nUNICODE_EXTRA46=0x0170; // U with double acute\nKEYCODE_EXTRA46=DOUBLE_ACUTE_BITS + KEY_U + SHIFT_MASK;\nUNICODE_EXTRA47=0x0171; // u with double acute\nKEYCODE_EXTRA47=DOUBLE_ACUTE_BITS + KEY_U;\nUNICODE_EXTRA48=0x015E; // S with cedilla\nKEYCODE_EXTRA48=CEDILLA_BITS + KEY_S + SHIFT_MASK;\nUNICODE_EXTRA49=0x015F; // s with cedilla\nKEYCODE_EXTRA49=CEDILLA_BITS + KEY_S;\n\nUNICODE_EXTRA50=0x201A; // single low quote\nKEYCODE_EXTRA50=KEY_TILDE;\nUNICODE_EXTRA51=0x20AC; // euro sign\nKEYCODE_EXTRA51=KEY_E + ALTGR_MASK;\n\n// LAYOUT_SERBIAN_LATIN_ONLY\n\n}\n\nelse if (KeyboardLayout[0] ==  LAYOUT_HUNGARIAN) {\n// Based on own hungarian keyboard, \n//  modified the Czech layout, since they are similar.\n// Using https://www.viris.si/2013/10/implementacija-slovenske-tipkovnice-za-teensy/\n//  for reference.\n\n// Code masks\n// All of these are enabled, since they are available,\n//  but may not be neccessary\nSHIFT_MASK=0x0040;\nALTGR_MASK=0x0080;\nDEADKEYS_MASK=0x0F00;\nACUTE_ACCENT_BITS=0x0100;\nDEGREE_SIGN_BITS=0x0200;\nCARON_BITS=0x0300;\nCIRCUMFLEX_BITS=0x0400;\nBREVE_BITS=0x0500;\nOGONEK_BITS=0x0600;\nGRAVE_ACCENT_BITS=0x0700;\nDOT_ABOVE_BITS=0x0800; \nDOUBLE_ACUTE_BITS=0x0900;\nDIAERESIS_BITS=0x0A00;\nCEDILLA_BITS=0x0B00;\n\nKEYCODE_MASK=0x0FFF;\n\n// Deadkeys\n// All of these deadkeys work with a Hungarian keyboard\n//  on Windows, but not all do on Ubuntu\nDEADKEY_ACUTE_ACCENT=KEY_0 + ALTGR_MASK;\nDEADKEY_DEGREE_SIGN=KEY_5 + ALTGR_MASK;\nDEADKEY_CARON=KEY_EQUAL + SHIFT_MASK;\nDEADKEY_CIRCUMFLEX=KEY_3 + ALTGR_MASK;\nDEADKEY_BREVE=KEY_4 + ALTGR_MASK;\nDEADKEY_OGONEK=KEY_6 + ALTGR_MASK;\nDEADKEY_GRAVE_ACCENT=KEY_7 + ALTGR_MASK;\nDEADKEY_DOT_ABOVE=KEY_8 + ALTGR_MASK;\nDEADKEY_DOUBLE_ACUTE=KEY_0 + ALTGR_MASK;\nDEADKEY_DIAERESIS=KEY_MINUS + ALTGR_MASK;\nDEADKEY_CEDILLA=KEY_EQUAL + ALTGR_MASK;\n\n// Individual ASCII keys\nKEY_NON_US_100=63; // UNCLEAR meaning, but probably OK\nASCII_20=KEY_SPACE;// 32  \nASCII_21=KEY_4 + SHIFT_MASK;// 33 !\nASCII_22=KEY_2 + SHIFT_MASK;// 34 \"\nASCII_23=KEY_X + ALTGR_MASK;// 35 #\nASCII_24=KEY_SEMICOLON + ALTGR_MASK;// 36 $\nASCII_25=KEY_5 + SHIFT_MASK;// 37 %\nASCII_26=KEY_C + ALTGR_MASK;// 38 &\nASCII_27=KEY_1 + SHIFT_MASK;// 39 '\nASCII_28=KEY_8 + SHIFT_MASK;// 40 (\nASCII_29=KEY_9 + SHIFT_MASK;// 41 )\nASCII_2A=KEY_SLASH + ALTGR_MASK;// 42 *\nASCII_2B=KEY_3 + SHIFT_MASK;// 43 +\nASCII_2C=KEY_COMMA;// 44 ,\nASCII_2D=KEY_SLASH;// 45 -\nASCII_2E=KEY_PERIOD;// 46 .\nASCII_2F=KEY_6 + SHIFT_MASK;// 47 /\nASCII_30=KEY_TILDE;// 48 0\nASCII_31=KEY_1;// 49 1\nASCII_32=KEY_2;// 50 2\nASCII_33=KEY_3;// 51 3\nASCII_34=KEY_4;// 52 4\nASCII_35=KEY_5;// 53 5\nASCII_36=KEY_6;// 54 6\nASCII_37=KEY_7;// 55 7\nASCII_38=KEY_8;// 55 8\nASCII_39=KEY_9;// 57 9\nASCII_3A=KEY_PERIOD + SHIFT_MASK;// 58 :\nASCII_3B=KEY_COMMA + ALTGR_MASK;// 59 ;\nASCII_3C=KEY_NON_US_100 + ALTGR_MASK;// 60 \nASCII_3D=KEY_7 + SHIFT_MASK;// 61 =\nASCII_3E=KEY_Z + ALTGR_MASK;// 62 >\nASCII_3F=KEY_COMMA + SHIFT_MASK;// 63 ?\nASCII_40=KEY_V + ALTGR_MASK;// 64 @\nASCII_41=KEY_A + SHIFT_MASK;// 65 A\nASCII_42=KEY_B + SHIFT_MASK;// 66 B\nASCII_43=KEY_C + SHIFT_MASK;// 67 C\nASCII_44=KEY_D + SHIFT_MASK;// 68 D\nASCII_45=KEY_E + SHIFT_MASK;// 69 E\nASCII_46=KEY_F + SHIFT_MASK;// 70 F\nASCII_47=KEY_G + SHIFT_MASK;// 71 G\nASCII_48=KEY_H + SHIFT_MASK;// 72 H\nASCII_49=KEY_I + SHIFT_MASK;// 73 I\nASCII_4A=KEY_J + SHIFT_MASK;// 74 J\nASCII_4B=KEY_K + SHIFT_MASK;// 75 K\nASCII_4C=KEY_L + SHIFT_MASK;// 76 L\nASCII_4D=KEY_M + SHIFT_MASK;// 77 M\nASCII_4E=KEY_N + SHIFT_MASK;// 78 N\nASCII_4F=KEY_O + SHIFT_MASK;// 79 O\nASCII_50=KEY_P + SHIFT_MASK;// 80 P\nASCII_51=KEY_Q + SHIFT_MASK;// 81 Q\nASCII_52=KEY_R + SHIFT_MASK;// 82 R\nASCII_53=KEY_S + SHIFT_MASK;// 83 S\nASCII_54=KEY_T + SHIFT_MASK;// 84 T\nASCII_55=KEY_U + SHIFT_MASK;// 85 U\nASCII_56=KEY_V + SHIFT_MASK;// 86 V\nASCII_57=KEY_W + SHIFT_MASK;// 87 W\nASCII_58=KEY_X + SHIFT_MASK;// 88 X\nASCII_59=KEY_Z + SHIFT_MASK;// 89 Y\nASCII_5A=KEY_Y + SHIFT_MASK;// 90 Z\nASCII_5B=KEY_F + ALTGR_MASK;// 91 [\nASCII_5C=KEY_Q + ALTGR_MASK;// 92 backslash\nASCII_5D=KEY_G + ALTGR_MASK;// 93 ]\nASCII_5E=KEY_3 + ALTGR_MASK;// 94 ^\nASCII_5F=KEY_SLASH + SHIFT_MASK;// 95 _\nASCII_60=KEY_7 + ALTGR_MASK;// 96 `\nASCII_61=KEY_A;// 97 a\nASCII_62=KEY_B;// 98 b\nASCII_63=KEY_C;// 99 c\nASCII_64=KEY_D;// 100 d\nASCII_65=KEY_E;// 101 e\nASCII_66=KEY_F;// 102 f\nASCII_67=KEY_G;// 103 g\nASCII_68=KEY_H;// 104 h\nASCII_69=KEY_I;// 105 i\nASCII_6A=KEY_J;// 106 j\nASCII_6B=KEY_K;// 107 k\nASCII_6C=KEY_L;// 108 l\nASCII_6D=KEY_M;// 109 m\nASCII_6E=KEY_N;// 110 n\nASCII_6F=KEY_O;// 111 o\nASCII_70=KEY_P;// 112 p\nASCII_71=KEY_Q;// 113 q\nASCII_72=KEY_R;// 114 r\nASCII_73=KEY_S;// 115 s\nASCII_74=KEY_T;// 116 t\nASCII_75=KEY_U;// 117 u\nASCII_76=KEY_V;// 118 v\nASCII_77=KEY_W;// 119 w\nASCII_78=KEY_X;// 120 x\nASCII_79=KEY_Z;// 121 y\nASCII_7A=KEY_Y;// 122 z\nASCII_7B=KEY_B + ALTGR_MASK;// 123 {\nASCII_7C=KEY_W + ALTGR_MASK;// 124 |\nASCII_7D=KEY_N + ALTGR_MASK;// 125 }\nASCII_7E=KEY_1 + ALTGR_MASK;// 126 ~\nASCII_7F=KEY_BACKSPACE;// 127\n\n// Individual ISO 8859-1 keys\nISO_8859_1_A0=KEY_SPACE;// 160       Nonbreakng Space\nISO_8859_1_A1=0;// 161 ¡     Inverted Exclamation\nISO_8859_1_A2=0;// 162 ¢     Cent Sign\nISO_8859_1_A3=0;// 163 £     Pound Sign\nISO_8859_1_A4=KEY_BACKSLASH + ALTGR_MASK;// 164 ¤     Currency Sign\nISO_8859_1_A5=0;// 165 ¥     YEN SIGN\nISO_8859_1_A6=0;// 166 ¦     BROKEN BAR\nISO_8859_1_A7=KEY_TILDE + SHIFT_MASK;// 167 §     SECTION SIGN\nISO_8859_1_A8=0;// 168 ¨     DIAERESIS\nISO_8859_1_A9=0;// 169 ©     COPYRIGHT SIGN\nISO_8859_1_AA=0;// 170 ª     FEMININE ORDINAL\nISO_8859_1_AB=0;// 171 «     LEFT DOUBLE ANGLE QUOTE\nISO_8859_1_AC=0;// 172 ¬     NOT SIGN\nISO_8859_1_AD=0;// 173       SOFT HYPHEN\nISO_8859_1_AE=0;// 174 ®     REGISTERED SIGN\nISO_8859_1_AF=0;// 175 ¯     MACRON\nISO_8859_1_B0=DEGREE_SIGN_BITS + KEY_SPACE;// 176 °     DEGREE SIGN\nISO_8859_1_B1=0;// 177 ±     PLUS-MINUS SIGN\nISO_8859_1_B2=0;// 178 ²     SUPERSCRIPT TWO\nISO_8859_1_B3=0;// 179 ³     SUPERSCRIPT THREE\nISO_8859_1_B4=ACUTE_ACCENT_BITS + KEY_SPACE;// 180 ´\nISO_8859_1_B5=0;// 181 µ     MICRO SIGN\nISO_8859_1_B6=0;// 182 ¶     PILCROW SIGN\nISO_8859_1_B7=0;// 183 ·     MIDDLE DOT\nISO_8859_1_B8=CEDILLA_BITS + KEY_SPACE;// 184 ¸     CEDILLA\nISO_8859_1_B9=0;// 185 ¹     SUPERSCRIPT ONE\nISO_8859_1_BA=0;// 186 º     MASCULINE ORDINAL\nISO_8859_1_BB=0;// 187 »     RIGHT DOUBLE ANGLE QUOTE\nISO_8859_1_BC=0;// 188 ¼     FRACTION ONE QUARTER\nISO_8859_1_BD=0;// 189 ½     FRACTION ONE HALF\nISO_8859_1_BE=0;// 190 ¾     FRACTION THREE QUARTERS\nISO_8859_1_BF=0;// 191 ¿     INVERTED QUESTION MARK\nISO_8859_1_C0=0;// 192 À     A GRAVE\nISO_8859_1_C1=KEY_QUOTE + SHIFT_MASK;// 193 Á     A ACUTE\nISO_8859_1_C2=0;// 194 Â     A CIRCUMFLEX\nISO_8859_1_C3=0;// 195 Ã     A TILDE\nISO_8859_1_C4=KEY_E + ALTGR_MASK;// 196 Ä     A DIAERESIS\nISO_8859_1_C5=0;// 197 Å     A RING ABOVE\nISO_8859_1_C6=0;// 198 Æ     AE\nISO_8859_1_C7=CEDILLA_BITS + KEY_C + SHIFT_MASK;// 199 Ç     C CEDILLA\nISO_8859_1_C8=0;// 200 È     E GRAVE\nISO_8859_1_C9=KEY_SEMICOLON + SHIFT_MASK;// 201 É     E ACUTE\nISO_8859_1_CA=0;// 202 Ê     E CIRCUMFLEX\nISO_8859_1_CB=0;// 203 Ë     E DIAERESIS\nISO_8859_1_CC=0;// 204 Ì     I GRAVE\nISO_8859_1_CD=KEY_NON_US_100 + SHIFT_MASK;// 205 Í     I ACUTE\nISO_8859_1_CE=0;// 206 Î     I CIRCUMFLEX\nISO_8859_1_CF=0;// 207 Ï     I DIAERESIS\nISO_8859_1_D0=KEY_D + ALTGR_MASK;// 208 Ð     ETH // for some reason this does not work, just like the unicode characters\nISO_8859_1_D1=0;// 209 Ñ     N TILDE\nISO_8859_1_D2=0;// 210 Ò     O GRAVE\nISO_8859_1_D3=KEY_EQUAL + SHIFT_MASK;// 211 Ó     O ACUTE\nISO_8859_1_D4=0;// 212 Ô     O CIRCUMFLEX\nISO_8859_1_D5=0;// 213 Õ     O TILDE\nISO_8859_1_D6=KEY_0 + SHIFT_MASK;// 214 Ö     O DIAERESIS\nISO_8859_1_D7=KEY_RIGHT_BRACE + ALTGR_MASK;// 215 ×     MULTIPLICATION\nISO_8859_1_D8=0;// 216 Ø     O STROKE\nISO_8859_1_D9=0;// 217 Ù     U GRAVE\nISO_8859_1_DA=KEY_RIGHT_BRACE + SHIFT_MASK;// 218 Ú     U ACUTE\nISO_8859_1_DB=0;// 219 Û     U CIRCUMFLEX\nISO_8859_1_DC=KEY_MINUS + SHIFT_MASK;// 220 Ü     U DIAERESIS\nISO_8859_1_DD=0;// 221 Ý     Y ACUTE\nISO_8859_1_DE=0;// 222 Þ     THORN\nISO_8859_1_DF=KEY_QUOTE + ALTGR_MASK;// 223 ß     SHARP S\nISO_8859_1_E0=0;// 224 à     a GRAVE\nISO_8859_1_E1=KEY_QUOTE;// 225 á     a ACUTE\nISO_8859_1_E2=0;// 226 â     a CIRCUMFLEX\nISO_8859_1_E3=0;// 227 ã     a TILDE\nISO_8859_1_E4=KEY_A + ALTGR_MASK;// 228 ä     a DIAERESIS\nISO_8859_1_E5=0;// 229 å     a RING ABOVE\nISO_8859_1_E6=0;// 230 æ     ae\nISO_8859_1_E7=CEDILLA_BITS + KEY_C;// 231 ç     c CEDILLA\nISO_8859_1_E8=0;// 232 è     e GRAVE\nISO_8859_1_E9=KEY_SEMICOLON;// 233 é     e ACUTE\nISO_8859_1_EA=0;// 234 ê     e CIRCUMFLEX\nISO_8859_1_EB=0;// 235 ë     e DIAERESIS\nISO_8859_1_EC=0;// 236 ì     i GRAVE\nISO_8859_1_ED=KEY_NON_US_100;// 237 í     i ACUTE\nISO_8859_1_EE=0;// 238 î     i CIRCUMFLEX\nISO_8859_1_EF=0;// 239 ï     i DIAERESIS\nISO_8859_1_F0=0;// 240 ð     ETH\nISO_8859_1_F1=0;// 241 ñ     n TILDE\nISO_8859_1_F2=0;// 242 ò     o GRAVE\nISO_8859_1_F3=KEY_EQUAL;// 243 ó     o ACUTE\nISO_8859_1_F4=0;// 244 ô     o CIRCUMFLEX\nISO_8859_1_F5=0;// 245 õ     o TILDE\nISO_8859_1_F6=KEY_0;// 246 ö     o DIAERESIS\nISO_8859_1_F7=KEY_LEFT_BRACE + ALTGR_MASK;// 247 ÷     DIVISION\nISO_8859_1_F8=0;// 248 ø     o STROKE\nISO_8859_1_F9=0;// 249 ù     u GRAVE\nISO_8859_1_FA=KEY_RIGHT_BRACE;// 250 ú     u ACUTE\nISO_8859_1_FB=0;// 251 û     u CIRCUMFLEX\nISO_8859_1_FC=KEY_MINUS;// 252 ü     u DIAERESIS\nISO_8859_1_FD=0;// 253 ý     y ACUTE\nISO_8859_1_FE=0;// 254 þ     THORN\nISO_8859_1_FF=0;// 255 ÿ     y DIAERESIS\n\n\n//unimplemented?\nUNICODE_EXTRA00=0x0151;// ő  Small letter o, double acute\nKEYCODE_EXTRA00=KEY_LEFT_BRACE;\nUNICODE_EXTRA01=0x0150;// Ő  Capital letter O, double acute\nKEYCODE_EXTRA01=KEY_LEFT_BRACE + SHIFT_MASK;\nUNICODE_EXTRA02=0x0171;// ű  Small letter u, double acute\nKEYCODE_EXTRA02=KEY_BACKSLASH;\nUNICODE_EXTRA03=0x0170;// Ű  Small letter u, double acute\nKEYCODE_EXTRA03=KEY_BACKSLASH + SHIFT_MASK;\nUNICODE_EXTRA04=0x0111;// đ Small letter D with stroke\nKEYCODE_EXTRA04=KEY_D + ALTGR_MASK;\nUNICODE_EXTRA05=0x0110;// Đ  Capital letter D with stroke\nKEYCODE_EXTRA05=KEY_S + ALTGR_MASK;\nUNICODE_EXTRA06=0x0142;// ł  Small letter L with stroke\nKEYCODE_EXTRA06=KEY_K + ALTGR_MASK;\nUNICODE_EXTRA07=0x0141;// Ł  Capital Letter L with stroke\nKEYCODE_EXTRA07=KEY_L + ALTGR_MASK;\nUNICODE_EXTRA08=0x20AC;// €  Euro Sign\nKEYCODE_EXTRA08=KEY_U + ALTGR_MASK;\n\n// LAYOUT_HUNGARIAN\n\n}\n\n\nkeycodes_ascii[0] = M(ASCII_20);\nkeycodes_ascii[1] = M(ASCII_21);\nkeycodes_ascii[2] = M(ASCII_22);\nkeycodes_ascii[3] = M(ASCII_23);\nkeycodes_ascii[4] = M(ASCII_24);\nkeycodes_ascii[5] = M(ASCII_25);\nkeycodes_ascii[6] = M(ASCII_26);\nkeycodes_ascii[7] = M(ASCII_27);\nkeycodes_ascii[8] = M(ASCII_28);\nkeycodes_ascii[9] = M(ASCII_29);\nkeycodes_ascii[10] = M(ASCII_2A);\nkeycodes_ascii[11] = M(ASCII_2B);\nkeycodes_ascii[12] = M(ASCII_2C);\nkeycodes_ascii[13] = M(ASCII_2D);\nkeycodes_ascii[14] = M(ASCII_2E);\nkeycodes_ascii[15] = M(ASCII_2F);\nkeycodes_ascii[16] = M(ASCII_30);\nkeycodes_ascii[17] = M(ASCII_31);\nkeycodes_ascii[18] = M(ASCII_32);\nkeycodes_ascii[19] = M(ASCII_33);\nkeycodes_ascii[20] = M(ASCII_34);\nkeycodes_ascii[21] = M(ASCII_35);\nkeycodes_ascii[22] = M(ASCII_36);\nkeycodes_ascii[23] = M(ASCII_37);\nkeycodes_ascii[24] = M(ASCII_38);\nkeycodes_ascii[25] = M(ASCII_39);\nkeycodes_ascii[26] = M(ASCII_3A);\nkeycodes_ascii[27] = M(ASCII_3B);\nkeycodes_ascii[28] = M(ASCII_3C);\nkeycodes_ascii[29] = M(ASCII_3D);\nkeycodes_ascii[30] = M(ASCII_3E);\nkeycodes_ascii[31] = M(ASCII_3F);\nkeycodes_ascii[32] = M(ASCII_40);\nkeycodes_ascii[33] = M(ASCII_41);\nkeycodes_ascii[34] = M(ASCII_42);\nkeycodes_ascii[35] = M(ASCII_43);\nkeycodes_ascii[36] = M(ASCII_44);\nkeycodes_ascii[37] = M(ASCII_45);\nkeycodes_ascii[38] = M(ASCII_46);\nkeycodes_ascii[39] = M(ASCII_47);\nkeycodes_ascii[40] = M(ASCII_48);\nkeycodes_ascii[41] = M(ASCII_49);\nkeycodes_ascii[42] = M(ASCII_4A);\nkeycodes_ascii[43] = M(ASCII_4B);\nkeycodes_ascii[44] = M(ASCII_4C);\nkeycodes_ascii[45] = M(ASCII_4D);\nkeycodes_ascii[46] = M(ASCII_4E);\nkeycodes_ascii[47] = M(ASCII_4F);\nkeycodes_ascii[48] = M(ASCII_50);\nkeycodes_ascii[49] = M(ASCII_51);\nkeycodes_ascii[50] = M(ASCII_52);\nkeycodes_ascii[51] = M(ASCII_53);\nkeycodes_ascii[52] = M(ASCII_54);\nkeycodes_ascii[53] = M(ASCII_55);\nkeycodes_ascii[54] = M(ASCII_56);\nkeycodes_ascii[55] = M(ASCII_57);\nkeycodes_ascii[56] = M(ASCII_58);\nkeycodes_ascii[57] = M(ASCII_59);\nkeycodes_ascii[58] = M(ASCII_5A);\nkeycodes_ascii[59] = M(ASCII_5B);\nkeycodes_ascii[60] = M(ASCII_5C);\nkeycodes_ascii[61] = M(ASCII_5D);\nkeycodes_ascii[62] = M(ASCII_5E);\nkeycodes_ascii[63] = M(ASCII_5F);\nkeycodes_ascii[64] = M(ASCII_60);\nkeycodes_ascii[65] = M(ASCII_61);\nkeycodes_ascii[66] = M(ASCII_62);\nkeycodes_ascii[67] = M(ASCII_63);\nkeycodes_ascii[68] = M(ASCII_64);\nkeycodes_ascii[69] = M(ASCII_65);\nkeycodes_ascii[70] = M(ASCII_66);\nkeycodes_ascii[71] = M(ASCII_67);\nkeycodes_ascii[72] = M(ASCII_68);\nkeycodes_ascii[73] = M(ASCII_69);\nkeycodes_ascii[74] = M(ASCII_6A);\nkeycodes_ascii[75] = M(ASCII_6B);\nkeycodes_ascii[76] = M(ASCII_6C);\nkeycodes_ascii[77] = M(ASCII_6D);\nkeycodes_ascii[78] = M(ASCII_6E);\nkeycodes_ascii[79] = M(ASCII_6F);\nkeycodes_ascii[80] = M(ASCII_70);\nkeycodes_ascii[81] = M(ASCII_71);\nkeycodes_ascii[82] = M(ASCII_72);\nkeycodes_ascii[83] = M(ASCII_73);\nkeycodes_ascii[84] = M(ASCII_74);\nkeycodes_ascii[85] = M(ASCII_75);\nkeycodes_ascii[86] = M(ASCII_76);\nkeycodes_ascii[87] = M(ASCII_77);\nkeycodes_ascii[88] = M(ASCII_78);\nkeycodes_ascii[89] = M(ASCII_79);\nkeycodes_ascii[90] = M(ASCII_7A);\nkeycodes_ascii[91] = M(ASCII_7B);\nkeycodes_ascii[92] = M(ASCII_7C);\nkeycodes_ascii[93] = M(ASCII_7D);\nkeycodes_ascii[94] = M(ASCII_7E);\nkeycodes_ascii[95] = M(ASCII_7F);\n\nkeycodes_iso_8859_1[0] = M(ISO_8859_1_A0);\nkeycodes_iso_8859_1[1] = M(ISO_8859_1_A1);\nkeycodes_iso_8859_1[2] = M(ISO_8859_1_A2);\nkeycodes_iso_8859_1[3] = M(ISO_8859_1_A3);\nkeycodes_iso_8859_1[4] = M(ISO_8859_1_A4);\nkeycodes_iso_8859_1[5] = M(ISO_8859_1_A5);\nkeycodes_iso_8859_1[6] = M(ISO_8859_1_A6);\nkeycodes_iso_8859_1[7] = M(ISO_8859_1_A7);\nkeycodes_iso_8859_1[8] = M(ISO_8859_1_A8);\nkeycodes_iso_8859_1[9] = M(ISO_8859_1_A9);\nkeycodes_iso_8859_1[10] = M(ISO_8859_1_AA);\nkeycodes_iso_8859_1[11] = M(ISO_8859_1_AB);\nkeycodes_iso_8859_1[12] = M(ISO_8859_1_AC);\nkeycodes_iso_8859_1[13] = M(ISO_8859_1_AD);\nkeycodes_iso_8859_1[14] = M(ISO_8859_1_AE);\nkeycodes_iso_8859_1[15] = M(ISO_8859_1_AF);\nkeycodes_iso_8859_1[16] = M(ISO_8859_1_B0);\nkeycodes_iso_8859_1[17] = M(ISO_8859_1_B1);\nkeycodes_iso_8859_1[18] = M(ISO_8859_1_B2);\nkeycodes_iso_8859_1[19] = M(ISO_8859_1_B3);\nkeycodes_iso_8859_1[20] = M(ISO_8859_1_B4);\nkeycodes_iso_8859_1[21] = M(ISO_8859_1_B5);\nkeycodes_iso_8859_1[22] = M(ISO_8859_1_B6);\nkeycodes_iso_8859_1[23] = M(ISO_8859_1_B7);\nkeycodes_iso_8859_1[24] = M(ISO_8859_1_B8);\nkeycodes_iso_8859_1[25] = M(ISO_8859_1_B9);\nkeycodes_iso_8859_1[26] = M(ISO_8859_1_BA);\nkeycodes_iso_8859_1[27] = M(ISO_8859_1_BB);\nkeycodes_iso_8859_1[28] = M(ISO_8859_1_BC);\nkeycodes_iso_8859_1[29] = M(ISO_8859_1_BD);\nkeycodes_iso_8859_1[30] = M(ISO_8859_1_BE);\nkeycodes_iso_8859_1[31] = M(ISO_8859_1_BF);\nkeycodes_iso_8859_1[32] = M(ISO_8859_1_C0);\nkeycodes_iso_8859_1[33] = M(ISO_8859_1_C1);\nkeycodes_iso_8859_1[34] = M(ISO_8859_1_C2);\nkeycodes_iso_8859_1[35] = M(ISO_8859_1_C3);\nkeycodes_iso_8859_1[36] = M(ISO_8859_1_C4);\nkeycodes_iso_8859_1[37] = M(ISO_8859_1_C5);\nkeycodes_iso_8859_1[38] = M(ISO_8859_1_C6);\nkeycodes_iso_8859_1[39] = M(ISO_8859_1_C7);\nkeycodes_iso_8859_1[40] = M(ISO_8859_1_C8);\nkeycodes_iso_8859_1[41] = M(ISO_8859_1_C9);\nkeycodes_iso_8859_1[42] = M(ISO_8859_1_CA);\nkeycodes_iso_8859_1[43] = M(ISO_8859_1_CB);\nkeycodes_iso_8859_1[44] = M(ISO_8859_1_CC);\nkeycodes_iso_8859_1[45] = M(ISO_8859_1_CD);\nkeycodes_iso_8859_1[46] = M(ISO_8859_1_CE);\nkeycodes_iso_8859_1[47] = M(ISO_8859_1_CF);\nkeycodes_iso_8859_1[48] = M(ISO_8859_1_D0);\nkeycodes_iso_8859_1[49] = M(ISO_8859_1_D1);\nkeycodes_iso_8859_1[50] = M(ISO_8859_1_D2);\nkeycodes_iso_8859_1[51] = M(ISO_8859_1_D3);\nkeycodes_iso_8859_1[52] = M(ISO_8859_1_D4);\nkeycodes_iso_8859_1[53] = M(ISO_8859_1_D5);\nkeycodes_iso_8859_1[54] = M(ISO_8859_1_D6);\nkeycodes_iso_8859_1[55] = M(ISO_8859_1_D7);\nkeycodes_iso_8859_1[56] = M(ISO_8859_1_D8);\nkeycodes_iso_8859_1[57] = M(ISO_8859_1_D9);\nkeycodes_iso_8859_1[58] = M(ISO_8859_1_DA);\nkeycodes_iso_8859_1[59] = M(ISO_8859_1_DB);\nkeycodes_iso_8859_1[60] = M(ISO_8859_1_DC);\nkeycodes_iso_8859_1[61] = M(ISO_8859_1_DD);\nkeycodes_iso_8859_1[62] = M(ISO_8859_1_DE);\nkeycodes_iso_8859_1[63] = M(ISO_8859_1_DF);\nkeycodes_iso_8859_1[64] = M(ISO_8859_1_E0);\nkeycodes_iso_8859_1[65] = M(ISO_8859_1_E1);\nkeycodes_iso_8859_1[66] = M(ISO_8859_1_E2);\nkeycodes_iso_8859_1[67] = M(ISO_8859_1_E3);\nkeycodes_iso_8859_1[68] = M(ISO_8859_1_E4);\nkeycodes_iso_8859_1[69] = M(ISO_8859_1_E5);\nkeycodes_iso_8859_1[70] = M(ISO_8859_1_E6);\nkeycodes_iso_8859_1[71] = M(ISO_8859_1_E7);\nkeycodes_iso_8859_1[72] = M(ISO_8859_1_E8);\nkeycodes_iso_8859_1[73] = M(ISO_8859_1_E9);\nkeycodes_iso_8859_1[74] = M(ISO_8859_1_EA);\nkeycodes_iso_8859_1[75] = M(ISO_8859_1_EB);\nkeycodes_iso_8859_1[76] = M(ISO_8859_1_EC);\nkeycodes_iso_8859_1[77] = M(ISO_8859_1_ED);\nkeycodes_iso_8859_1[78] = M(ISO_8859_1_EE);\nkeycodes_iso_8859_1[79] = M(ISO_8859_1_EF);\nkeycodes_iso_8859_1[80] = M(ISO_8859_1_F0);\nkeycodes_iso_8859_1[81] = M(ISO_8859_1_F1);\nkeycodes_iso_8859_1[82] = M(ISO_8859_1_F2);\nkeycodes_iso_8859_1[83] = M(ISO_8859_1_F3);\nkeycodes_iso_8859_1[84] = M(ISO_8859_1_F4);\nkeycodes_iso_8859_1[85] = M(ISO_8859_1_F5);\nkeycodes_iso_8859_1[86] = M(ISO_8859_1_F6);\nkeycodes_iso_8859_1[87] = M(ISO_8859_1_F7);\nkeycodes_iso_8859_1[88] = M(ISO_8859_1_F8);\nkeycodes_iso_8859_1[89] = M(ISO_8859_1_F9);\nkeycodes_iso_8859_1[90] = M(ISO_8859_1_FA);\nkeycodes_iso_8859_1[91] = M(ISO_8859_1_FB);\nkeycodes_iso_8859_1[92] = M(ISO_8859_1_FC);\nkeycodes_iso_8859_1[93] = M(ISO_8859_1_FD);\nkeycodes_iso_8859_1[94] = M(ISO_8859_1_FE);\nkeycodes_iso_8859_1[95] = M(ISO_8859_1_FF);\n\n\n}\n\n\n"
  },
  {
    "path": "keylayouts.h",
    "content": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp.to>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 4. The names \"OnlyKey\" and \"CryptoTrust\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    admin@crp.to.\n *\n * 5. Products derived from this software may not be called \"OnlyKey\"\n *    nor may \"OnlyKey\" or \"CryptoTrust\" appear in their names without\n *    specific prior written permission. For written permission, please\n *    contact admin@crp.to.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 7. Redistributions in any form must be accompanied by information on\n *    how to obtain complete source code for this software and any\n *    accompanying software that uses this software. The source code\n *    must either be included in the distribution or be available for\n *    no more than the cost of distribution plus a nominal fee, and must\n *    be freely redistributable under reasonable conditions. For a\n *    binary file, complete source code means the source code for all\n *    modules it contains.\n *\n * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS\n * ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT\n * LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM\n * IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE\n * SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE\n * RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY\n * THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF\n * ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER\n * APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE\n * REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION\n * BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM\n * EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL\n * SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT\n * FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS\n * AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF\n * TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS\n * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Original Teensyduino Core Library\n * http://www.pjrc.com/teensy/\n * Copyright (c) 2013 PJRC.COM, LLC.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * 1. The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * 2. If the Software is incorporated into a build system that allows\n * selection among a list of target devices, then similar target\n * devices manufactured by PJRC.COM must be included in the list of\n * target devices and selectable in the same manner.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef KEYLAYOUTS_H__\n#define KEYLAYOUTS_H__\n\n#include <stdint.h>\n#include <avr/pgmspace.h>\n\n\n\n#ifdef __cplusplus\nextern \"C\"{\n#endif\n\n#define LAYOUT_USA_ENGLISH\t0x01\n#define LAYOUT_CANADIAN_FRENCH\t0x02\n#define LAYOUT_CANADIAN_MULTILINGUAL\t0x03\n#define LAYOUT_DANISH\t0x04\n#define LAYOUT_FINNISH\t0x05\n#define LAYOUT_FRENCH\t0x06\n#define LAYOUT_FRENCH_BELGIAN\t0x07\n#define LAYOUT_FRENCH_SWISS\t0x08\n#define LAYOUT_GERMAN\t0x09\n#define LAYOUT_GERMAN_MAC\t0x0A\n#define LAYOUT_GERMAN_SWISS\t0x0B\n#define LAYOUT_ICELANDIC\t0x0C\n#define LAYOUT_IRISH\t0x0D\n#define LAYOUT_ITALIAN\t0x0E\n#define LAYOUT_NORWEGIAN\t0x0F\n#define LAYOUT_PORTUGUESE\t0x10\n#define LAYOUT_PORTUGUESE_BRAZILIAN\t0x11\n#define LAYOUT_SPANISH\t0x12\n#define LAYOUT_SPANISH_LATIN_AMERICA\t0x13\n#define LAYOUT_SWEDISH\t0x14\n#define LAYOUT_TURKISH\t0x15\n#define LAYOUT_UNITED_KINGDOM\t0x16\n#define LAYOUT_US_INTERNATIONAL\t0x17\n#define LAYOUT_CZECH\t0x18\n#define LAYOUT_SERBIAN_LATIN_ONLY\t0x19\n#define LAYOUT_HUNGARIAN    0x1A\n#define LAYOUT_DANISH_MAC    0x1B\n#define LAYOUT_DVORAK    0x1C\n\n\n// http://en.wikipedia.org/wiki/Keyboard_layout\n\n\n#define MODIFIERKEY_CTRL        ( 0x01 | 0xE000 )\n#define MODIFIERKEY_SHIFT       ( 0x02 | 0xE000 )\n#define MODIFIERKEY_ALT         ( 0x04 | 0xE000 )\n#define MODIFIERKEY_GUI         ( 0x08 | 0xE000 )\n#define MODIFIERKEY_LEFT_CTRL   ( 0x01 | 0xE000 )\n#define MODIFIERKEY_LEFT_SHIFT  ( 0x02 | 0xE000 )\n#define MODIFIERKEY_LEFT_ALT    ( 0x04 | 0xE000 )\n#define MODIFIERKEY_LEFT_GUI    ( 0x08 | 0xE000 )\n#define MODIFIERKEY_RIGHT_CTRL  ( 0x10 | 0xE000 )\n#define MODIFIERKEY_RIGHT_SHIFT ( 0x20 | 0xE000 )\n#define MODIFIERKEY_RIGHT_ALT   ( 0x40 | 0xE000 )\n#define MODIFIERKEY_RIGHT_GUI   ( 0x80 | 0xE000 )\n\n#define KEY_SYSTEM_POWER_DOWN   ( 0x81 | 0xE200 )\n#define KEY_SYSTEM_SLEEP        ( 0x82 | 0xE200 )\n#define KEY_SYSTEM_WAKE_UP      ( 0x83 | 0xE200 )\n\n#define KEY_MEDIA_EJECT         0x80\n#define KEY_MEDIA_VOLUME_INC    0x01\n\n#define KEY_A                   (   4  | 0xF000 )\n#define KEY_B                   (   5  | 0xF000 )\n#define KEY_C                   (   6  | 0xF000 )\n#define KEY_D                   (   7  | 0xF000 )\n#define KEY_E                   (   8  | 0xF000 )\n#define KEY_F                   (   9  | 0xF000 )\n#define KEY_G                   (  10  | 0xF000 )\n#define KEY_H                   (  11  | 0xF000 )\n#define KEY_I                   (  12  | 0xF000 )\n#define KEY_J                   (  13  | 0xF000 )\n#define KEY_K                   (  14  | 0xF000 )\n#define KEY_L                   (  15  | 0xF000 )\n#define KEY_M                   (  16  | 0xF000 )\n#define KEY_N                   (  17  | 0xF000 )\n#define KEY_O                   (  18  | 0xF000 )\n#define KEY_P                   (  19  | 0xF000 )\n#define KEY_Q                   (  20  | 0xF000 )\n#define KEY_R                   (  21  | 0xF000 )\n#define KEY_S                   (  22  | 0xF000 )\n#define KEY_T                   (  23  | 0xF000 )\n#define KEY_U                   (  24  | 0xF000 )\n#define KEY_V                   (  25  | 0xF000 )\n#define KEY_W                   (  26  | 0xF000 )\n#define KEY_X                   (  27  | 0xF000 )\n#define KEY_Y                   (  28  | 0xF000 )\n#define KEY_Z                   (  29  | 0xF000 )\n#define KEY_1                   (  30  | 0xF000 )\n#define KEY_2                   (  31  | 0xF000 )\n#define KEY_3                   (  32  | 0xF000 )\n#define KEY_4                   (  33  | 0xF000 )\n#define KEY_5                   (  34  | 0xF000 )\n#define KEY_6                   (  35  | 0xF000 )\n#define KEY_7                   (  36  | 0xF000 )\n#define KEY_8                   (  37  | 0xF000 )\n#define KEY_9                   (  38  | 0xF000 )\n#define KEY_0                   (  39  | 0xF000 )\n#define KEY_ENTER               (  40  | 0xF000 )\n#define KEY_ESC                 (  41  | 0xF000 )\n#define KEY_BACKSPACE           (  42  | 0xF000 )\n#define KEY_TAB                 (  43  | 0xF000 )\n#define KEY_SPACE               (  44  | 0xF000 )\n#define KEY_MINUS               (  45  | 0xF000 )\n#define KEY_EQUAL               (  46  | 0xF000 )\n#define KEY_LEFT_BRACE          (  47  | 0xF000 )\n#define KEY_RIGHT_BRACE         (  48  | 0xF000 )\n#define KEY_BACKSLASH           (  49  | 0xF000 )\n#define KEY_NON_US_NUM          (  50  | 0xF000 )\n#define KEY_SEMICOLON           (  51  | 0xF000 )\n#define KEY_QUOTE               (  52  | 0xF000 )\n#define KEY_TILDE               (  53  | 0xF000 )\n#define KEY_COMMA               (  54  | 0xF000 )\n#define KEY_PERIOD              (  55  | 0xF000 )\n#define KEY_SLASH               (  56  | 0xF000 )\n#define KEY_CAPS_LOCK           (  57  | 0xF000 )\n#define KEY_F1                  (  58  | 0xF000 )\n#define KEY_F2                  (  59  | 0xF000 )\n#define KEY_F3                  (  60  | 0xF000 )\n#define KEY_F4                  (  61  | 0xF000 )\n#define KEY_F5                  (  62  | 0xF000 )\n#define KEY_F6                  (  63  | 0xF000 )\n#define KEY_F7                  (  64  | 0xF000 )\n#define KEY_F8                  (  65  | 0xF000 )\n#define KEY_F9                  (  66  | 0xF000 )\n#define KEY_F10                 (  67  | 0xF000 )\n#define KEY_F11                 (  68  | 0xF000 )\n#define KEY_F12                 (  69  | 0xF000 )\n#define KEY_PRINTSCREEN         (  70  | 0xF000 )\n#define KEY_SCROLL_LOCK         (  71  | 0xF000 )\n#define KEY_PAUSE               (  72  | 0xF000 )\n#define KEY_INSERT              (  73  | 0xF000 )\n#define KEY_HOME                (  74  | 0xF000 )\n#define KEY_PAGE_UP             (  75  | 0xF000 )\n#define KEY_DELETE              (  76  | 0xF000 )\n#define KEY_END                 (  77  | 0xF000 )\n#define KEY_PAGE_DOWN           (  78  | 0xF000 )\n#define KEY_RIGHT               (  79  | 0xF000 )\n#define KEY_LEFT                (  80  | 0xF000 )\n#define KEY_DOWN                (  81  | 0xF000 )\n#define KEY_UP                  (  82  | 0xF000 )\n#define KEY_NUM_LOCK            (  83  | 0xF000 )\n#define KEYPAD_SLASH            (  84  | 0xF000 )\n#define KEYPAD_ASTERIX          (  85  | 0xF000 )\n#define KEYPAD_MINUS            (  86  | 0xF000 )\n#define KEYPAD_PLUS             (  87  | 0xF000 )\n#define KEYPAD_ENTER            (  88  | 0xF000 )\n#define KEYPAD_1                (  89  | 0xF000 )\n#define KEYPAD_2                (  90  | 0xF000 )\n#define KEYPAD_3                (  91  | 0xF000 )\n#define KEYPAD_4                (  92  | 0xF000 )\n#define KEYPAD_5                (  93  | 0xF000 )\n#define KEYPAD_6                (  94  | 0xF000 )\n#define KEYPAD_7                (  95  | 0xF000 )\n#define KEYPAD_8                (  96  | 0xF000 )\n#define KEYPAD_9                (  97  | 0xF000 )\n#define KEYPAD_0                (  98  | 0xF000 )\n#define KEYPAD_PERIOD           (  99  | 0xF000 )\n#define KEY_NON_US_BS           ( 100  | 0xF000 )\n#define KEY_MENU        \t( 101  | 0xF000 )\n#define KEY_F13                 ( 104  | 0xF000 )\n#define KEY_F14                 ( 105  | 0xF000 )\n#define KEY_F15                 ( 106  | 0xF000 )\n#define KEY_F16                 ( 107  | 0xF000 )\n#define KEY_F17                 ( 108  | 0xF000 )\n#define KEY_F18                 ( 109  | 0xF000 )\n#define KEY_F19                 ( 110  | 0xF000 )\n#define KEY_F20                 ( 111  | 0xF000 )\n#define KEY_F21                 ( 112  | 0xF000 )\n#define KEY_F22                 ( 113  | 0xF000 )\n#define KEY_F23                 ( 114  | 0xF000 )\n#define KEY_F24                 ( 115  | 0xF000 )\n\n\n// for compatibility with Leonardo's slightly different names\n#define KEY_UP_ARROW\tKEY_UP\n#define KEY_DOWN_ARROW\tKEY_DOWN\n#define KEY_LEFT_ARROW\tKEY_LEFT\n#define KEY_RIGHT_ARROW\tKEY_RIGHT\n#define KEY_RETURN\tKEY_ENTER\n#define KEY_LEFT_CTRL\tMODIFIERKEY_LEFT_CTRL\n#define KEY_LEFT_SHIFT\tMODIFIERKEY_LEFT_SHIFT\n#define KEY_LEFT_ALT\tMODIFIERKEY_LEFT_ALT\n#define KEY_LEFT_GUI\tMODIFIERKEY_LEFT_GUI\n#define KEY_RIGHT_CTRL\tMODIFIERKEY_RIGHT_CTRL\n#define KEY_RIGHT_SHIFT\tMODIFIERKEY_RIGHT_SHIFT\n#define KEY_RIGHT_ALT\tMODIFIERKEY_RIGHT_ALT\n#define KEY_RIGHT_GUI\tMODIFIERKEY_RIGHT_GUI\n\n#define KEYCODE_TYPE\tuint16_t\n\nextern void update_keyboard_layout();\nextern KEYCODE_TYPE keycodes_ascii[];\nextern KEYCODE_TYPE keycodes_iso_8859_1[];\n\n#ifdef __cplusplus\n} // extern \"C\"\n#endif\n\n#endif\n"
  },
  {
    "path": "usb_desc.c",
    "content": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp.to>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 4. The names \"OnlyKey\" and \"CryptoTrust\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    admin@crp.to.\n *\n * 5. Products derived from this software may not be called \"OnlyKey\"\n *    nor may \"OnlyKey\" or \"CryptoTrust\" appear in their names without\n *    specific prior written permission. For written permission, please\n *    contact admin@crp.to.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 7. Redistributions in any form must be accompanied by information on\n *    how to obtain complete source code for this software and any\n *    accompanying software that uses this software. The source code\n *    must either be included in the distribution or be available for\n *    no more than the cost of distribution plus a nominal fee, and must\n *    be freely redistributable under reasonable conditions. For a\n *    binary file, complete source code means the source code for all\n *    modules it contains.\n *\n * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS\n * ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT\n * LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM\n * IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE\n * SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE\n * RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY\n * THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF\n * ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER\n * APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE\n * REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION\n * BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM\n * EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL\n * SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT\n * FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS\n * AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF\n * TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS\n * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Original Teensyduino Core Library\n * http://www.pjrc.com/teensy/\n * Copyright (c) 2013 PJRC.COM, LLC.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * 1. The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * 2. If the Software is incorporated into a build system that allows\n * selection among a list of target devices, then similar target\n * devices manufactured by PJRC.COM must be included in the list of\n * target devices and selectable in the same manner.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#if F_CPU >= 20000000\n\n#define USB_DESC_LIST_DEFINE\n#include \"usb_desc.h\"\n#ifdef NUM_ENDPOINTS\n#include \"usb_names.h\"\n#include \"kinetis.h\"\n#include \"avr_functions.h\"\n\n// USB Descriptors are binary data which the USB host reads to\n// automatically detect a USB device's capabilities.  The format\n// and meaning of every field is documented in numerous USB\n// standards.  When working with USB descriptors, despite the\n// complexity of the standards and poor writing quality in many\n// of those documents, remember descriptors are nothing more\n// than constant binary data that tells the USB host what the\n// device can do.  Computers will load drivers based on this data.\n// Those drivers then communicate on the endpoints specified by\n// the descriptors.\n\n// To configure a new combination of interfaces or make minor\n// changes to existing configuration (eg, change the name or ID\n// numbers), usually you would edit \"usb_desc.h\".  This file\n// is meant to be configured by the header, so generally it is\n// only edited to add completely new USB interfaces or features.\n\n\n\n// **************************************************************\n//   USB Device\n// **************************************************************\n\n#define LSB(n) ((n) & 255)\n#define MSB(n) (((n) >> 8) & 255)\n\n// USB Device Descriptor.  The USB host reads this first, to learn\n// what type of device is connected.\nstatic uint8_t device_descriptor[] = {\n        18,                                     // bLength\n        1,                                      // bDescriptorType\n        0x00, 0x02,                             // bcdUSB\n#ifdef DEVICE_CLASS\n        DEVICE_CLASS,                           // bDeviceClass\n#else\n\t0,\n#endif\n#ifdef DEVICE_SUBCLASS\n        DEVICE_SUBCLASS,                        // bDeviceSubClass\n#else\n\t0,\n#endif\n#ifdef DEVICE_PROTOCOL\n        DEVICE_PROTOCOL,                        // bDeviceProtocol\n#else\n\t0,\n#endif\n        EP0_SIZE,                               // bMaxPacketSize0\n        LSB(VENDOR_ID), MSB(VENDOR_ID),         // idVendor\n        LSB(PRODUCT_ID), MSB(PRODUCT_ID),       // idProduct\n        0x00, 0x01,                             // bcdDevice\n        1,                                      // iManufacturer\n        2,                                      // iProduct\n        3,                                      // iSerialNumber\n        1                                       // bNumConfigurations\n};\n\n// These descriptors must NOT be \"const\", because the USB DMA\n// has trouble accessing flash memory with enough bandwidth\n// while the processor is executing from flash.\n\n\n\n// **************************************************************\n//   HID Report Descriptors\n// **************************************************************\n\n// Each HID interface needs a special report descriptor that tells\n// the meaning and format of the data.\n\n#ifdef KEYBOARD_INTERFACE\n// Keyboard Protocol 1, HID 1.11 spec, Appendix B, page 59-60\nstatic uint8_t keyboard_report_desc[] = {\n        0x05, 0x01,             //  Usage Page (Generic Desktop),\n        0x09, 0x06,             //  Usage (Keyboard),\n        0xA1, 0x01,             //  Collection (Application),\n\t\t0x05, 0x07,             //  Usage Page (Key Codes),\n\t\t0x19, 0xE0,             //  Usage Minimum (224),\n\t\t0x29, 0xE7,             //  Usage Maximum (231),\n\t\t0x15, 0x00,             //  Logical Minimum (0),\n        0x25, 0x01,             //  Logical Maximum (1),\n        0x75, 0x01,             //  Report Size (1),\n        0x95, 0x08,             //  Report Count (8),\n        0x81, 0x02,             //  Input (Data, Variable, Absolute), ;Modifier byte\n        0x95, 0x01,             //  Report Count (1),\n        0x75, 0x08,             //  Report Size (8),\n        0x05, 0x0C,             //  Usage Page (Consumer),\n        0x09, 0xB8,             //  Usage (Eject),\n        0x81, 0x01,             //  Input (Data, Variable, Absolute), ;Media keys\n        0x95, 0x05,             //  Report Count (5),\n        0x75, 0x01,             //  Report Size (1),\n        0x05, 0x08,             //  Usage Page (LEDs),\n        0x19, 0x01,             //  Usage Minimum (1),\n        0x29, 0x05,             //  Usage Maximum (5),\n        0x91, 0x02,             //  Output (Data, Variable, Absolute), ;LED report\n        0x95, 0x01,             //  Report Count (1),\n        0x75, 0x03,             //  Report Size (3),\n        0x91, 0x01,             //  Output (Constant),                 ;LED report padding\n        0x95, 0x06,             //  Report Count (6),\n        0x75, 0x08,             //  Report Size (8),\n        0x15, 0x00,             //  Logical Minimum (0),\n        0x25, 0x7F,             //  Logical Maximum(104),\n        0x05, 0x07,             //  Usage Page (Key Codes),\n        0x19, 0x00,             //  Usage Minimum (0),\n        0x29, 0x7F,             //  Usage Maximum (104),\n        0x81, 0x00,             //  Input (Data, Array),                ;Normal keys\n        0x09, 0x76,             //  usage (local)\n        0x95, 0x08,             //  Report Count (8),\n        0x75, 0x08,             //  Report Size (8),\n        0xB1, 0x02,             //  Feature\n        0xC0                    //  End Collection\n};\n\n//Old report desc\n/*\n        0x05, 0x01,             //  Usage Page (Generic Desktop),\n        0x09, 0x06,             //  Usage (Keyboard),\n        0xA1, 0x01,             //  Collection (Application),\n        0x75, 0x01,             //  Report Size (1),\n        0x95, 0x08,             //  Report Count (8),\n        0x05, 0x07,             //  Usage Page (Key Codes),\n        0x19, 0xE0,             //  Usage Minimum (224),\n        0x29, 0xE7,             //  Usage Maximum (231),\n        0x15, 0x00,             //  Logical Minimum (0),\n        0x25, 0x01,             //  Logical Maximum (1),\n        0x81, 0x02,             //  Input (Data, Variable, Absolute), ;Modifier byte\n        0x95, 0x08,             //  Report Count (8),\n        0x75, 0x01,             //  Report Size (1),\n        0x15, 0x00,             //  Logical Minimum (0),\n        0x25, 0x01,             //  Logical Maximum (1),\n        0x05, 0x0C,             //  Usage Page (Consumer),\n        0x09, 0xB8,             //  Usage (Eject),\n        0x81, 0x02,             //  Input (Data, Variable, Absolute), ;Media keys\n        0x95, 0x05,             //  Report Count (5),\n        0x75, 0x01,             //  Report Size (1),\n        0x05, 0x08,             //  Usage Page (LEDs),\n        0x19, 0x01,             //  Usage Minimum (1),\n        0x29, 0x05,             //  Usage Maximum (5),\n        0x91, 0x02,             //  Output (Data, Variable, Absolute), ;LED report\n        0x95, 0x01,             //  Report Count (1),\n        0x75, 0x03,             //  Report Size (3),\n        0x91, 0x03,             //  Output (Constant),                 ;LED report padding\n        0x95, 0x06,             //  Report Count (6),\n        0x75, 0x08,             //  Report Size (8),\n        0x15, 0x00,             //  Logical Minimum (0),\n        0x25, 0x7F,             //  Logical Maximum(104),\n        0x05, 0x07,             //  Usage Page (Key Codes),\n        0x19, 0x00,             //  Usage Minimum (0),\n        0x29, 0x7F,             //  Usage Maximum (104),\n        0x81, 0x00,             //  Input (Data, Array),                ;Normal keys\n\t\t0x95, 0x08,           //   report count (global)\n        0x09, 0x76,                     //   usage (local)\n        0xB1, 0x02,                     //   Feature\n        0xc0                    // End Collection\n};\n*/\n#endif\n\n#ifdef MOUSE_INTERFACE\n// Mouse Protocol 1, HID 1.11 spec, Appendix B, page 59-60, with wheel extension\nstatic uint8_t mouse_report_desc[] = {\n        0x05, 0x01,                     // Usage Page (Generic Desktop)\n        0x09, 0x02,                     // Usage (Mouse)\n        0xA1, 0x01,                     // Collection (Application)\n        0x85, 0x01,                     //   REPORT_ID (1)\n        0x05, 0x09,                     //   Usage Page (Button)\n        0x19, 0x01,                     //   Usage Minimum (Button #1)\n        0x29, 0x08,                     //   Usage Maximum (Button #8)\n        0x15, 0x00,                     //   Logical Minimum (0)\n        0x25, 0x01,                     //   Logical Maximum (1)\n        0x95, 0x08,                     //   Report Count (8)\n        0x75, 0x01,                     //   Report Size (1)\n        0x81, 0x02,                     //   Input (Data, Variable, Absolute)\n        0x05, 0x01,                     //   Usage Page (Generic Desktop)\n        0x09, 0x30,                     //   Usage (X)\n        0x09, 0x31,                     //   Usage (Y)\n        0x09, 0x38,                     //   Usage (Wheel)\n        0x15, 0x81,                     //   Logical Minimum (-127)\n        0x25, 0x7F,                     //   Logical Maximum (127)\n        0x75, 0x08,                     //   Report Size (8),\n        0x95, 0x03,                     //   Report Count (3),\n        0x81, 0x06,                     //   Input (Data, Variable, Relative)\n        0xC0,                           // End Collection\n        0x05, 0x01,                     // Usage Page (Generic Desktop)\n        0x09, 0x02,                     // Usage (Mouse)\n        0xA1, 0x01,                     // Collection (Application)\n        0x85, 0x02,                     //   REPORT_ID (2)\n        0x05, 0x01,                     //   Usage Page (Generic Desktop)\n        0x09, 0x30,                     //   Usage (X)\n        0x09, 0x31,                     //   Usage (Y)\n        0x15, 0x00,                     //   Logical Minimum (0)\n        0x26, 0xFF, 0x7F,               //   Logical Maximum (32767)\n        0x75, 0x10,                     //   Report Size (16),\n        0x95, 0x02,                     //   Report Count (2),\n        0x81, 0x02,                     //   Input (Data, Variable, Absolute)\n        0xC0                            // End Collection\n};\n#endif\n\n#ifdef JOYSTICK_INTERFACE\nstatic uint8_t joystick_report_desc[] = {\n        0x05, 0x01,                     // Usage Page (Generic Desktop)\n        0x09, 0x04,                     // Usage (Joystick)\n        0xA1, 0x01,                     // Collection (Application)\n        0x15, 0x00,                     // Logical Minimum (0)\n        0x25, 0x01,                     // Logical Maximum (1)\n        0x75, 0x01,                     // Report Size (1)\n        0x95, 0x20,                     // Report Count (32)\n        0x05, 0x09,                     // Usage Page (Button)\n        0x19, 0x01,                     // Usage Minimum (Button #1)\n        0x29, 0x20,                     // Usage Maximum (Button #32)\n        0x81, 0x02,                     // Input (variable,absolute)\n        0x15, 0x00,                     // Logical Minimum (0)\n        0x25, 0x07,                     // Logical Maximum (7)\n        0x35, 0x00,                     // Physical Minimum (0)\n        0x46, 0x3B, 0x01,               // Physical Maximum (315)\n        0x75, 0x04,                     // Report Size (4)\n        0x95, 0x01,                     // Report Count (1)\n        0x65, 0x14,                     // Unit (20)\n        0x05, 0x01,                     // Usage Page (Generic Desktop)\n        0x09, 0x39,                     // Usage (Hat switch)\n        0x81, 0x42,                     // Input (variable,absolute,null_state)\n        0x05, 0x01,                     // Usage Page (Generic Desktop)\n        0x09, 0x01,                     // Usage (Pointer)\n        0xA1, 0x00,                     // Collection ()\n        0x15, 0x00,                     //   Logical Minimum (0)\n        0x26, 0xFF, 0x03,               //   Logical Maximum (1023)\n        0x75, 0x0A,                     //   Report Size (10)\n        0x95, 0x04,                     //   Report Count (4)\n        0x09, 0x30,                     //   Usage (X)\n        0x09, 0x31,                     //   Usage (Y)\n        0x09, 0x32,                     //   Usage (Z)\n        0x09, 0x35,                     //   Usage (Rz)\n        0x81, 0x02,                     //   Input (variable,absolute)\n        0xC0,                           // End Collection\n        0x15, 0x00,                     // Logical Minimum (0)\n        0x26, 0xFF, 0x03,               // Logical Maximum (1023)\n        0x75, 0x0A,                     // Report Size (10)\n        0x95, 0x02,                     // Report Count (2)\n        0x09, 0x36,                     // Usage (Slider)\n        0x09, 0x36,                     // Usage (Slider)\n        0x81, 0x02,                     // Input (variable,absolute)\n        0xC0                            // End Collection\n};\n#endif\n\n#ifdef SEREMU_INTERFACE\nstatic uint8_t seremu_report_desc[] = {\n        0x06, 0xC9, 0xFF,                       // Usage Page 0xFFC9 (vendor defined)\n        0x09, 0x04,                             // Usage 0x04\n        0xA1, 0x5C,                             // Collection 0x5C\n        0x75, 0x08,                             // report size = 8 bits (global)\n        0x15, 0x00,                             // logical minimum = 0 (global)\n        0x26, 0xFF, 0x00,                       // logical maximum = 255 (global)\n        0x95, SEREMU_TX_SIZE,                   // report count (global)\n        0x09, 0x75,                             // usage (local)\n        0x81, 0x02,                             // Input\n        0x95, SEREMU_RX_SIZE,                   // report count (global)\n        0x09, 0x76,                             // usage (local)\n        0x91, 0x02,                             // Output\n        0x95, 0x04,                             // report count (global)\n        0x09, 0x76,                             // usage (local)\n        0xB1, 0x02,                             // Feature\n        0xC0                                    // end collection\n};\n#endif\n\n#ifdef RAWHID_INTERFACE\nstatic uint8_t rawhid_report_desc[] = {\n        0x06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), //Usage Page 06 D0 F1\n        0x09, LSB(RAWHID_USAGE), \t\t\t\t// Usage 09 01\n        0xA1, 0x01,                             // Collection 0x01\n        0x09, 0x20,                             // Usage\n        0x15, 0x00,                             // logical minimum = 0\n        0x26, 0xFF, 0x00,                       // logical maximum = 255\n        0x75, 0x08,                   // report count\n        0x95, 0x40,                             // usage\n        0x81, 0x02,                             // Input (array)\n        0x09, 0x21,                   \n        0x15, 0x00,                             \n        0x26, 0xFF, 0x00, \n        0x75, 0x08, \n        0x95, 0x40, \n        0x91, 0x02, \n        0xC0,                                   // end collection\n};\n#endif\n\n#ifdef RAWHID_INTERFACE2\nstatic uint8_t rawhid_report_desc2[] = {\n        0x06, LSB(RAWHID_USAGE_PAGE2), MSB(RAWHID_USAGE_PAGE2), //Usage Page 06 D0 F1\n        0x09, LSB(RAWHID_USAGE2), \t\t\t\t// Usage 09 01\n        0xA1, 0x01,                             // Collection 0x01\n        0x09, 0x20,                             // Usage\n        0x15, 0x00,                             // logical minimum = 0\n        0x26, 0xFF, 0x00,                       // logical maximum = 255\n        0x75, 0x08,                   // report count\n        0x95, 0x40,                             // usage\n        0x81, 0x02,                             // Input (array)\n        0x09, 0x21,                   \n        0x15, 0x00,                             \n        0x26, 0xFF, 0x00, \n        0x75, 0x08, \n        0x95, 0x40, \n        0x91, 0x02, \n        0xC0,                                   // end collection\n};\n#endif\n\n#ifdef FLIGHTSIM_INTERFACE\nstatic uint8_t flightsim_report_desc[] = {\n        0x06, 0x1C, 0xFF,                       // Usage page = 0xFF1C\n        0x0A, 0x39, 0xA7,                       // Usage = 0xA739\n        0xA1, 0x01,                             // Collection 0x01\n        0x75, 0x08,                             // report size = 8 bits\n        0x15, 0x00,                             // logical minimum = 0\n        0x26, 0xFF, 0x00,                       // logical maximum = 255\n        0x95, FLIGHTSIM_TX_SIZE,                // report count\n        0x09, 0x01,                             // usage\n        0x81, 0x02,                             // Input (array)\n        0x95, FLIGHTSIM_RX_SIZE,                // report count\n        0x09, 0x02,                             // usage\n        0x91, 0x02,                             // Output (array)\n        0xC0                                    // end collection\n};\n#endif\n\n\n// **************************************************************\n//   USB Descriptor Sizes\n// **************************************************************\n\n// pre-compute the size and position of everything in the config descriptor\n//\n#define CONFIG_HEADER_DESCRIPTOR_SIZE\t9\n\n#define CDC_IAD_DESCRIPTOR_POS\t\tCONFIG_HEADER_DESCRIPTOR_SIZE\n#ifdef  CDC_IAD_DESCRIPTOR\n#define CDC_IAD_DESCRIPTOR_SIZE\t\t8\n#else\n#define CDC_IAD_DESCRIPTOR_SIZE\t\t0\n#endif\n\n#define CDC_DATA_INTERFACE_DESC_POS\tCDC_IAD_DESCRIPTOR_POS+CDC_IAD_DESCRIPTOR_SIZE\n#ifdef  CDC_DATA_INTERFACE\n#define CDC_DATA_INTERFACE_DESC_SIZE\t9+5+5+4+5+7+9+7+7\n#else\n#define CDC_DATA_INTERFACE_DESC_SIZE\t0\n#endif\n\n#define MIDI_INTERFACE_DESC_POS\t\tCDC_DATA_INTERFACE_DESC_POS+CDC_DATA_INTERFACE_DESC_SIZE\n#ifdef  MIDI_INTERFACE\n#define MIDI_INTERFACE_DESC_SIZE\t9+7+6+6+9+9+9+5+9+5\n#else\n#define MIDI_INTERFACE_DESC_SIZE\t0\n#endif\n\n#define KEYBOARD_INTERFACE_DESC_POS\tMIDI_INTERFACE_DESC_POS+MIDI_INTERFACE_DESC_SIZE\n#ifdef  KEYBOARD_INTERFACE\n#define KEYBOARD_INTERFACE_DESC_SIZE\t9+9+7\n#define KEYBOARD_HID_DESC_OFFSET\tKEYBOARD_INTERFACE_DESC_POS+9\n#else\n#define KEYBOARD_INTERFACE_DESC_SIZE\t0\n#endif\n\n#define MOUSE_INTERFACE_DESC_POS\tKEYBOARD_INTERFACE_DESC_POS+KEYBOARD_INTERFACE_DESC_SIZE\n#ifdef  MOUSE_INTERFACE\n#define MOUSE_INTERFACE_DESC_SIZE\t9+9+7\n#define MOUSE_HID_DESC_OFFSET\t\tMOUSE_INTERFACE_DESC_POS+9\n#else\n#define MOUSE_INTERFACE_DESC_SIZE\t0\n#endif\n\n#define RAWHID_INTERFACE_DESC_POS\tMOUSE_INTERFACE_DESC_POS+MOUSE_INTERFACE_DESC_SIZE\n#ifdef  RAWHID_INTERFACE\n#define RAWHID_INTERFACE_DESC_SIZE\t9+9+7+7\n#define RAWHID_HID_DESC_OFFSET\t\tRAWHID_INTERFACE_DESC_POS+9\n#else\n#define RAWHID_INTERFACE_DESC_SIZE\t0\n#endif\n\n#define RAWHID_INTERFACE_DESC_POS2\tRAWHID_INTERFACE_DESC_POS+RAWHID_INTERFACE_DESC_SIZE\n#ifdef  RAWHID_INTERFACE2\n#define RAWHID_INTERFACE_DESC_SIZE2\t9+9+7+7\n#define RAWHID_HID_DESC_OFFSET2\t\tRAWHID_INTERFACE_DESC_POS2+9\n#else\n#define RAWHID_INTERFACE_DESC_SIZE2\t0\n#endif\n\n#define FLIGHTSIM_INTERFACE_DESC_POS\tRAWHID_INTERFACE_DESC_POS2+RAWHID_INTERFACE_DESC_SIZE2\n#ifdef  FLIGHTSIM_INTERFACE\n#define FLIGHTSIM_INTERFACE_DESC_SIZE\t9+9+7+7\n#define FLIGHTSIM_HID_DESC_OFFSET\tFLIGHTSIM_INTERFACE_DESC_POS+9\n#else\n#define FLIGHTSIM_INTERFACE_DESC_SIZE\t0\n#endif\n\n#define SEREMU_INTERFACE_DESC_POS\tFLIGHTSIM_INTERFACE_DESC_POS+FLIGHTSIM_INTERFACE_DESC_SIZE\n#ifdef  SEREMU_INTERFACE\n#define SEREMU_INTERFACE_DESC_SIZE\t9+9+7+7\n#define SEREMU_HID_DESC_OFFSET\t\tSEREMU_INTERFACE_DESC_POS+9\n#else\n#define SEREMU_INTERFACE_DESC_SIZE\t0\n#endif\n\n#define JOYSTICK_INTERFACE_DESC_POS\tSEREMU_INTERFACE_DESC_POS+SEREMU_INTERFACE_DESC_SIZE\n#ifdef  JOYSTICK_INTERFACE\n#define JOYSTICK_INTERFACE_DESC_SIZE\t9+9+7\n#define JOYSTICK_HID_DESC_OFFSET\tJOYSTICK_INTERFACE_DESC_POS+9\n#else\n#define JOYSTICK_INTERFACE_DESC_SIZE\t0\n#endif\n\n#define MTP_INTERFACE_DESC_POS\t\tJOYSTICK_INTERFACE_DESC_POS+JOYSTICK_INTERFACE_DESC_SIZE\n#ifdef  MTP_INTERFACE\n#define MTP_INTERFACE_DESC_SIZE\t\t9+7+7+7\n#else\n#define MTP_INTERFACE_DESC_SIZE\t0\n#endif\n\n#define CONFIG_DESC_SIZE\t\tMTP_INTERFACE_DESC_POS+MTP_INTERFACE_DESC_SIZE\n\n\n\n// **************************************************************\n//   USB Configuration\n// **************************************************************\n\n// USB Configuration Descriptor.  This huge descriptor tells all\n// of the devices capbilities.\nstatic uint8_t config_descriptor[CONFIG_DESC_SIZE] = {\n        // configuration descriptor, USB spec 9.6.3, page 264-266, Table 9-10\n        9,                                      // bLength;\n        2,                                      // bDescriptorType;\n        LSB(CONFIG_DESC_SIZE),                 // wTotalLength\n        MSB(CONFIG_DESC_SIZE),\n        NUM_INTERFACE,                          // bNumInterfaces\n        1,                                      // bConfigurationValue\n        0,                                      // iConfiguration\n        0x80,                                   // bmAttributes\n        50,                                     // bMaxPower\n\n#ifdef CDC_IAD_DESCRIPTOR\n        // interface association descriptor, USB ECN, Table 9-Z\n        8,                                      // bLength\n        11,                                     // bDescriptorType\n        CDC_STATUS_INTERFACE,                   // bFirstInterface\n        2,                                      // bInterfaceCount\n        0x02,                                   // bFunctionClass\n        0x02,                                   // bFunctionSubClass\n        0x01,                                   // bFunctionProtocol\n        4,                                      // iFunction\n#endif\n\n#ifdef CDC_DATA_INTERFACE\n        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12\n        9,                                      // bLength\n        4,                                      // bDescriptorType\n        CDC_STATUS_INTERFACE,\t\t\t// bInterfaceNumber\n        0,                                      // bAlternateSetting\n        1,                                      // bNumEndpoints\n        0x02,                                   // bInterfaceClass\n        0x02,                                   // bInterfaceSubClass\n        0x01,                                   // bInterfaceProtocol\n        0,                                      // iInterface\n        // CDC Header Functional Descriptor, CDC Spec 5.2.3.1, Table 26\n        5,                                      // bFunctionLength\n        0x24,                                   // bDescriptorType\n        0x00,                                   // bDescriptorSubtype\n        0x10, 0x01,                             // bcdCDC\n        // Call Management Functional Descriptor, CDC Spec 5.2.3.2, Table 27\n        5,                                      // bFunctionLength\n        0x24,                                   // bDescriptorType\n        0x01,                                   // bDescriptorSubtype\n        0x01,                                   // bmCapabilities\n        1,                                      // bDataInterface\n        // Abstract Control Management Functional Descriptor, CDC Spec 5.2.3.3, Table 28\n        4,                                      // bFunctionLength\n        0x24,                                   // bDescriptorType\n        0x02,                                   // bDescriptorSubtype\n        0x06,                                   // bmCapabilities\n        // Union Functional Descriptor, CDC Spec 5.2.3.8, Table 33\n        5,                                      // bFunctionLength\n        0x24,                                   // bDescriptorType\n        0x06,                                   // bDescriptorSubtype\n        CDC_STATUS_INTERFACE,                   // bMasterInterface\n        CDC_DATA_INTERFACE,                     // bSlaveInterface0\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        CDC_ACM_ENDPOINT | 0x80,                // bEndpointAddress\n        0x03,                                   // bmAttributes (0x03=intr)\n        CDC_ACM_SIZE, 0,                        // wMaxPacketSize\n        64,                                     // bInterval\n        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12\n        9,                                      // bLength\n        4,                                      // bDescriptorType\n        CDC_DATA_INTERFACE,                     // bInterfaceNumber\n        0,                                      // bAlternateSetting\n        2,                                      // bNumEndpoints\n        0x0A,                                   // bInterfaceClass\n        0x00,                                   // bInterfaceSubClass\n        0x00,                                   // bInterfaceProtocol\n        0,                                      // iInterface\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        CDC_RX_ENDPOINT,                        // bEndpointAddress\n        0x02,                                   // bmAttributes (0x02=bulk)\n        CDC_RX_SIZE, 0,                         // wMaxPacketSize\n        0,                                      // bInterval\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        CDC_TX_ENDPOINT | 0x80,                 // bEndpointAddress\n        0x02,                                   // bmAttributes (0x02=bulk)\n        CDC_TX_SIZE, 0,                         // wMaxPacketSize\n        0,                                      // bInterval\n#endif // CDC_DATA_INTERFACE\n\n#ifdef MIDI_INTERFACE\n        // Standard MS Interface Descriptor,\n        9,                                      // bLength\n        4,                                      // bDescriptorType\n        MIDI_INTERFACE,                         // bInterfaceNumber\n        0,                                      // bAlternateSetting\n        2,                                      // bNumEndpoints\n        0x01,                                   // bInterfaceClass (0x01 = Audio)\n        0x03,                                   // bInterfaceSubClass (0x03 = MIDI)\n        0x00,                                   // bInterfaceProtocol (unused for MIDI)\n        0,                                      // iInterface\n        // MIDI MS Interface Header, USB MIDI 6.1.2.1, page 21, Table 6-2\n        7,                                      // bLength\n        0x24,                                   // bDescriptorType = CS_INTERFACE\n        0x01,                                   // bDescriptorSubtype = MS_HEADER\n        0x00, 0x01,                             // bcdMSC = revision 01.00\n        0x41, 0x00,                             // wTotalLength\n        // MIDI IN Jack Descriptor, B.4.3, Table B-7 (embedded), page 40\n        6,                                      // bLength\n        0x24,                                   // bDescriptorType = CS_INTERFACE\n        0x02,                                   // bDescriptorSubtype = MIDI_IN_JACK\n        0x01,                                   // bJackType = EMBEDDED\n        1,                                      // bJackID, ID = 1\n        0,                                      // iJack\n        // MIDI IN Jack Descriptor, B.4.3, Table B-8 (external), page 40\n        6,                                      // bLength\n        0x24,                                   // bDescriptorType = CS_INTERFACE\n        0x02,                                   // bDescriptorSubtype = MIDI_IN_JACK\n        0x02,                                   // bJackType = EXTERNAL\n        2,                                      // bJackID, ID = 2\n        0,                                      // iJack\n        // MIDI OUT Jack Descriptor, B.4.4, Table B-9, page 41\n        9,\n        0x24,                                   // bDescriptorType = CS_INTERFACE\n        0x03,                                   // bDescriptorSubtype = MIDI_OUT_JACK\n        0x01,                                   // bJackType = EMBEDDED\n        3,                                      // bJackID, ID = 3\n        1,                                      // bNrInputPins = 1 pin\n        2,                                      // BaSourceID(1) = 2\n        1,                                      // BaSourcePin(1) = first pin\n        0,                                      // iJack\n        // MIDI OUT Jack Descriptor, B.4.4, Table B-10, page 41\n        9,\n        0x24,                                   // bDescriptorType = CS_INTERFACE\n        0x03,                                   // bDescriptorSubtype = MIDI_OUT_JACK\n        0x02,                                   // bJackType = EXTERNAL\n        4,                                      // bJackID, ID = 4\n        1,                                      // bNrInputPins = 1 pin\n        1,                                      // BaSourceID(1) = 1\n        1,                                      // BaSourcePin(1) = first pin\n        0,                                      // iJack\n        // Standard Bulk OUT Endpoint Descriptor, B.5.1, Table B-11, pae 42\n        9,                                      // bLength\n        5,                                      // bDescriptorType = ENDPOINT\n        MIDI_RX_ENDPOINT,                       // bEndpointAddress\n        0x02,                                   // bmAttributes (0x02=bulk)\n        MIDI_RX_SIZE, 0,                        // wMaxPacketSize\n        0,                                      // bInterval\n        0,                                      // bRefresh\n        0,                                      // bSynchAddress\n        // Class-specific MS Bulk OUT Endpoint Descriptor, B.5.2, Table B-12, page 42\n        5,                                      // bLength\n        0x25,                                   // bDescriptorSubtype = CS_ENDPOINT\n        0x01,                                   // bJackType = MS_GENERAL\n        1,                                      // bNumEmbMIDIJack = 1 jack\n        1,                                      // BaAssocJackID(1) = jack ID #1\n        // Standard Bulk IN Endpoint Descriptor, B.5.1, Table B-11, pae 42\n        9,                                      // bLength\n        5,                                      // bDescriptorType = ENDPOINT\n        MIDI_TX_ENDPOINT | 0x80,                // bEndpointAddress\n        0x02,                                   // bmAttributes (0x02=bulk)\n        MIDI_TX_SIZE, 0,                        // wMaxPacketSize\n        0,                                      // bInterval\n        0,                                      // bRefresh\n        0,                                      // bSynchAddress\n        // Class-specific MS Bulk IN Endpoint Descriptor, B.5.2, Table B-12, page 42\n        5,                                      // bLength\n        0x25,                                   // bDescriptorSubtype = CS_ENDPOINT\n        0x01,                                   // bJackType = MS_GENERAL\n        1,                                      // bNumEmbMIDIJack = 1 jack\n        3,                                      // BaAssocJackID(1) = jack ID #3\n#endif // MIDI_INTERFACE\n\n#ifdef KEYBOARD_INTERFACE\n        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12\n        9,                                      // bLength\n        4,                                      // bDescriptorType\n        KEYBOARD_INTERFACE,                     // bInterfaceNumber\n        0,                                      // bAlternateSetting\n        1,                                      // bNumEndpoints\n        0x03,                                   // bInterfaceClass (0x03 = HID)\n        0x01,                                   // bInterfaceSubClass (0x01 = Boot)\n        0x01,                                   // bInterfaceProtocol (0x01 = Keyboard)\n        0x02,                                      // iInterface\n        // HID interface descriptor, HID 1.11 spec, section 6.2.1\n        9,                                      // bLength\n        0x21,                                   // bDescriptorType\n        0x11, 0x01,                             // bcdHID\n        0,                                      // bCountryCode\n        1,                                      // bNumDescriptors\n        0x22,                                   // bDescriptorType\n        LSB(sizeof(keyboard_report_desc)),      // wDescriptorLength\n        MSB(sizeof(keyboard_report_desc)),\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        KEYBOARD_ENDPOINT | 0x80,               // bEndpointAddress\n        0x03,                                   // bmAttributes (0x03=intr)\n        KEYBOARD_SIZE, 0,                       // wMaxPacketSize\n        KEYBOARD_INTERVAL,                      // bInterval\n#endif // KEYBOARD_INTERFACE\n\n#ifdef MOUSE_INTERFACE\n        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12\n        9,                                      // bLength\n        4,                                      // bDescriptorType\n        MOUSE_INTERFACE,                        // bInterfaceNumber\n        0,                                      // bAlternateSetting\n        1,                                      // bNumEndpoints\n        0x03,                                   // bInterfaceClass (0x03 = HID)\n        0x00,                                   // bInterfaceSubClass (0x01 = Boot)\n        0x00,                                   // bInterfaceProtocol (0x02 = Mouse)\n        0,                                      // iInterface\n        // HID interface descriptor, HID 1.11 spec, section 6.2.1\n        9,                                      // bLength\n        0x21,                                   // bDescriptorType\n        0x11, 0x01,                             // bcdHID\n        0,                                      // bCountryCode\n        1,                                      // bNumDescriptors\n        0x22,                                   // bDescriptorType\n        LSB(sizeof(mouse_report_desc)),         // wDescriptorLength\n        MSB(sizeof(mouse_report_desc)),\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        MOUSE_ENDPOINT | 0x80,                  // bEndpointAddress\n        0x03,                                   // bmAttributes (0x03=intr)\n        MOUSE_SIZE, 0,                          // wMaxPacketSize\n        MOUSE_INTERVAL,                         // bInterval\n#endif // MOUSE_INTERFACE\n\n#ifdef RAWHID_INTERFACE\n        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12\n        9,                                      // bLength\n        4,                                      // bDescriptorType\n        RAWHID_INTERFACE,                       // bInterfaceNumber\n        0,                                      // bAlternateSetting\n        2,                                      // bNumEndpoints\n        0x03,                                   // bInterfaceClass (0x03 = HID)\n        0x00,                                   // bInterfaceSubClass\n        0x00,                                   // bInterfaceProtocol\n        0x02,                                      // iInterface\n        // HID interface descriptor, HID 1.11 spec, section 6.2.1\n        9,                                      // bLength\n        0x21,                                   // bDescriptorType\n        0x11, 0x01,                             // bcdHID\n        0,                                      // bCountryCode\n        1,                                      // bNumDescriptors\n        0x22,                                   // bDescriptorType\n        LSB(sizeof(rawhid_report_desc)),        // wDescriptorLength\n        MSB(sizeof(rawhid_report_desc)),\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        RAWHID_TX_ENDPOINT | 0x80,              // bEndpointAddress\n        0x03,                                   // bmAttributes (0x03=intr)\n        RAWHID_TX_SIZE, 0,                      // wMaxPacketSize\n        RAWHID_TX_INTERVAL,                     // bInterval\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        RAWHID_RX_ENDPOINT,                     // bEndpointAddress\n        0x03,                                   // bmAttributes (0x03=intr)\n        RAWHID_RX_SIZE, 0,                      // wMaxPacketSize\n        RAWHID_RX_INTERVAL,\t\t\t// bInterval\n#endif // RAWHID_INTERFACE\n\n#ifdef RAWHID_INTERFACE2\n        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12\n        9,                                      // bLength\n        4,                                      // bDescriptorType\n        RAWHID_INTERFACE2,                       // bInterfaceNumber\n        0,                                      // bAlternateSetting\n        2,                                      // bNumEndpoints\n        0x03,                                   // bInterfaceClass (0x03 = HID)\n        0x00,                                   // bInterfaceSubClass\n        0x00,                                   // bInterfaceProtocol\n        0x02,                                      // iInterface\n        // HID interface descriptor, HID 1.11 spec, section 6.2.1\n        9,                                      // bLength\n        0x21,                                   // bDescriptorType\n        0x11, 0x01,                             // bcdHID\n        0,                                      // bCountryCode\n        1,                                      // bNumDescriptors\n        0x22,                                   // bDescriptorType\n        LSB(sizeof(rawhid_report_desc2)),        // wDescriptorLength\n        MSB(sizeof(rawhid_report_desc2)),\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        RAWHID_TX_ENDPOINT2 | 0x80,              // bEndpointAddress\n        0x03,                                   // bmAttributes (0x03=intr)\n        RAWHID_TX_SIZE, 0,                      // wMaxPacketSize\n        RAWHID_TX_INTERVAL,                     // bInterval\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        RAWHID_RX_ENDPOINT2,                     // bEndpointAddress\n        0x03,                                   // bmAttributes (0x03=intr)\n        RAWHID_RX_SIZE, 0,                      // wMaxPacketSize\n        RAWHID_RX_INTERVAL,\t\t\t// bInterval\n#endif // RAWHID_INTERFACE\n\n#ifdef FLIGHTSIM_INTERFACE\n        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12\n        9,                                      // bLength\n        4,                                      // bDescriptorType\n        FLIGHTSIM_INTERFACE,                    // bInterfaceNumber\n        0,                                      // bAlternateSetting\n        2,                                      // bNumEndpoints\n        0x03,                                   // bInterfaceClass (0x03 = HID)\n        0x00,                                   // bInterfaceSubClass\n        0x00,                                   // bInterfaceProtocol\n        0,                                      // iInterface\n        // HID interface descriptor, HID 1.11 spec, section 6.2.1\n        9,                                      // bLength\n        0x21,                                   // bDescriptorType\n        0x11, 0x01,                             // bcdHID\n        0,                                      // bCountryCode\n        1,                                      // bNumDescriptors\n        0x22,                                   // bDescriptorType\n        LSB(sizeof(flightsim_report_desc)),     // wDescriptorLength\n        MSB(sizeof(flightsim_report_desc)),\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        FLIGHTSIM_TX_ENDPOINT | 0x80,           // bEndpointAddress\n        0x03,                                   // bmAttributes (0x03=intr)\n        FLIGHTSIM_TX_SIZE, 0,                   // wMaxPacketSize\n        FLIGHTSIM_TX_INTERVAL,                  // bInterval\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        FLIGHTSIM_RX_ENDPOINT,                  // bEndpointAddress\n        0x03,                                   // bmAttributes (0x03=intr)\n        FLIGHTSIM_RX_SIZE, 0,                   // wMaxPacketSize\n        FLIGHTSIM_RX_INTERVAL,\t\t\t// bInterval\n#endif // FLIGHTSIM_INTERFACE\n\n#ifdef SEREMU_INTERFACE\n        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12\n        9,                                      // bLength\n        4,                                      // bDescriptorType\n        SEREMU_INTERFACE,                       // bInterfaceNumber\n        0,                                      // bAlternateSetting\n        2,                                      // bNumEndpoints\n        0x03,                                   // bInterfaceClass (0x03 = HID)\n        0x00,                                   // bInterfaceSubClass\n        0x00,                                   // bInterfaceProtocol\n        0,                                      // iInterface\n        // HID interface descriptor, HID 1.11 spec, section 6.2.1\n        9,                                      // bLength\n        0x21,                                   // bDescriptorType\n        0x11, 0x01,                             // bcdHID\n        0,                                      // bCountryCode\n        1,                                      // bNumDescriptors\n        0x22,                                   // bDescriptorType\n        LSB(sizeof(seremu_report_desc)),        // wDescriptorLength\n        MSB(sizeof(seremu_report_desc)),\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        SEREMU_TX_ENDPOINT | 0x80,              // bEndpointAddress\n        0x03,                                   // bmAttributes (0x03=intr)\n        SEREMU_TX_SIZE, 0,                      // wMaxPacketSize\n        SEREMU_TX_INTERVAL,                     // bInterval\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        SEREMU_RX_ENDPOINT,                     // bEndpointAddress\n        0x03,                                   // bmAttributes (0x03=intr)\n        SEREMU_RX_SIZE, 0,                      // wMaxPacketSize\n        SEREMU_RX_INTERVAL,\t\t\t// bInterval\n#endif // SEREMU_INTERFACE\n\n#ifdef JOYSTICK_INTERFACE\n        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12\n        9,                                      // bLength\n        4,                                      // bDescriptorType\n        JOYSTICK_INTERFACE,                     // bInterfaceNumber\n        0,                                      // bAlternateSetting\n        1,                                      // bNumEndpoints\n        0x03,                                   // bInterfaceClass (0x03 = HID)\n        0x00,                                   // bInterfaceSubClass\n        0x00,                                   // bInterfaceProtocol\n        0,                                      // iInterface\n        // HID interface descriptor, HID 1.11 spec, section 6.2.1\n        9,                                      // bLength\n        0x21,                                   // bDescriptorType\n        0x11, 0x01,                             // bcdHID\n        0,                                      // bCountryCode\n        1,                                      // bNumDescriptors\n        0x22,                                   // bDescriptorType\n        LSB(sizeof(joystick_report_desc)),      // wDescriptorLength\n        MSB(sizeof(joystick_report_desc)),\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        JOYSTICK_ENDPOINT | 0x80,               // bEndpointAddress\n        0x03,                                   // bmAttributes (0x03=intr)\n        JOYSTICK_SIZE, 0,                       // wMaxPacketSize\n        JOYSTICK_INTERVAL,                      // bInterval\n#endif // JOYSTICK_INTERFACE\n\n#ifdef MTP_INTERFACE\n        // interface descriptor, USB spec 9.6.5, page 267-269, Table 9-12\n        9,                                      // bLength\n        4,                                      // bDescriptorType\n        MTP_INTERFACE,                          // bInterfaceNumber\n        0,                                      // bAlternateSetting\n        3,                                      // bNumEndpoints\n        0x06,                                   // bInterfaceClass (0x06 = still image)\n        0x01,                                   // bInterfaceSubClass\n        0x01,                                   // bInterfaceProtocol\n        0,                                      // iInterface\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        MTP_TX_ENDPOINT | 0x80,                 // bEndpointAddress\n        0x02,                                   // bmAttributes (0x02=bulk)\n        MTP_TX_SIZE, 0,                         // wMaxPacketSize\n        0,                                      // bInterval\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        MTP_RX_ENDPOINT,                        // bEndpointAddress\n        0x02,                                   // bmAttributes (0x02=bulk)\n        MTP_RX_SIZE, 0,                         // wMaxPacketSize\n        0,                                      // bInterval\n        // endpoint descriptor, USB spec 9.6.6, page 269-271, Table 9-13\n        7,                                      // bLength\n        5,                                      // bDescriptorType\n        MTP_EVENT_ENDPOINT | 0x80,              // bEndpointAddress\n        0x03,                                   // bmAttributes (0x03=intr)\n        MTP_EVENT_SIZE, 0,                      // wMaxPacketSize\n        MTP_EVENT_INTERVAL,                     // bInterval\n#endif // MTP_INTERFACE\n};\n\n\n// **************************************************************\n//   String Descriptors\n// **************************************************************\n\n// The descriptors above can provide human readable strings,\n// referenced by index numbers.  These descriptors are the\n// actual string data\n\n/* defined in usb_names.h\nstruct usb_string_descriptor_struct {\n        uint8_t bLength;\n        uint8_t bDescriptorType;\n        uint16_t wString[];\n};\n*/\n\nextern struct usb_string_descriptor_struct usb_string_manufacturer_name\n        __attribute__ ((weak, alias(\"usb_string_manufacturer_name_default\")));\nextern struct usb_string_descriptor_struct usb_string_product_name\n        __attribute__ ((weak, alias(\"usb_string_product_name_default\")));\nextern struct usb_string_descriptor_struct usb_string_serial_number\n        __attribute__ ((weak, alias(\"usb_string_serial_number_default\")));\n\nstruct usb_string_descriptor_struct string0 = {\n        4,\n        3,\n        {0x0409}\n};\n\nstruct usb_string_descriptor_struct usb_string_manufacturer_name_default = {\n        2 + MANUFACTURER_NAME_LEN * 2,\n        3,\n        MANUFACTURER_NAME\n};\nstruct usb_string_descriptor_struct usb_string_product_name_default = {\n\t2 + PRODUCT_NAME_LEN * 2,\n        3,\n        PRODUCT_NAME\n};\nstruct usb_string_descriptor_struct usb_string_serial_number_default = {\n        12,\n        3,\n        {0,0,0,0,0,0,0,0,0,0}\n};\n\nvoid usb_init_serialnumber(void)\n{\n\tchar buf[11];\n\tuint32_t i, num = 1000000000;\n\n\t//__disable_irq();\n\t//FTFL_FSTAT = FTFL_FSTAT_RDCOLERR | FTFL_FSTAT_ACCERR | FTFL_FSTAT_FPVIOL;\n\t//FTFL_FCCOB0 = 0x41;\n\t//FTFL_FCCOB1 = 15;\n\t//FTFL_FSTAT = FTFL_FSTAT_CCIF;\n\t//while (!(FTFL_FSTAT & FTFL_FSTAT_CCIF)) ; // wait\n\t//num = 1000000000;\n\t//__enable_irq();\n\t// add extra zero to work around OS-X CDC-ACM driver bug\n\t//if (num < 10000000) num = num * 10;\n\tultoa(num, buf, 10);\n\tfor (i=0; i<10; i++) {\n\t\tchar c = buf[i];\n\t\tif (!c) break;\n\t\tusb_string_serial_number_default.wString[i] = c;\n\t}\n\tusb_string_serial_number_default.bLength = i * 2 + 2;\n}\n\n\n// **************************************************************\n//   Descriptors List\n// **************************************************************\n\n// This table provides access to all the descriptor data above.\n\nconst usb_descriptor_list_t usb_descriptor_list[] = {\n\t//wValue, wIndex, address,          length\n\t{0x0100, 0x0000, device_descriptor, sizeof(device_descriptor)},\n\t{0x0200, 0x0000, config_descriptor, sizeof(config_descriptor)},\n#ifdef SEREMU_INTERFACE\n\t{0x2200, SEREMU_INTERFACE, seremu_report_desc, sizeof(seremu_report_desc)},\n\t{0x2100, SEREMU_INTERFACE, config_descriptor+SEREMU_HID_DESC_OFFSET, 9},\n#endif\n#ifdef KEYBOARD_INTERFACE\n        {0x2200, KEYBOARD_INTERFACE, keyboard_report_desc, sizeof(keyboard_report_desc)},\n        {0x2100, KEYBOARD_INTERFACE, config_descriptor+KEYBOARD_HID_DESC_OFFSET, 9},\n#endif\n#ifdef MOUSE_INTERFACE\n        {0x2200, MOUSE_INTERFACE, mouse_report_desc, sizeof(mouse_report_desc)},\n        {0x2100, MOUSE_INTERFACE, config_descriptor+MOUSE_HID_DESC_OFFSET, 9},\n#endif\n#ifdef JOYSTICK_INTERFACE\n        {0x2200, JOYSTICK_INTERFACE, joystick_report_desc, sizeof(joystick_report_desc)},\n        {0x2100, JOYSTICK_INTERFACE, config_descriptor+JOYSTICK_HID_DESC_OFFSET, 9},\n#endif\n#ifdef RAWHID_INTERFACE\n\t{0x2200, RAWHID_INTERFACE, rawhid_report_desc, sizeof(rawhid_report_desc)},\n\t{0x2100, RAWHID_INTERFACE, config_descriptor+RAWHID_HID_DESC_OFFSET, 9},\n#endif\n#ifdef RAWHID_INTERFACE2\n\t{0x2200, RAWHID_INTERFACE2, rawhid_report_desc2, sizeof(rawhid_report_desc2)},\n\t{0x2100, RAWHID_INTERFACE2, config_descriptor+RAWHID_HID_DESC_OFFSET2, 9},\n#endif\n#ifdef FLIGHTSIM_INTERFACE\n\t{0x2200, FLIGHTSIM_INTERFACE, flightsim_report_desc, sizeof(flightsim_report_desc)},\n\t{0x2100, FLIGHTSIM_INTERFACE, config_descriptor+FLIGHTSIM_HID_DESC_OFFSET, 9},\n#endif\n        //{0x0201, 0x0000, (const uint8_t *)&string0, 0},\n\t{0x0300, 0x0000, (const uint8_t *)&string0, 0},\n\t{0x0300, 0x0409, (const uint8_t *)&string0, 0},\n\t{0x0201, 0x0000, (const uint8_t *)&string0, 0},\n        {0x0301, 0x0409, (const uint8_t *)&usb_string_manufacturer_name, 0},\n        {0x0302, 0x0409, (const uint8_t *)&usb_string_product_name, 0},\n        {0x0303, 0x0409, (const uint8_t *)&usb_string_serial_number, 0},\n\t{0, 0, NULL, 0}\n};\n\n\n// **************************************************************\n//   Endpoint Configuration\n// **************************************************************\n\n#if 0\n// 0x00 = not used\n// 0x19 = Recieve only\n// 0x15 = Transmit only\n// 0x1D = Transmit & Recieve\n//\nconst uint8_t usb_endpoint_config_table[NUM_ENDPOINTS] =\n{\n\t0x00, 0x15, 0x19, 0x15, 0x00, 0x00, 0x00, 0x00,\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n};\n#endif\n\n\nconst uint8_t usb_endpoint_config_table[NUM_ENDPOINTS] =\n{\n#if (defined(ENDPOINT1_CONFIG) && NUM_ENDPOINTS >= 1)\n\tENDPOINT1_CONFIG,\n#elif (NUM_ENDPOINTS >= 1)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT2_CONFIG) && NUM_ENDPOINTS >= 2)\n\tENDPOINT2_CONFIG,\n#elif (NUM_ENDPOINTS >= 2)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT3_CONFIG) && NUM_ENDPOINTS >= 3)\n\tENDPOINT3_CONFIG,\n#elif (NUM_ENDPOINTS >= 3)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT4_CONFIG) && NUM_ENDPOINTS >= 4)\n\tENDPOINT4_CONFIG,\n#elif (NUM_ENDPOINTS >= 4)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT5_CONFIG) && NUM_ENDPOINTS >= 5)\n\tENDPOINT5_CONFIG,\n#elif (NUM_ENDPOINTS >= 5)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT6_CONFIG) && NUM_ENDPOINTS >= 6)\n\tENDPOINT6_CONFIG,\n#elif (NUM_ENDPOINTS >= 6)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT7_CONFIG) && NUM_ENDPOINTS >= 7)\n\tENDPOINT7_CONFIG,\n#elif (NUM_ENDPOINTS >= 7)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT8_CONFIG) && NUM_ENDPOINTS >= 8)\n\tENDPOINT8_CONFIG,\n#elif (NUM_ENDPOINTS >= 8)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT9_CONFIG) && NUM_ENDPOINTS >= 9)\n\tENDPOINT9_CONFIG,\n#elif (NUM_ENDPOINTS >= 9)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT10_CONFIG) && NUM_ENDPOINTS >= 10)\n\tENDPOINT10_CONFIG,\n#elif (NUM_ENDPOINTS >= 10)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT11_CONFIG) && NUM_ENDPOINTS >= 11)\n\tENDPOINT11_CONFIG,\n#elif (NUM_ENDPOINTS >= 11)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT12_CONFIG) && NUM_ENDPOINTS >= 12)\n\tENDPOINT12_CONFIG,\n#elif (NUM_ENDPOINTS >= 12)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT13_CONFIG) && NUM_ENDPOINTS >= 13)\n\tENDPOINT13_CONFIG,\n#elif (NUM_ENDPOINTS >= 13)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT14_CONFIG) && NUM_ENDPOINTS >= 14)\n\tENDPOINT14_CONFIG,\n#elif (NUM_ENDPOINTS >= 14)\n\tENDPOINT_UNUSED,\n#endif\n#if (defined(ENDPOINT15_CONFIG) && NUM_ENDPOINTS >= 15)\n\tENDPOINT15_CONFIG,\n#elif (NUM_ENDPOINTS >= 15)\n\tENDPOINT_UNUSED,\n#endif\n};\n\n\n#endif // NUM_ENDPOINTS\n#endif // F_CPU >= 20 MHz\n"
  },
  {
    "path": "usb_desc.h",
    "content": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp.to>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 4. The names \"OnlyKey\" and \"CryptoTrust\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    admin@crp.to.\n *\n * 5. Products derived from this software may not be called \"OnlyKey\"\n *    nor may \"OnlyKey\" or \"CryptoTrust\" appear in their names without\n *    specific prior written permission. For written permission, please\n *    contact admin@crp.to.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 7. Redistributions in any form must be accompanied by information on\n *    how to obtain complete source code for this software and any\n *    accompanying software that uses this software. The source code\n *    must either be included in the distribution or be available for\n *    no more than the cost of distribution plus a nominal fee, and must\n *    be freely redistributable under reasonable conditions. For a\n *    binary file, complete source code means the source code for all\n *    modules it contains.\n *\n * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS\n * ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT\n * LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM\n * IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE\n * SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE\n * RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY\n * THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF\n * ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER\n * APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE\n * REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION\n * BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM\n * EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL\n * SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT\n * FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS\n * AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF\n * TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS\n * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Original Teensyduino Core Library\n * http://www.pjrc.com/teensy/\n * Copyright (c) 2013 PJRC.COM, LLC.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * 1. The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * 2. If the Software is incorporated into a build system that allows\n * selection among a list of target devices, then similar target\n * devices manufactured by PJRC.COM must be included in the list of\n * target devices and selectable in the same manner.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef _usb_desc_h_\n#define _usb_desc_h_\n\n// This header is NOT meant to be included when compiling\n// user sketches in Arduino.  The low-level functions\n// provided by usb_dev.c are meant to be called only by\n// code which provides higher-level interfaces to the user.\n\n#include <stdint.h>\n#include <stddef.h>\n\n#define ENDPOINT_UNUSED\t\t\t0x00\n#define ENDPOINT_TRANSIMIT_ONLY\t\t0x15\n#define ENDPOINT_RECEIVE_ONLY\t\t0x19\n#define ENDPOINT_TRANSMIT_AND_RECEIVE\t0x1D\n\n/*\nEach group of #define lines below corresponds to one of the\nsettings in the Tools > USB Type menu.  This file defines what\ntype of USB device is actually created for each of those menu\noptions.\nEach \"interface\" is a set of functionality your PC or Mac will\nuse and treat as if it is a unique device.  Within each interface,\nthe \"endpoints\" are the actual communication channels.  Most\ninterfaces use 1, 2 or 3 endpoints.  By editing only this file,\nyou can customize the USB Types to be any collection of interfaces.\nTo modify a USB Type, delete the XYZ_INTERFACE lines for any\ninterfaces you wish to remove, and copy them from another USB Type\nfor any you want to add.\nGive each interface a unique number, and edit NUM_INTERFACE to\nreflect the total number of interfaces.\nNext, assign unique endpoint numbers to all the endpoints across\nall the interfaces your device has.  You can reuse an endpoint\nnumber for transmit and receive, but the same endpoint number must\nnot be used twice to transmit, or twice to receive.\nMost endpoints also require their maximum size, and some also\nneed an interval specification (the number of milliseconds the\nPC will check for data from that endpoint).  For existing\ninterfaces, usually these other settings should not be changed.\nEdit NUM_ENDPOINTS to be at least the largest endpoint number used.\nEdit NUM_USB_BUFFERS to control how much memory the USB stack will\nallocate.  At least 2 should be used for each endpoint.  More\nmemory will allow higher throughput for user programs that have\nhigh latency (eg, spending time doing things other than interacting\nwith the USB).\nEdit the ENDPOINT*_CONFIG lines so each endpoint is configured\nthe proper way (transmit, receive, or both).\nIf you are using existing interfaces (making your own device with\na different set of interfaces) the code in all other files should\nautomatically adapt to the new endpoints you specify here.\nIf you need to create a new type of interface, you'll need to write\nthe code which sends and receives packets, and presents an API to\nthe user.  Usually, a pair of files are added for the actual code,\nand code is also added in usb_dev.c for any control transfers,\ninterrupt-level code, or other very low-level stuff not possible\nfrom the packet send/receive functons.  Code also is added in\nusb_inst.c to create an instance of your C++ object.\nYou may edit the Vendor and Product ID numbers, and strings.  If\nthe numbers are changed, Teensyduino may not be able to automatically\nfind and reboot your board when you click the Upload button in\nthe Arduino IDE.  You will need to press the Program button on\nTeensy to initiate programming.\nSome operating systems, especially Windows, may cache USB device\ninfo.  Changes to the device name may not update on the same\ncomputer unless the vendor or product ID numbers change, or the\n\"bcdDevice\" revision code is increased.\nIf these instructions are missing steps or could be improved, please\nlet me know?  http://forum.pjrc.com/forums/4-Suggestions-amp-Bug-Reports\n*/\n\n#if defined(USB_SERIAL)\n  #define VENDOR_ID\t\t0x16C0\n  #define PRODUCT_ID\t\t0x0483\n  #define DEVICE_CLASS\t\t2\t// 2 = Communication Class\n  #define MANUFACTURER_NAME\t{'T','e','e','n','s','y','d','u','i','n','o'}\n  #define MANUFACTURER_NAME_LEN\t11\n  #define PRODUCT_NAME\t\t{'U','S','B',' ','S','e','r','i','a','l'}\n  #define PRODUCT_NAME_LEN\t10\n  #define EP0_SIZE\t\t64\n  #define NUM_ENDPOINTS\t\t4\n  #define NUM_USB_BUFFERS\t12\n  #define NUM_INTERFACE\t\t2\n  #define CDC_STATUS_INTERFACE\t0\n  #define CDC_DATA_INTERFACE\t1\n  #define CDC_ACM_ENDPOINT\t2\n  #define CDC_RX_ENDPOINT       3\n  #define CDC_TX_ENDPOINT       4\n  #define CDC_ACM_SIZE          16\n  #define CDC_RX_SIZE           64\n  #define CDC_TX_SIZE           64\n  #define ENDPOINT2_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n  #define ENDPOINT3_CONFIG\tENDPOINT_RECEIVE_ONLY\n  #define ENDPOINT4_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n\n#elif defined(USB_HID)\n  #define VENDOR_ID\t\t0x16C0\n  #define PRODUCT_ID\t\t0x0482\n  #define MANUFACTURER_NAME\t{'T','e','e','n','s','y','d','u','i','n','o'}\n  #define MANUFACTURER_NAME_LEN\t11\n  #define PRODUCT_NAME\t\t{'K','e','y','b','o','a','r','d','/','M','o','u','s','e','/','J','o','y','s','t','i','c','k'}\n  #define PRODUCT_NAME_LEN\t23\n  #define EP0_SIZE\t\t64\n  #define NUM_ENDPOINTS         5\n  #define NUM_USB_BUFFERS\t24\n  #define NUM_INTERFACE\t\t4\n  #define SEREMU_INTERFACE      2\t// Serial emulation\n  #define SEREMU_TX_ENDPOINT    1\n  #define SEREMU_TX_SIZE        64\n  #define SEREMU_TX_INTERVAL    1\n  #define SEREMU_RX_ENDPOINT    2\n  #define SEREMU_RX_SIZE        32\n  #define SEREMU_RX_INTERVAL    2\n  #define KEYBOARD_INTERFACE    0\t// Keyboard\n  #define KEYBOARD_ENDPOINT     3\n  #define KEYBOARD_SIZE         8\n  #define KEYBOARD_INTERVAL     1\n  #define MOUSE_INTERFACE       1\t// Mouse\n  #define MOUSE_ENDPOINT        5\n  #define MOUSE_SIZE            8\n  #define MOUSE_INTERVAL        1\n  #define JOYSTICK_INTERFACE    3\t// Joystick\n  #define JOYSTICK_ENDPOINT     4\n  #define JOYSTICK_SIZE         16\n  #define JOYSTICK_INTERVAL     2\n  #define ENDPOINT1_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n  #define ENDPOINT2_CONFIG\tENDPOINT_RECEIVE_ONLY\n  #define ENDPOINT3_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n  #define ENDPOINT4_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n  #define ENDPOINT5_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n\n#elif defined(USB_SERIAL_HID)\n  #define VENDOR_ID\t\t0x16C0\n  #define PRODUCT_ID\t\t0x0487\n  #define DEVICE_CLASS\t\t0xEF\n  #define DEVICE_SUBCLASS\t0x02\n  #define DEVICE_PROTOCOL\t0x01\n  #define MANUFACTURER_NAME\t{'T','e','e','n','s','y','d','u','i','n','o'}\n  #define MANUFACTURER_NAME_LEN\t11\n  #define PRODUCT_NAME\t\t{'S','e','r','i','a','l','/','K','e','y','b','o','a','r','d','/','M','o','u','s','e','/','J','o','y','s','t','i','c','k'}\n  #define PRODUCT_NAME_LEN\t30\n  #define EP0_SIZE\t\t64\n  #define NUM_ENDPOINTS\t\t6\n  #define NUM_USB_BUFFERS\t30\n  #define NUM_INTERFACE\t\t5\n  #define CDC_IAD_DESCRIPTOR\t1\n  #define CDC_STATUS_INTERFACE\t0\n  #define CDC_DATA_INTERFACE\t1\t// Serial\n  #define CDC_ACM_ENDPOINT\t2\n  #define CDC_RX_ENDPOINT       3\n  #define CDC_TX_ENDPOINT       4\n  #define CDC_ACM_SIZE          16\n  #define CDC_RX_SIZE           64\n  #define CDC_TX_SIZE           64\n  #define KEYBOARD_INTERFACE    2\t// Keyboard\n  #define KEYBOARD_ENDPOINT     1\n  #define KEYBOARD_SIZE         8\n  #define KEYBOARD_INTERVAL     1\n  #define MOUSE_INTERFACE       3\t// Mouse\n  #define MOUSE_ENDPOINT        5\n  #define MOUSE_SIZE            8\n  #define MOUSE_INTERVAL        2\n  #define JOYSTICK_INTERFACE    4\t// Joystick\n  #define JOYSTICK_ENDPOINT     6\n  #define JOYSTICK_SIZE         16\n  #define JOYSTICK_INTERVAL     1\n  #define ENDPOINT1_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n  #define ENDPOINT2_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n  #define ENDPOINT3_CONFIG\tENDPOINT_RECEIVE_ONLY\n  #define ENDPOINT4_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n  #define ENDPOINT5_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n  #define ENDPOINT6_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n\n#elif defined(USB_MIDI)\n  #define VENDOR_ID\t\t0x16C0\n  #define PRODUCT_ID\t\t0x0485\n  #define MANUFACTURER_NAME\t{'T','e','e','n','s','y','d','u','i','n','o'}\n  #define MANUFACTURER_NAME_LEN\t11\n  #define PRODUCT_NAME\t\t{'T','e','e','n','s','y',' ','M','I','D','I'}\n  #define PRODUCT_NAME_LEN\t11\n  #define EP0_SIZE\t\t64\n  #define NUM_ENDPOINTS         4\n  #define NUM_USB_BUFFERS\t16\n  #define NUM_INTERFACE\t\t2\n  #define SEREMU_INTERFACE      1\t// Serial emulation\n  #define SEREMU_TX_ENDPOINT    1\n  #define SEREMU_TX_SIZE        64\n  #define SEREMU_TX_INTERVAL    1\n  #define SEREMU_RX_ENDPOINT    2\n  #define SEREMU_RX_SIZE        32\n  #define SEREMU_RX_INTERVAL    2\n  #define MIDI_INTERFACE        0\t// MIDI\n  #define MIDI_TX_ENDPOINT      3\n  #define MIDI_TX_SIZE          64\n  #define MIDI_RX_ENDPOINT      4\n  #define MIDI_RX_SIZE          64\n  #define ENDPOINT1_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n  #define ENDPOINT2_CONFIG\tENDPOINT_RECEIVE_ONLY\n  #define ENDPOINT3_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n  #define ENDPOINT4_CONFIG\tENDPOINT_RECEIVE_ONLY\n  \n  \n #elif defined(USB_RAWHID)\n\t\t#define VENDOR_ID             0x1d50\n\t\t#define PRODUCT_ID            0x60fc\n\t\t#define RAWHID_USAGE_PAGE\t0xf1d0  // Changed for FIDO support\n\t\t#define RAWHID_USAGE\t\t0x01  // Changed for FIDO support\n\t\t#define RAWHID_USAGE_PAGE2\t0xffab  \n\t\t#define RAWHID_USAGE2\t\t0x02  \n\t\t#define MANUFACTURER_NAME     {'C','R','Y','P','T','O','T','R','U','S','T'}\n\t\t#define MANUFACTURER_NAME_LEN\t11\n\t\t#define PRODUCT_NAME          {'O','N','L','Y','K','E','Y'}\n\t\t#define PRODUCT_NAME_LEN\t    7\n\t\t#define EP0_SIZE\t\t        64\n\t\t#define NUM_ENDPOINTS         7\n\t\t#define NUM_USB_BUFFERS\t    30\n\t\t#define NUM_INTERFACE\t\t    4\n\t\t#define RAWHID_INTERFACE      1\t// RawHID\n\t\t#define RAWHID_TX_ENDPOINT    3\n\t\t#define RAWHID_TX_SIZE        64\n\t\t#define RAWHID_TX_INTERVAL    5\n\t\t#define RAWHID_RX_ENDPOINT    4\n\t\t#define RAWHID_RX_SIZE        64\n\t\t#define RAWHID_RX_INTERVAL    5\n\t\t#define RAWHID_INTERFACE2      2\t// RawHID2\n\t\t#define RAWHID_TX_ENDPOINT2    5\n\t\t#define RAWHID_RX_ENDPOINT2    6\n\t\t#define SEREMU_INTERFACE      3\t// Serial emulation\n\t\t#define SEREMU_TX_ENDPOINT    1\n\t\t#define SEREMU_TX_SIZE        64\n\t\t#define SEREMU_TX_INTERVAL    5\n\t\t#define SEREMU_RX_ENDPOINT    2\n\t\t#define SEREMU_RX_SIZE        32\n\t\t#define SEREMU_RX_INTERVAL    2\n\t\t#define KEYBOARD_INTERFACE    0\t// Keyboard\n\t\t#define KEYBOARD_ENDPOINT     7\n\t\t#define KEYBOARD_SIZE         8\n\t\t#define KEYBOARD_INTERVAL     5\n\t\t#define ENDPOINT1_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n\t\t#define ENDPOINT2_CONFIG\tENDPOINT_RECEIVE_ONLY\n\t\t#define ENDPOINT3_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n\t\t#define ENDPOINT4_CONFIG\tENDPOINT_RECEIVE_ONLY\n\t\t#define ENDPOINT5_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n\t\t#define ENDPOINT6_CONFIG\tENDPOINT_RECEIVE_ONLY\n\t\t#define ENDPOINT7_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n\n\t\t/*\n\t\t#define VENDOR_ID             0x1d50\n\t\t#define PRODUCT_ID            0x60fc\n\t\t#define RAWHID_USAGE_PAGE\t0xf1d0  // Changed for FIDO support\n\t\t#define RAWHID_USAGE\t\t0x01  // Changed for FIDO support\n\t\t#define RAWHID_USAGE_PAGE2\t0xffab  \n\t\t#define RAWHID_USAGE2\t\t0x02  \n\t\t#define MANUFACTURER_NAME     {'C','R','Y','P','T','O','T','R','U','S','T'}\n\t\t#define MANUFACTURER_NAME_LEN\t11\n\t\t#define PRODUCT_NAME          {'O','N','L','Y','K','E','Y'}\n\t\t#define PRODUCT_NAME_LEN\t    7\n\t\t#define EP0_SIZE\t\t        64\n\t\t#define NUM_ENDPOINTS         5\n\t\t#define NUM_USB_BUFFERS\t    30\n\t\t#define NUM_INTERFACE\t\t    3\n\t\t#define RAWHID_INTERFACE      1\t// RawHID\n\t\t#define RAWHID_TX_ENDPOINT    1\n\t\t#define RAWHID_TX_SIZE        64\n\t\t#define RAWHID_TX_INTERVAL    1\n\t\t#define RAWHID_RX_ENDPOINT    2\n\t\t#define RAWHID_RX_SIZE        64\n\t\t#define RAWHID_RX_INTERVAL    1\n\t\t#define RAWHID_INTERFACE2      2\t// RawHID2\n\t\t#define RAWHID_TX_ENDPOINT2    3\n\t\t#define RAWHID_RX_ENDPOINT2    4\n\t\t#define KEYBOARD_INTERFACE    0\t// Keyboard\n\t\t#define KEYBOARD_ENDPOINT     5\n\t\t#define KEYBOARD_SIZE         8\n\t\t#define KEYBOARD_INTERVAL     1\n\t\t#define ENDPOINT1_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n\t\t#define ENDPOINT2_CONFIG\tENDPOINT_RECEIVE_ONLY\n\t\t#define ENDPOINT3_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n\t\t#define ENDPOINT4_CONFIG\tENDPOINT_RECEIVE_ONLY\n\t\t#define ENDPOINT5_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n\t\t*/\n\n  \n\n#elif defined(USB_FLIGHTSIM)\n  #define VENDOR_ID\t\t0x16C0\n  #define PRODUCT_ID\t\t0x0488\n  #define MANUFACTURER_NAME\t{'T','e','e','n','s','y','d','u','i','n','o'}\n  #define MANUFACTURER_NAME_LEN\t11\n  #define PRODUCT_NAME\t\t{'T','e','e','n','s','y',' ','F','l','i','g','h','t',' ','S','i','m',' ','C','o','n','t','r','o','l','s'}\n  #define PRODUCT_NAME_LEN\t26\n  #define EP0_SIZE\t\t64\n  #define NUM_ENDPOINTS         4\n  #define NUM_USB_BUFFERS\t20\n  #define NUM_INTERFACE\t\t2\n  #define FLIGHTSIM_INTERFACE\t0\t// Flight Sim Control\n  #define FLIGHTSIM_TX_ENDPOINT\t3\n  #define FLIGHTSIM_TX_SIZE\t64\n  #define FLIGHTSIM_TX_INTERVAL\t1\n  #define FLIGHTSIM_RX_ENDPOINT\t4\n  #define FLIGHTSIM_RX_SIZE\t64\n  #define FLIGHTSIM_RX_INTERVAL\t1\n  #define SEREMU_INTERFACE      1\t// Serial emulation\n  #define SEREMU_TX_ENDPOINT    1\n  #define SEREMU_TX_SIZE        64\n  #define SEREMU_TX_INTERVAL    1\n  #define SEREMU_RX_ENDPOINT    2\n  #define SEREMU_RX_SIZE        32\n  #define SEREMU_RX_INTERVAL    2\n  #define ENDPOINT1_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n  #define ENDPOINT2_CONFIG\tENDPOINT_RECEIVE_ONLY\n  #define ENDPOINT3_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n  #define ENDPOINT4_CONFIG\tENDPOINT_RECEIVE_ONLY\n\n#elif defined(USB_MTPDISK)\n  #define VENDOR_ID\t\t0x16C0\n  #define PRODUCT_ID\t\t0x0489\n  #define MANUFACTURER_NAME\t{'T','e','e','n','s','y','d','u','i','n','o'}\n  #define MANUFACTURER_NAME_LEN\t11\n  #define PRODUCT_NAME\t\t{'T','e','e','n','s','y',' ','M','T','P',' ','D','i','s','k'}\n  #define PRODUCT_NAME_LEN\t15\n  #define EP0_SIZE\t\t64\n  #define NUM_ENDPOINTS         4\n  #define NUM_USB_BUFFERS\t20\n  #define NUM_INTERFACE\t\t2\n  #define MTP_INTERFACE\t\t0\t// MTP Disk\n  #define MTP_TX_ENDPOINT\t3\n  #define MTP_TX_SIZE\t\t64\n  #define MTP_RX_ENDPOINT\t3\n  #define MTP_RX_SIZE\t\t64\n  #define MTP_EVENT_ENDPOINT\t4\n  #define MTP_EVENT_SIZE\t16\n  #define MTP_EVENT_INTERVAL\t10\n  #define SEREMU_INTERFACE      1\t// Serial emulation\n  #define SEREMU_TX_ENDPOINT    1\n  #define SEREMU_TX_SIZE        64\n  #define SEREMU_TX_INTERVAL    1\n  #define SEREMU_RX_ENDPOINT    2\n  #define SEREMU_RX_SIZE        32\n  #define SEREMU_RX_INTERVAL    2\n  #define ENDPOINT1_CONFIG\tENDPOINT_TRANSIMIT_ONLY\n  #define ENDPOINT2_CONFIG\tENDPOINT_RECEIVE_ONLY\n  #define ENDPOINT3_CONFIG\tENDPOINT_TRANSMIT_AND_RECEIVE\n  #define ENDPOINT4_CONFIG\tENDPOINT_RECEIVE_ONLY\n\n#endif\n\n#ifdef USB_DESC_LIST_DEFINE\n#if defined(NUM_ENDPOINTS) && NUM_ENDPOINTS > 0\n// NUM_ENDPOINTS = number of non-zero endpoints (0 to 15)\nextern const uint8_t usb_endpoint_config_table[NUM_ENDPOINTS];\n\ntypedef struct {\n\tuint16_t\twValue;\n\tuint16_t\twIndex;\n\tconst uint8_t\t*addr;\n\tuint16_t\tlength;\n} usb_descriptor_list_t;\n\nextern const usb_descriptor_list_t usb_descriptor_list[];\n#endif // NUM_ENDPOINTS\n#endif // USB_DESC_LIST_DEFINE\n\n#endif\n"
  },
  {
    "path": "usb_dev.c",
    "content": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp.to>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 4. The names \"OnlyKey\" and \"CryptoTrust\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    admin@crp.to.\n *\n * 5. Products derived from this software may not be called \"OnlyKey\"\n *    nor may \"OnlyKey\" or \"CryptoTrust\" appear in their names without\n *    specific prior written permission. For written permission, please\n *    contact admin@crp.to.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 7. Redistributions in any form must be accompanied by information on\n *    how to obtain complete source code for this software and any\n *    accompanying software that uses this software. The source code\n *    must either be included in the distribution or be available for\n *    no more than the cost of distribution plus a nominal fee, and must\n *    be freely redistributable under reasonable conditions. For a\n *    binary file, complete source code means the source code for all\n *    modules it contains.\n *\n * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS\n * ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT\n * LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM\n * IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE\n * SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE\n * RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY\n * THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF\n * ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER\n * APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE\n * REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION\n * BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM\n * EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL\n * SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT\n * FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS\n * AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF\n * TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS\n * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Original Teensyduino Core Library\n * http://www.pjrc.com/teensy/\n * Copyright (c) 2013 PJRC.COM, LLC.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * 1. The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * 2. If the Software is incorporated into a build system that allows\n * selection among a list of target devices, then similar target\n * devices manufactured by PJRC.COM must be included in the list of\n * target devices and selectable in the same manner.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include \"usb_dev.h\"\n#if F_CPU >= 20000000 && defined(NUM_ENDPOINTS)\n\n#include \"kinetis.h\"\n//#include \"HardwareSerial.h\"\n#include \"usb_mem.h\"\n\n// buffer descriptor table\n\ntypedef struct {\n\tuint32_t desc;\n\tvoid * addr;\n} bdt_t;\n\n__attribute__ ((section(\".usbdescriptortable\"), used))\nstatic bdt_t table[(NUM_ENDPOINTS+1)*4];\n\nstatic usb_packet_t *rx_first[NUM_ENDPOINTS];\nstatic usb_packet_t *rx_last[NUM_ENDPOINTS];\nstatic usb_packet_t *tx_first[NUM_ENDPOINTS];\nstatic usb_packet_t *tx_last[NUM_ENDPOINTS];\nuint16_t usb_rx_byte_count_data[NUM_ENDPOINTS];\n\nstatic uint8_t tx_state[NUM_ENDPOINTS];\n#define TX_STATE_BOTH_FREE_EVEN_FIRST\t0\n#define TX_STATE_BOTH_FREE_ODD_FIRST\t1\n#define TX_STATE_EVEN_FREE\t\t2\n#define TX_STATE_ODD_FREE\t\t3\n#define TX_STATE_NONE_FREE_EVEN_FIRST\t4\n#define TX_STATE_NONE_FREE_ODD_FIRST\t5\n\n#define BDT_OWN\t\t0x80\n#define BDT_DATA1\t0x40\n#define BDT_DATA0\t0x00\n#define BDT_DTS\t\t0x08\n#define BDT_STALL\t0x04\n#define BDT_PID(n)\t(((n) >> 2) & 15)\n\n#define BDT_DESC(count, data)\t(BDT_OWN | BDT_DTS \\\n\t\t\t\t| ((data) ? BDT_DATA1 : BDT_DATA0) \\\n\t\t\t\t| ((count) << 16))\n\n#define TX   1\n#define RX   0\n#define ODD  1\n#define EVEN 0\n#define DATA0 0\n#define DATA1 1\n#define index(endpoint, tx, odd) (((endpoint) << 2) | ((tx) << 1) | (odd))\n#define stat2bufferdescriptor(stat) (table + ((stat) >> 2))\n\n\nstatic union {\n struct {\n  union {\n   struct {\n\tuint8_t bmRequestType;\n\tuint8_t bRequest;\n   };\n\tuint16_t wRequestAndType;\n  };\n\tuint16_t wValue;\n\tuint16_t wIndex;\n\tuint16_t wLength;\n };\n struct {\n\tuint32_t word1;\n\tuint32_t word2;\n };\n} setup;\n\n\n#define GET_STATUS\t\t0\n#define CLEAR_FEATURE\t\t1\n#define SET_FEATURE\t\t3\n#define SET_ADDRESS\t\t5\n#define GET_DESCRIPTOR\t\t6\n#define SET_DESCRIPTOR\t\t7\n#define GET_CONFIGURATION\t8\n#define SET_CONFIGURATION\t9\n#define GET_INTERFACE\t\t10\n#define SET_INTERFACE\t\t11\n#define SYNCH_FRAME\t\t12\n\n// SETUP always uses a DATA0 PID for the data field of the SETUP transaction.\n// transactions in the data phase start with DATA1 and toggle (figure 8-12, USB1.1)\n// Status stage uses a DATA1 PID.\n\nstatic uint8_t ep0_rx0_buf[EP0_SIZE] __attribute__ ((aligned (4)));\nstatic uint8_t ep0_rx1_buf[EP0_SIZE] __attribute__ ((aligned (4)));\nstatic const uint8_t *ep0_tx_ptr = NULL;\nstatic uint16_t ep0_tx_len;\nstatic uint8_t ep0_tx_bdt_bank = 0;\nstatic uint8_t ep0_tx_data_toggle = 0;\n//Added from https://forum.pjrc.com/archive/index.php/t-24256.html\nstatic uint8_t *ep0_rx_ptr = NULL;\nstatic uint16_t ep0_rx_len;\nstatic uint8_t ep0_rx_bdt_bank = 0;\nstatic uint8_t ep0_rx_data_toggle = 0;\n//\nuint8_t usb_rx_memory_needed = 0;\n\nvolatile uint8_t usb_configuration = 0;\nvolatile uint8_t usb_reboot_timer = 0;\n\n\nstatic void endpoint0_stall(void)\n{\n\tUSB0_ENDPT0 = USB_ENDPT_EPSTALL | USB_ENDPT_EPRXEN | USB_ENDPT_EPTXEN | USB_ENDPT_EPHSHK;\n}\n\nstatic uint8_t endpoint0_receive(uint8_t *data) {\n//9,26,46,f7,56\n\nuint8_t *inc=table[index(0,RX,ep0_rx_bdt_bank)].addr;\nuint32_t desc=table[index(0,RX,ep0_rx_bdt_bank)].desc;\n\nuint8_t size=(desc>>16);\nuint8_t origsize=size;\n\nwhile (size--) {*data++=*inc++;}\n\ntable[index(0,RX,ep0_rx_bdt_bank)].desc=BDT_DESC(EP0_SIZE,ep0_rx_data_toggle);\nep0_rx_data_toggle ^= 1;\nep0_rx_bdt_bank ^= 1;\nreturn origsize;\n}\n\n\n\nstatic void endpoint0_transmit(const void *data, uint32_t len)\n{\n#if 0\n\tserial_print(\"tx0:\");\n\tserial_phex32((uint32_t)data);\n\tserial_print(\",\");\n\tserial_phex16(len);\n\tserial_print(ep0_tx_bdt_bank ? \", odd\" : \", even\");\n\tserial_print(ep0_tx_data_toggle ? \", d1\\n\" : \", d0\\n\");\n#endif\n\ttable[index(0, TX, ep0_tx_bdt_bank)].addr = (void *)data;\n\ttable[index(0, TX, ep0_tx_bdt_bank)].desc = BDT_DESC(len, ep0_tx_data_toggle);\n\tep0_tx_data_toggle ^= 1;\n\tep0_tx_bdt_bank ^= 1;\n}\n\nstatic uint8_t reply_buffer[8];\n\nstatic void endpoint0_ack(void)\n{\ntable[index(0,TX,ep0_tx_bdt_bank)].addr=0;\ntable[index(0,TX,ep0_tx_bdt_bank)].desc=BDT_DESC(0,ep0_tx_data_toggle);\nep0_tx_data_toggle ^= 1;\nep0_tx_bdt_bank ^= 1;\n}\n\n\nvoid wipe_usb_buffer() {\n\tvolatile uint8_t *reg;\n\tuint8_t epconf;\n\tconst uint8_t *cfg;\n\treg = &USB0_ENDPT1;\n\tcfg = usb_endpoint_config_table;\n\tint i;\n\t\tfor (i=4; i < (NUM_ENDPOINTS+1)*4; i++) {\n\t\t\tif (table[i].desc & BDT_OWN) {\n\t\t\t\tusb_free((usb_packet_t *)((uint8_t *)(table[i].addr) - 8));\n\t\t\t}\n\t\t}\n\t\t// free all queued packets\n\t\tfor (i=0; i < NUM_ENDPOINTS; i++) {\n\t\t\tusb_packet_t *p, *n;\n\t\t\tp = rx_first[i];\n\t\t\twhile (p) {\n\t\t\t\tn = p->next;\n\t\t\t\tusb_free(p);\n\t\t\t\tp = n;\n\t\t\t}\n\t\t\trx_first[i] = NULL;\n\t\t\trx_last[i] = NULL;\n\t\t\tp = tx_first[i];\n\t\t\twhile (p) {\n\t\t\t\tn = p->next;\n\t\t\t\tusb_free(p);\n\t\t\t\tp = n;\n\t\t\t}\n\t\t\ttx_first[i] = NULL;\n\t\t\ttx_last[i] = NULL;\n\t\t\tusb_rx_byte_count_data[i] = 0;\n\t\t\tswitch (tx_state[i]) {\n\t\t\t  case TX_STATE_EVEN_FREE:\n\t\t\t  case TX_STATE_NONE_FREE_EVEN_FIRST:\n\t\t\t\ttx_state[i] = TX_STATE_BOTH_FREE_EVEN_FIRST;\n\t\t\t\tbreak;\n\t\t\t  case TX_STATE_ODD_FREE:\n\t\t\t  case TX_STATE_NONE_FREE_ODD_FIRST:\n\t\t\t\ttx_state[i] = TX_STATE_BOTH_FREE_ODD_FIRST;\n\t\t\t\tbreak;\n\t\t\t  default:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tusb_rx_memory_needed = 0;\n\t\tfor (i=1; i <= NUM_ENDPOINTS; i++) {\n\t\t\tepconf = *cfg++;\n\t\t\t*reg = epconf;\n\t\t\treg += 4;\n\t\t\tif (epconf & USB_ENDPT_EPRXEN) {\n\t\t\t\tusb_packet_t *p;\n\t\t\t\tp = usb_malloc();\n\t\t\t\tif (p) {\n\t\t\t\t\ttable[index(i, RX, EVEN)].addr = p->buf;\n\t\t\t\t\ttable[index(i, RX, EVEN)].desc = BDT_DESC(64, 0);\n\t\t\t\t} else {\n\t\t\t\t\ttable[index(i, RX, EVEN)].desc = 0;\n\t\t\t\t\tusb_rx_memory_needed++;\n\t\t\t\t}\n\t\t\t\tp = usb_malloc();\n\t\t\t\tif (p) {\n\t\t\t\t\ttable[index(i, RX, ODD)].addr = p->buf;\n\t\t\t\t\ttable[index(i, RX, ODD)].desc = BDT_DESC(64, 1);\n\t\t\t\t} else {\n\t\t\t\t\ttable[index(i, RX, ODD)].desc = 0;\n\t\t\t\t\tusb_rx_memory_needed++;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttable[index(i, TX, EVEN)].desc = 0;\n\t\t\ttable[index(i, TX, ODD)].desc = 0;\n\t\t}\n}\n\nstatic void usb_setup(void)\n{\n\tconst uint8_t *data = NULL;\n\tuint32_t datalen = 0;\n\tconst usb_descriptor_list_t *list;\n\tuint32_t size;\n\tvolatile uint8_t *reg;\n\tuint8_t epconf;\n\tconst uint8_t *cfg;\n\tint i;\n\n\tswitch (setup.wRequestAndType) {\n\t  case 0x0500: // SET_ADDRESS\n\t\tbreak;\n\t  case 0x0900: // SET_CONFIGURATION\n\t\t//serial_print(\"configure\\n\");\n\t\tusb_configuration = setup.wValue;\n\t\treg = &USB0_ENDPT1;\n\t\tcfg = usb_endpoint_config_table;\n\t\t// clear all BDT entries, free any allocated memory...\n\t\tfor (i=4; i < (NUM_ENDPOINTS+1)*4; i++) {\n\t\t\tif (table[i].desc & BDT_OWN) {\n\t\t\t\tusb_free((usb_packet_t *)((uint8_t *)(table[i].addr) - 8));\n\t\t\t}\n\t\t}\n\t\t// free all queued packets\n\t\tfor (i=0; i < NUM_ENDPOINTS; i++) {\n\t\t\tusb_packet_t *p, *n;\n\t\t\tp = rx_first[i];\n\t\t\twhile (p) {\n\t\t\t\tn = p->next;\n\t\t\t\tusb_free(p);\n\t\t\t\tp = n;\n\t\t\t}\n\t\t\trx_first[i] = NULL;\n\t\t\trx_last[i] = NULL;\n\t\t\tp = tx_first[i];\n\t\t\twhile (p) {\n\t\t\t\tn = p->next;\n\t\t\t\tusb_free(p);\n\t\t\t\tp = n;\n\t\t\t}\n\t\t\ttx_first[i] = NULL;\n\t\t\ttx_last[i] = NULL;\n\t\t\tusb_rx_byte_count_data[i] = 0;\n\t\t\tswitch (tx_state[i]) {\n\t\t\t  case TX_STATE_EVEN_FREE:\n\t\t\t  case TX_STATE_NONE_FREE_EVEN_FIRST:\n\t\t\t\ttx_state[i] = TX_STATE_BOTH_FREE_EVEN_FIRST;\n\t\t\t\tbreak;\n\t\t\t  case TX_STATE_ODD_FREE:\n\t\t\t  case TX_STATE_NONE_FREE_ODD_FIRST:\n\t\t\t\ttx_state[i] = TX_STATE_BOTH_FREE_ODD_FIRST;\n\t\t\t\tbreak;\n\t\t\t  default:\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tusb_rx_memory_needed = 0;\n\t\tfor (i=1; i <= NUM_ENDPOINTS; i++) {\n\t\t\tepconf = *cfg++;\n\t\t\t*reg = epconf;\n\t\t\treg += 4;\n\t\t\tif (epconf & USB_ENDPT_EPRXEN) {\n\t\t\t\tusb_packet_t *p;\n\t\t\t\tp = usb_malloc();\n\t\t\t\tif (p) {\n\t\t\t\t\ttable[index(i, RX, EVEN)].addr = p->buf;\n\t\t\t\t\ttable[index(i, RX, EVEN)].desc = BDT_DESC(64, 0);\n\t\t\t\t} else {\n\t\t\t\t\ttable[index(i, RX, EVEN)].desc = 0;\n\t\t\t\t\tusb_rx_memory_needed++;\n\t\t\t\t}\n\t\t\t\tp = usb_malloc();\n\t\t\t\tif (p) {\n\t\t\t\t\ttable[index(i, RX, ODD)].addr = p->buf;\n\t\t\t\t\ttable[index(i, RX, ODD)].desc = BDT_DESC(64, 1);\n\t\t\t\t} else {\n\t\t\t\t\ttable[index(i, RX, ODD)].desc = 0;\n\t\t\t\t\tusb_rx_memory_needed++;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttable[index(i, TX, EVEN)].desc = 0;\n\t\t\ttable[index(i, TX, ODD)].desc = 0;\n\t\t}\n\t\tbreak;\n\t  case 0x0880: // GET_CONFIGURATION\n\t\treply_buffer[0] = usb_configuration;\n\t\tdatalen = 1;\n\t\tdata = reply_buffer;\n\t\tbreak;\n\t  case 0x0080: // GET_STATUS (device)\n\t\treply_buffer[0] = 0;\n\t\treply_buffer[1] = 0;\n\t\tdatalen = 2;\n\t\tdata = reply_buffer;\n\t\tbreak;\n\t  case 0x0082: // GET_STATUS (endpoint)\n\t\tif (setup.wIndex > NUM_ENDPOINTS) {\n\t\t\t// TODO: do we need to handle IN vs OUT here?\n\t\t\tendpoint0_stall();\n\t\t\treturn;\n\t\t}\n\t\treply_buffer[0] = 0;\n\t\treply_buffer[1] = 0;\n\t\tif (*(uint8_t *)(&USB0_ENDPT0 + setup.wIndex * 4) & 0x02) reply_buffer[0] = 1;\n\t\tdata = reply_buffer;\n\t\tdatalen = 2;\n\t\tbreak;\n\t  case 0x0102: // CLEAR_FEATURE (endpoint)\n\t\ti = setup.wIndex & 0x7F;\n\t\tif (i > NUM_ENDPOINTS || setup.wValue != 0) {\n\t\t\t// TODO: do we need to handle IN vs OUT here?\n\t\t\tendpoint0_stall();\n\t\t\treturn;\n\t\t}\n\t\t(*(uint8_t *)(&USB0_ENDPT0 + i * 4)) &= ~0x02;\n\t\t// TODO: do we need to clear the data toggle here?\n\t\tbreak;\n\t  case 0x0302: // SET_FEATURE (endpoint)\n\t\ti = setup.wIndex & 0x7F;\n\t\tif (i > NUM_ENDPOINTS || setup.wValue != 0) {\n\t\t\t// TODO: do we need to handle IN vs OUT here?\n\t\t\tendpoint0_stall();\n\t\t\treturn;\n\t\t}\n\t\t(*(uint8_t *)(&USB0_ENDPT0 + i * 4)) |= 0x02;\n\t\t// TODO: do we need to clear the data toggle here?\n\t\tbreak;\n\t  case 0x0680: // GET_DESCRIPTOR\n\t  case 0x0681:\n\t\t//serial_print(\"desc:\");\n\t\t//serial_phex16(setup.wValue);\n\t\t//serial_print(\"\\n\");\n\t\tfor (list = usb_descriptor_list; 1; list++) {\n\t\t\tif (list->addr == NULL) break;\n\t\t\t//if (setup.wValue == list->wValue &&\n\t\t\t//(setup.wIndex == list->wIndex) || ((setup.wValue >> 8) == 3)) {\n\t\t\tif (setup.wValue == list->wValue && setup.wIndex == list->wIndex) {\n\t\t\t\tdata = list->addr;\n\t\t\t\tif ((setup.wValue >> 8) == 3) {\n\t\t\t\t\t// for string descriptors, use the descriptor's\n\t\t\t\t\t// length field, allowing runtime configured\n\t\t\t\t\t// length.\n\t\t\t\t\tdatalen = *(list->addr);\n\t\t\t\t} else {\n\t\t\t\t\tdatalen = list->length;\n\t\t\t\t}\n#if 0\n\t\t\t\tserial_print(\"Desc found, \");\n\t\t\t\tserial_phex32((uint32_t)data);\n\t\t\t\tserial_print(\",\");\n\t\t\t\tserial_phex16(datalen);\n\t\t\t\tserial_print(\",\");\n\t\t\t\tserial_phex(data[0]);\n\t\t\t\tserial_phex(data[1]);\n\t\t\t\tserial_phex(data[2]);\n\t\t\t\tserial_phex(data[3]);\n\t\t\t\tserial_phex(data[4]);\n\t\t\t\tserial_phex(data[5]);\n\t\t\t\tserial_print(\"\\n\");\n#endif\n\t\t\t\tgoto send;\n\t\t\t}\n\t\t}\n\t\t//serial_print(\"desc: not found\\n\");\n\t\tendpoint0_stall();\n\t\treturn;\n#if defined(CDC_STATUS_INTERFACE)\n\t  case 0x2221: // CDC_SET_CONTROL_LINE_STATE\n\t\tusb_cdc_line_rtsdtr_millis = systick_millis_count;\n\t\tusb_cdc_line_rtsdtr = setup.wValue;\n\t\t//serial_print(\"set control line state\\n\");\n\t\tbreak;\n\t  case 0x2321: // CDC_SEND_BREAK\n\t\tbreak;\n\t  case 0x2021: // CDC_SET_LINE_CODING\n\t\t//serial_print(\"set coding, waiting...\\n\");\n\t\treturn;\n#endif\n\n#if defined(MTP_INTERFACE)\n\tcase 0x2164: // Cancel Request (PTP spec, 5.2.1, page 8)\n\t\t// TODO: required by PTP spec\n\t\tendpoint0_stall();\n\t\treturn;\n\tcase 0x2166: // Device Reset (PTP spec, 5.2.3, page 10)\n\t\t// TODO: required by PTP spec\n\t\tendpoint0_stall();\n\t\treturn;\n\tcase 0x2167: // Get Device Statis (PTP spec, 5.2.4, page 10)\n\t\t// TODO: required by PTP spec\n\t\tendpoint0_stall();\n\t\treturn;\n#endif\n\n// TODO: this does not work... why?\n#if defined(SEREMU_INTERFACE) || defined(KEYBOARD_INTERFACE)\n\t  case 0x0921: // HID SET_REPORT\n\t\tif (setup.wLength) {\n\t\t\tep0_rx_ptr=setBuffer;\n\t\t\tep0_rx_len=8;\n   \t\t}\n\t\tbreak;\n\t  case 0x0A21: // HID SET_IDLE\n\t\tbreak;\n\t  case 0x0B21: // ?\n\t\tbreak;\n\t  case 0x01a1: // HID GET_REPORT\n\t    data = getBuffer;\n\n\t\tif (setBuffer[7] >= 0x80 && setBuffer[7] <= 0x89) {\n\t\t\tfor(i=0; i<7; i++) {\n\t\t\t\tkeyboard_buffer[i+((setBuffer[7]-0x80)*7)]=setBuffer[i];\n\t\t\t}\n\t\t}\n\t    // HMACSHA1 Message Types\n\t\t// Default Report = RD 00  00 02 02 03 03 03 05 00\n\t\t// Reset/Done/ACK - Operation complete\n\t\tif (setBuffer[7] == 0x8f || (setBuffer[7] < 0x89 && setBuffer[7] > 0x80)) {\n\t\t\tgetBuffer[1] = 0x02;\n\t\t\tgetBuffer[2] = 0x02;\n\t\t\tgetBuffer[3] = 0x03;\n\t\t\tgetBuffer[4] = sess_counter; //slot 1 and 2 configured\n\t\t\tgetBuffer[5] = 0x03;\n\t\t\tgetBuffer[6] = may_block;\n\t\t\tgetBuffer[7] = 0x00;\n\t\t\tgetBuffer[8] = 0x00;\n\t\t\tif (setBuffer[7] == 0x8f) {\n\t\t\t\tfor(i=0; i<80; i++) {\n\t\t\t\t\tkeyboard_buffer[i]=0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetBuffer[7] = 0;\n\t\t}\n\t\t// Get Serial Number - https://github.com/Yubico/yubikey-personalization/blob/7b1d7130617d652359a2226de3734f0b99edd550/ykcore/ykcore.c#L154\n\t    else if (setBuffer[1] == 0x10 && setBuffer[2] == 0x6b && setBuffer[3] == 0x5b) {\n\t\t\tgetBuffer[1] = 0x10; //10C8DF = Serial number 1099999\n\t\t\tgetBuffer[2] = 0xbf;\n\t\t\tgetBuffer[3] = 0x91;\n\t\t\tgetBuffer[4] = 0xed;\n\t\t\tgetBuffer[5] = 0x45;\n\t\t\tgetBuffer[6] = 0x00;\n\t\t\tgetBuffer[7] = 0xc0;\n\t\t\tsetBuffer[7] = 0;\n\t    }\n\t\telse if (getBuffer[7] >= 0xa1) { // Waiting for button press\n\t\t\tif (getBuffer[8] == 0x43 || getBuffer[8] == 0xA9) {\n\t\t\t\tgetBuffer[8]++;\n\t\t\t\tdata = keyboard_buffer; // Send second C0\n\t\t\t\t//Reset getBuffer\n\t\t\t\tgetBuffer[1] = 0x02;\n\t\t\t\tgetBuffer[2] = 0x02;\n\t\t\t\tgetBuffer[3] = 0x03;\n\t\t\t\tgetBuffer[4] = sess_counter;\n\t\t\t\tgetBuffer[5] = 0x03;\n\t\t\t\tgetBuffer[6] = may_block;\n\t\t\t\tgetBuffer[7] = 0x00;\n\t\t\t\tgetBuffer[8] = 0x00;\n\t\t\t\tsetBuffer[7] = 0x8f;\n\t\t\t}\n\t\t\telse if (getBuffer[8]) { // Already sent first C0\n\t\t\t\tgetBuffer[8]++;\n\t\t\t\tdata = keyboard_buffer + ((getBuffer[8]&0x0F)*8);\n\t\t\t}\n\t\t\telse if (keyboard_buffer[79] == 0xC9) {\n\t\t\t\tgetBuffer[8] = 0xA0; // 10 messages to send \n\t\t\t\tdata = keyboard_buffer; // Send 1st message (C0)\n\t\t\t}\n\t\t\telse if (keyboard_buffer[31] == 0xC3) {\n\t\t\t\tgetBuffer[8] = 0x40; // 4 messages to send\n\t\t\t\tdata = keyboard_buffer; // Send 1st message (C0)\n\t\t\t} \n\t\t}\n\t\telse if (setBuffer[7] == 0x89 && (getBuffer[6] == 0x05 || getBuffer[6] == 0x07)) { //Received all packets\n\t\t\tgetBuffer[7] = 0x89;\n\t\t\tsetBuffer[8] = 1; // Process packets\n\t\t}\n\t\tdatalen = 8;\n        goto send;\n        endpoint0_stall();\n        return;\n\t  // case 0xC940:\n#endif\n\t  default:\n\t\tendpoint0_stall();\n\t\treturn;\n\t}\n\tsend:\n\t//serial_print(\"setup send \");\n\t//serial_phex32(data);\n\t//serial_print(\",\");\n\t//serial_phex16(datalen);\n\t//serial_print(\"\\n\");\n\n\tif (datalen > setup.wLength) datalen = setup.wLength;\n\tsize = datalen;\n\tif (size > EP0_SIZE) size = EP0_SIZE;\n\tendpoint0_transmit(data, size);\n\tdata += size;\n\tdatalen -= size;\n\tif (datalen == 0 && size < EP0_SIZE) return;\n\n\tsize = datalen;\n\tif (size > EP0_SIZE) size = EP0_SIZE;\n\tendpoint0_transmit(data, size);\n\tdata += size;\n\tdatalen -= size;\n\tif (datalen == 0 && size < EP0_SIZE) return;\n\n\tep0_tx_ptr = data;\n\tep0_tx_len = datalen;\n}\n\n\n\n//A bulk endpoint's toggle sequence is initialized to DATA0 when the endpoint\n//experiences any configuration event (configuration events are explained in\n//Sections 9.1.1.5 and 9.4.5).\n\n//Configuring a device or changing an alternate setting causes all of the status\n//and configuration values associated with endpoints in the affected interfaces\n//to be set to their default values. This includes setting the data toggle of\n//any endpoint using data toggles to the value DATA0.\n\n//For endpoints using data toggle, regardless of whether an endpoint has the\n//Halt feature set, a ClearFeature(ENDPOINT_HALT) request always results in the\n//data toggle being reinitialized to DATA0.\n\n\n\n// #define stat2bufferdescriptor(stat) (table + ((stat) >> 2))\n\nstatic void usb_control(uint32_t stat)\n{\n\tbdt_t *b;\n\tuint32_t pid, size;\n\tuint8_t *buf;\n\tconst uint8_t *data;\n\n\tb = stat2bufferdescriptor(stat);\n\tpid = BDT_PID(b->desc);\n\t//count = b->desc >> 16;\n\tbuf = b->addr;\n\t//serial_print(\"pid:\");\n\t//serial_phex(pid);\n\t//serial_print(\", count:\");\n\t//serial_phex(count);\n\t//serial_print(\"\\n\");\n\n\tswitch (pid) {\n\tcase 0x0D: // Setup received from host\n\t\t//serial_print(\"PID=Setup\\n\");\n\t\t//if (count != 8) ; // panic?\n\t\t// grab the 8 byte setup info\n\t\tsetup.word1 = *(uint32_t *)(buf);\n\t\tsetup.word2 = *(uint32_t *)(buf + 4);\n\n\t\t// give the buffer back\n\t\tif ((!(setup.bmRequestType & 0x80)) && (setup.wLength>0)) {\n\t\t\tep0_rx_bdt_bank = (stat&0x04)?0:1;\n\t\t\ttable[index(0, RX, ep0_rx_bdt_bank)].desc = BDT_DESC(EP0_SIZE,DATA1);\n\t\t\ttable[index(0, RX, ep0_rx_bdt_bank^1)].desc = BDT_DESC(EP0_SIZE,DATA0);\n\t\t\tep0_rx_data_toggle = 1;\n\t\t} else {\n\t\tb->desc = BDT_DESC(EP0_SIZE, DATA1);\n\t\t//table[index(0, RX, EVEN)].desc = BDT_DESC(EP0_SIZE, 1);\n\t\t//table[index(0, RX, ODD)].desc = BDT_DESC(EP0_SIZE, 1);\n\n\t\t// clear any leftover pending IN transactions\n\t\t}\n\t\tep0_rx_ptr = NULL;\n\n\t\tif (ep0_tx_data_toggle) {\n\t\t}\n\t\t//if (table[index(0, TX, EVEN)].desc & 0x80) {\n\t\t\t//serial_print(\"leftover tx even\\n\");\n\t\t//}\n\t\t//if (table[index(0, TX, ODD)].desc & 0x80) {\n\t\t\t//serial_print(\"leftover tx odd\\n\");\n\t\t//}\n\t\ttable[index(0, TX, EVEN)].desc = 0;\n\t\ttable[index(0, TX, ODD)].desc = 0;\n\t\t// first IN after Setup is always DATA1\n\t\tep0_tx_data_toggle = 1;\n\n#if 0\n\t\tserial_print(\"bmRequestType:\");\n\t\tserial_phex(setup.bmRequestType);\n\t\tserial_print(\", bRequest:\");\n\t\tserial_phex(setup.bRequest);\n\t\tserial_print(\", wValue:\");\n\t\tserial_phex16(setup.wValue);\n\t\tserial_print(\", wIndex:\");\n\t\tserial_phex16(setup.wIndex);\n\t\tserial_print(\", len:\");\n\t\tserial_phex16(setup.wLength);\n\t\tserial_print(\"\\n\");\n#endif\n\t\t// actually \"do\" the setup request\n\t\tusb_setup();\n\t\t// unfreeze the USB, now that we're ready\n\t\tUSB0_CTL = USB_CTL_USBENSOFEN; // clear TXSUSPENDTOKENBUSY bit\n\t\tbreak;\n\tcase 0x01:  // OUT transaction received from host\n\t\tif (ep0_rx_ptr) { //if there is a pending OUT transfer\n\t\t\tuint8_t size=endpoint0_receive(ep0_rx_ptr); //receives current packet\n\t\t\tep0_rx_ptr+=size; //moves pointer ahead by received byte count\n\t\t\tep0_rx_len-=size; //decreases remaining transaction size by received byte count\n\t\tif (!ep0_rx_len) { //if we've got the whole thing\n\t\t\t//do whatever you need to here\n\t\t}\n\t\t} else {\n\t\tb->desc = BDT_DESC(EP0_SIZE, DATA1); //if no pending transfer we just free the buffer, same as we used to\n\t\t}\n\t\tbreak;\n\tcase 0x02:\n\t\t//serial_print(\"PID=OUT\\n\");\n#ifdef CDC_STATUS_INTERFACE\n\t\tif (setup.wRequestAndType == 0x2021 /*CDC_SET_LINE_CODING*/) {\n\t\t\tint i;\n\t\t\tuint8_t *dst = (uint8_t *)usb_cdc_line_coding;\n\t\t\t//serial_print(\"set line coding \");\n\t\t\tfor (i=0; i<7; i++) {\n\t\t\t\t//serial_phex(*buf);\n\t\t\t\t*dst++ = *buf++;\n\t\t\t}\n\t\t\t//serial_phex32(usb_cdc_line_coding[0]);\n\t\t\t//serial_print(\"\\n\");\n\t\t\tif (usb_cdc_line_coding[0] == 134) usb_reboot_timer = 15;\n\t\t\tendpoint0_transmit(NULL, 0);\n\t\t}\n#endif\n#ifdef KEYBOARD_INTERFACE\n\t\tif (setup.word1 == 0x02000921 && setup.word2 == ((1<<16)|KEYBOARD_INTERFACE)) {\n\t\t\tkeyboard_leds = buf[0];\n\t\t\tendpoint0_transmit(NULL, 0);\n\t\t}\n#endif\n#ifdef SEREMU_INTERFACE\n\t\tif (setup.word1 == 0x03000921 && setup.word2 == ((4<<16)|SEREMU_INTERFACE)\n\t\t  && buf[0] == 0xA9 && buf[1] == 0x45 && buf[2] == 0xC2 && buf[3] == 0x6B) {\n\t\t\tusb_reboot_timer = 5;\n\t\t\tendpoint0_transmit(NULL, 0);\n\t\t}\n#endif\n\t\t// give the buffer back\n\t\tb->desc = BDT_DESC(EP0_SIZE, DATA1);\n\t\tbreak;\n\n\tcase 0x09: // IN transaction completed to host\n\t\t//serial_print(\"PID=IN:\");\n\t\t//serial_phex(stat);\n\t\t//serial_print(\"\\n\");\n\n\t\t// send remaining data, if any...\n\t\tdata = ep0_tx_ptr;\n\t\tif (data) {\n\t\t\tsize = ep0_tx_len;\n\t\t\tif (size > EP0_SIZE) size = EP0_SIZE;\n\t\t\tendpoint0_transmit(data, size);\n\t\t\tdata += size;\n\t\t\tep0_tx_len -= size;\n\t\t\tep0_tx_ptr = (ep0_tx_len > 0 || size == EP0_SIZE) ? data : NULL;\n\t\t}\n\n\t\tif (setup.bRequest == 5 && setup.bmRequestType == 0) {\n\t\t\tsetup.bRequest = 0;\n\t\t\t//serial_print(\"set address: \");\n\t\t\t//serial_phex16(setup.wValue);\n\t\t\t//serial_print(\"\\n\");\n\t\t\tUSB0_ADDR = setup.wValue;\n\t\t}\n\n\t\tbreak;\n\t//default:\n\t\t//serial_print(\"PID=unknown:\");\n\t\t//serial_phex(pid);\n\t\t//serial_print(\"\\n\");\n\t}\n\tUSB0_CTL = USB_CTL_USBENSOFEN; // clear TXSUSPENDTOKENBUSY bit\n}\n\n\n\n\n\n\nusb_packet_t *usb_rx(uint32_t endpoint)\n{\n\tusb_packet_t *ret;\n\tendpoint--;\n\tif (endpoint >= NUM_ENDPOINTS) return NULL;\n\t__disable_irq();\n\tret = rx_first[endpoint];\n\tif (ret) {\n\t\trx_first[endpoint] = ret->next;\n\t\tusb_rx_byte_count_data[endpoint] -= ret->len;\n\t}\n\t__enable_irq();\n\t//serial_print(\"rx, epidx=\");\n\t//serial_phex(endpoint);\n\t//serial_print(\", packet=\");\n\t//serial_phex32(ret);\n\t//serial_print(\"\\n\");\n\treturn ret;\n}\n\nstatic uint32_t usb_queue_byte_count(const usb_packet_t *p)\n{\n\tuint32_t count=0;\n\n\t__disable_irq();\n\tfor ( ; p; p = p->next) {\n\t\tcount += p->len;\n\t}\n\t__enable_irq();\n\treturn count;\n}\n\n// TODO: make this an inline function...\n/*\nuint32_t usb_rx_byte_count(uint32_t endpoint)\n{\n\tendpoint--;\n\tif (endpoint >= NUM_ENDPOINTS) return 0;\n\treturn usb_rx_byte_count_data[endpoint];\n\t//return usb_queue_byte_count(rx_first[endpoint]);\n}\n*/\n\nuint32_t usb_tx_byte_count(uint32_t endpoint)\n{\n\tendpoint--;\n\tif (endpoint >= NUM_ENDPOINTS) return 0;\n\treturn usb_queue_byte_count(tx_first[endpoint]);\n}\n\nuint32_t usb_tx_packet_count(uint32_t endpoint)\n{\n\tconst usb_packet_t *p;\n\tuint32_t count=0;\n\n\tendpoint--;\n\tif (endpoint >= NUM_ENDPOINTS) return 0;\n\t__disable_irq();\n\tfor (p = tx_first[endpoint]; p; p = p->next) count++;\n\t__enable_irq();\n\treturn count;\n}\n\n\n// Called from usb_free, but only when usb_rx_memory_needed > 0, indicating\n// receive endpoints are starving for memory.  The intention is to give\n// endpoints needing receive memory priority over the user's code, which is\n// likely calling usb_malloc to obtain memory for transmitting.  When the\n// user is creating data very quickly, their consumption could starve reception\n// without this prioritization.  The packet buffer (input) is assigned to the\n// first endpoint needing memory.\n//\nvoid usb_rx_memory(usb_packet_t *packet)\n{\n\tunsigned int i;\n\tconst uint8_t *cfg;\n\n\tcfg = usb_endpoint_config_table;\n\t//serial_print(\"rx_mem:\");\n\t__disable_irq();\n\tfor (i=1; i <= NUM_ENDPOINTS; i++) {\n\t\tif (*cfg++ & USB_ENDPT_EPRXEN) {\n\t\t\tif (table[index(i, RX, EVEN)].desc == 0) {\n\t\t\t\ttable[index(i, RX, EVEN)].addr = packet->buf;\n\t\t\t\ttable[index(i, RX, EVEN)].desc = BDT_DESC(64, 0);\n\t\t\t\tusb_rx_memory_needed--;\n\t\t\t\t__enable_irq();\n\t\t\t\t//serial_phex(i);\n\t\t\t\t//serial_print(\",even\\n\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (table[index(i, RX, ODD)].desc == 0) {\n\t\t\t\ttable[index(i, RX, ODD)].addr = packet->buf;\n\t\t\t\ttable[index(i, RX, ODD)].desc = BDT_DESC(64, 1);\n\t\t\t\tusb_rx_memory_needed--;\n\t\t\t\t__enable_irq();\n\t\t\t\t//serial_phex(i);\n\t\t\t\t//serial_print(\",odd\\n\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\t__enable_irq();\n\t// we should never reach this point.  If we get here, it means\n\t// usb_rx_memory_needed was set greater than zero, but no memory\n\t// was actually needed.\n\tusb_rx_memory_needed = 0;\n\tusb_free(packet);\n\treturn;\n}\n\n//#define index(endpoint, tx, odd) (((endpoint) << 2) | ((tx) << 1) | (odd))\n//#define stat2bufferdescriptor(stat) (table + ((stat) >> 2))\n\nvoid usb_tx(uint32_t endpoint, usb_packet_t *packet)\n{\n\tbdt_t *b = &table[index(endpoint, TX, EVEN)];\n\tuint8_t next;\n\tendpoint--;\n\tif (endpoint >= NUM_ENDPOINTS) return;\n\t__disable_irq();\n\t//serial_print(\"txstate=\");\n\t//serial_phex(tx_state[endpoint]);\n\t//serial_print(\"\\n\");\n\tswitch (tx_state[endpoint]) {\n\t  case TX_STATE_BOTH_FREE_EVEN_FIRST:\n\t\tnext = TX_STATE_ODD_FREE;\n\t\tbreak;\n\t  case TX_STATE_BOTH_FREE_ODD_FIRST:\n\t\tb++;\n\t\tnext = TX_STATE_EVEN_FREE;\n\t\tbreak;\n\t  case TX_STATE_EVEN_FREE:\n\t\tnext = TX_STATE_NONE_FREE_ODD_FIRST;\n\t\tbreak;\n\t  case TX_STATE_ODD_FREE:\n\t\tb++;\n\t\tnext = TX_STATE_NONE_FREE_EVEN_FIRST;\n\t\tbreak;\n\t  default:\n\t\tif (tx_first[endpoint] == NULL) {\n\t\t\ttx_first[endpoint] = packet;\n\t\t} else {\n\t\t\ttx_last[endpoint]->next = packet;\n\t\t}\n\t\ttx_last[endpoint] = packet;\n\t\t__enable_irq();\n\t\treturn;\n\t}\n\ttx_state[endpoint] = next;\n\tb->addr = packet->buf;\n\tb->desc = BDT_DESC(packet->len, ((uint32_t)b & 8) ? DATA1 : DATA0);\n\t__enable_irq();\n}\n\n\n\n\n\n\nvoid _reboot_Teensyduino_(void)\n{\n\t// TODO: initialize R0 with a code....\n\t__asm__ volatile(\"bkpt\");\n}\n\n\n\nvoid usb_isr(void)\n{\n\tuint8_t status, stat, t;\n\n\t//serial_print(\"isr\");\n\t//status = USB0_ISTAT;\n\t//serial_phex(status);\n\t//serial_print(\"\\n\");\n\trestart:\n\tstatus = USB0_ISTAT;\n\n\tif ((status & USB_ISTAT_SOFTOK /* 04 */ )) {\n\t\tif (usb_configuration) {\n\t\t\tt = usb_reboot_timer;\n\t\t\tif (t) {\n\t\t\t\tusb_reboot_timer = --t;\n\t\t\t\tif (!t) _reboot_Teensyduino_();\n\t\t\t}\n#ifdef CDC_DATA_INTERFACE\n\t\t\tt = usb_cdc_transmit_flush_timer;\n\t\t\tif (t) {\n\t\t\t\tusb_cdc_transmit_flush_timer = --t;\n\t\t\t\tif (t == 0) usb_serial_flush_callback();\n\t\t\t}\n#endif\n#ifdef SEREMU_INTERFACE\n\t\t\tt = usb_seremu_transmit_flush_timer;\n\t\t\tif (t) {\n\t\t\t\tusb_seremu_transmit_flush_timer = --t;\n\t\t\t\tif (t == 0) usb_seremu_flush_callback();\n\t\t\t}\n#endif\n#ifdef MIDI_INTERFACE\n                        usb_midi_flush_output();\n#endif\n#ifdef FLIGHTSIM_INTERFACE\n\t\t\tusb_flightsim_flush_callback();\n#endif\n\t\t}\n\t\tUSB0_ISTAT = USB_ISTAT_SOFTOK;\n\t}\n\n\tif ((status & USB_ISTAT_TOKDNE /* 08 */ )) {\n\t\tuint8_t endpoint;\n\t\tstat = USB0_STAT;\n\t\t//serial_print(\"token: ep=\");\n\t\t//serial_phex(stat >> 4);\n\t\t//serial_print(stat & 0x08 ? \",tx\" : \",rx\");\n\t\t//serial_print(stat & 0x04 ? \",odd\\n\" : \",even\\n\");\n\t\tendpoint = stat >> 4;\n\t\tif (endpoint == 0) {\n\t\t\tusb_control(stat);\n\t\t} else {\n\t\t\tbdt_t *b = stat2bufferdescriptor(stat);\n\t\t\tusb_packet_t *packet = (usb_packet_t *)((uint8_t *)(b->addr) - 8);\n#if 0\n\t\t\tserial_print(\"ep:\");\n\t\t\tserial_phex(endpoint);\n\t\t\tserial_print(\", pid:\");\n\t\t\tserial_phex(BDT_PID(b->desc));\n\t\t\tserial_print(((uint32_t)b & 8) ? \", odd\" : \", even\");\n\t\t\tserial_print(\", count:\");\n\t\t\tserial_phex(b->desc >> 16);\n\t\t\tserial_print(\"\\n\");\n#endif\n\t\t\tendpoint--;\t// endpoint is index to zero-based arrays\n\n\t\t\tif (stat & 0x08) { // transmit\n\t\t\t\tusb_free(packet);\n\t\t\t\tpacket = tx_first[endpoint];\n\t\t\t\tif (packet) {\n\t\t\t\t\t//serial_print(\"tx packet\\n\");\n\t\t\t\t\ttx_first[endpoint] = packet->next;\n\t\t\t\t\tb->addr = packet->buf;\n\t\t\t\t\tswitch (tx_state[endpoint]) {\n\t\t\t\t\t  case TX_STATE_BOTH_FREE_EVEN_FIRST:\n\t\t\t\t\t\ttx_state[endpoint] = TX_STATE_ODD_FREE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t  case TX_STATE_BOTH_FREE_ODD_FIRST:\n\t\t\t\t\t\ttx_state[endpoint] = TX_STATE_EVEN_FREE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t  case TX_STATE_EVEN_FREE:\n\t\t\t\t\t\ttx_state[endpoint] = TX_STATE_NONE_FREE_ODD_FIRST;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t  case TX_STATE_ODD_FREE:\n\t\t\t\t\t\ttx_state[endpoint] = TX_STATE_NONE_FREE_EVEN_FIRST;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t  default:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tb->desc = BDT_DESC(packet->len, ((uint32_t)b & 8) ? DATA1 : DATA0);\n\t\t\t\t} else {\n\t\t\t\t\t//serial_print(\"tx no packet\\n\");\n\t\t\t\t\tswitch (tx_state[endpoint]) {\n\t\t\t\t\t  case TX_STATE_BOTH_FREE_EVEN_FIRST:\n\t\t\t\t\t  case TX_STATE_BOTH_FREE_ODD_FIRST:\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t  case TX_STATE_EVEN_FREE:\n\t\t\t\t\t\ttx_state[endpoint] = TX_STATE_BOTH_FREE_EVEN_FIRST;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t  case TX_STATE_ODD_FREE:\n\t\t\t\t\t\ttx_state[endpoint] = TX_STATE_BOTH_FREE_ODD_FIRST;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t  default:\n\t\t\t\t\t\ttx_state[endpoint] = ((uint32_t)b & 8) ?\n\t\t\t\t\t\t  TX_STATE_ODD_FREE : TX_STATE_EVEN_FREE;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else { // receive\n\t\t\t\tpacket->len = b->desc >> 16;\n\t\t\t\tif (packet->len > 0) {\n\t\t\t\t\tpacket->index = 0;\n\t\t\t\t\tpacket->next = NULL;\n\t\t\t\t\tif (rx_first[endpoint] == NULL) {\n\t\t\t\t\t\t//serial_print(\"rx 1st, epidx=\");\n\t\t\t\t\t\t//serial_phex(endpoint);\n\t\t\t\t\t\t//serial_print(\", packet=\");\n\t\t\t\t\t\t//serial_phex32((uint32_t)packet);\n\t\t\t\t\t\t//serial_print(\"\\n\");\n\t\t\t\t\t\trx_first[endpoint] = packet;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//serial_print(\"rx Nth, epidx=\");\n\t\t\t\t\t\t//serial_phex(endpoint);\n\t\t\t\t\t\t//serial_print(\", packet=\");\n\t\t\t\t\t\t//serial_phex32((uint32_t)packet);\n\t\t\t\t\t\t//serial_print(\"\\n\");\n\t\t\t\t\t\trx_last[endpoint]->next = packet;\n\t\t\t\t\t}\n\t\t\t\t\trx_last[endpoint] = packet;\n\t\t\t\t\tusb_rx_byte_count_data[endpoint] += packet->len;\n\t\t\t\t\t// TODO: implement a per-endpoint maximum # of allocated packets\n\t\t\t\t\t// so a flood of incoming data on 1 endpoint doesn't starve\n\t\t\t\t\t// the others if the user isn't reading it regularly\n\t\t\t\t\tpacket = usb_malloc();\n\t\t\t\t\tif (packet) {\n\t\t\t\t\t\tb->addr = packet->buf;\n\t\t\t\t\t\tb->desc = BDT_DESC(64, ((uint32_t)b & 8) ? DATA1 : DATA0);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//serial_print(\"starving \");\n\t\t\t\t\t\t//serial_phex(endpoint + 1);\n\t\t\t\t\t\t//serial_print(((uint32_t)b & 8) ? \",odd\\n\" : \",even\\n\");\n\t\t\t\t\t\tb->desc = 0;\n\t\t\t\t\t\tusb_rx_memory_needed++;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tb->desc = BDT_DESC(64, ((uint32_t)b & 8) ? DATA1 : DATA0);\n\t\t\t\t}\n\t\t\t}\n\n\n\n\n\t\t}\n\t\tUSB0_ISTAT = USB_ISTAT_TOKDNE;\n\t\tgoto restart;\n\t}\n\n\n\n\tif (status & USB_ISTAT_USBRST /* 01 */ ) {\n\t\t//serial_print(\"reset\\n\");\n\n\t\t// initialize BDT toggle bits\n\t\tUSB0_CTL = USB_CTL_ODDRST;\n\t\tep0_tx_bdt_bank = 0;\n\n\t\t// set up buffers to receive Setup and OUT packets\n\t\ttable[index(0, RX, EVEN)].desc = BDT_DESC(EP0_SIZE, 0);\n\t\ttable[index(0, RX, EVEN)].addr = ep0_rx0_buf;\n\t\ttable[index(0, RX, ODD)].desc = BDT_DESC(EP0_SIZE, 0);\n\t\ttable[index(0, RX, ODD)].addr = ep0_rx1_buf;\n\t\ttable[index(0, TX, EVEN)].desc = 0;\n\t\ttable[index(0, TX, ODD)].desc = 0;\n\n\t\t// activate endpoint 0\n\t\tUSB0_ENDPT0 = USB_ENDPT_EPRXEN | USB_ENDPT_EPTXEN | USB_ENDPT_EPHSHK;\n\n\t\t// clear all ending interrupts\n\t\tUSB0_ERRSTAT = 0xFF;\n\t\tUSB0_ISTAT = 0xFF;\n\n\t\t// set the address to zero during enumeration\n\t\tUSB0_ADDR = 0;\n\n\t\t// enable other interrupts\n\t\tUSB0_ERREN = 0xFF;\n\t\tUSB0_INTEN = USB_INTEN_TOKDNEEN |\n\t\t\tUSB_INTEN_SOFTOKEN |\n\t\t\tUSB_INTEN_STALLEN |\n\t\t\tUSB_INTEN_ERROREN |\n\t\t\tUSB_INTEN_USBRSTEN |\n\t\t\tUSB_INTEN_SLEEPEN;\n\n\t\t// is this necessary?\n\t\tUSB0_CTL = USB_CTL_USBENSOFEN;\n\t\treturn;\n\t}\n\n\n\tif ((status & USB_ISTAT_STALL /* 80 */ )) {\n\t\t//serial_print(\"stall:\\n\");\n\t\tUSB0_ENDPT0 = USB_ENDPT_EPRXEN | USB_ENDPT_EPTXEN | USB_ENDPT_EPHSHK;\n\t\tUSB0_ISTAT = USB_ISTAT_STALL;\n\t}\n\tif ((status & USB_ISTAT_ERROR /* 02 */ )) {\n\t\tuint8_t err = USB0_ERRSTAT;\n\t\tUSB0_ERRSTAT = err;\n\t\t//serial_print(\"err:\");\n\t\t//serial_phex(err);\n\t\t//serial_print(\"\\n\");\n\t\tUSB0_ISTAT = USB_ISTAT_ERROR;\n\t}\n\n\tif ((status & USB_ISTAT_SLEEP /* 10 */ )) {\n\t\t//serial_print(\"sleep\\n\");\n\t\tUSB0_ISTAT = USB_ISTAT_SLEEP;\n\t}\n\n}\n\n\n\nvoid usb_init(void)\n{\n\tint i;\n\n\t//serial_begin(BAUD2DIV(115200));\n\t//serial_print(\"usb_init\\n\");\n\n\tusb_init_serialnumber();\n\n\tfor (i=0; i <= NUM_ENDPOINTS*4; i++) {\n\t\ttable[i].desc = 0;\n\t\ttable[i].addr = 0;\n\t}\n\n\t// this basically follows the flowchart in the Kinetis\n\t// Quick Reference User Guide, Rev. 1, 03/2012, page 141\n\n\t// assume 48 MHz clock already running\n\t// SIM - enable clock\n\tSIM_SCGC4 |= SIM_SCGC4_USBOTG;\n#ifdef HAS_KINETIS_MPU\n\tMPU_RGDAAC0 |= 0x03000000;\n#endif\n\n\t// reset USB module\n\t//USB0_USBTRC0 = USB_USBTRC_USBRESET;\n\t//while ((USB0_USBTRC0 & USB_USBTRC_USBRESET) != 0) ; // wait for reset to end\n\n\t// set desc table base addr\n\tUSB0_BDTPAGE1 = ((uint32_t)table) >> 8;\n\tUSB0_BDTPAGE2 = ((uint32_t)table) >> 16;\n\tUSB0_BDTPAGE3 = ((uint32_t)table) >> 24;\n\n\t// clear all ISR flags\n\tUSB0_ISTAT = 0xFF;\n\tUSB0_ERRSTAT = 0xFF;\n\tUSB0_OTGISTAT = 0xFF;\n\n\t//USB0_USBTRC0 |= 0x40; // undocumented bit\n\n\t// enable USB\n\tUSB0_CTL = USB_CTL_USBENSOFEN;\n\tUSB0_USBCTRL = 0;\n\n\t// enable reset interrupt\n\tUSB0_INTEN = USB_INTEN_USBRSTEN;\n\n\t// enable interrupt in NVIC...\n\tNVIC_SET_PRIORITY(IRQ_USBOTG, 112);\n\tNVIC_ENABLE_IRQ(IRQ_USBOTG);\n\n\t// enable d+ pullup\n\tUSB0_CONTROL = USB_CONTROL_DPPULLUPNONOTG;\n}\n\n\n#else // F_CPU < 20 MHz && defined(NUM_ENDPOINTS)\n\nvoid usb_init(void)\n{\n}\n\n#endif // F_CPU >= 20 MHz && defined(NUM_ENDPOINTS)\n"
  },
  {
    "path": "usb_dev.h",
    "content": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp.to>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 4. The names \"OnlyKey\" and \"CryptoTrust\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    admin@crp.to.\n *\n * 5. Products derived from this software may not be called \"OnlyKey\"\n *    nor may \"OnlyKey\" or \"CryptoTrust\" appear in their names without\n *    specific prior written permission. For written permission, please\n *    contact admin@crp.to.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 7. Redistributions in any form must be accompanied by information on\n *    how to obtain complete source code for this software and any\n *    accompanying software that uses this software. The source code\n *    must either be included in the distribution or be available for\n *    no more than the cost of distribution plus a nominal fee, and must\n *    be freely redistributable under reasonable conditions. For a\n *    binary file, complete source code means the source code for all\n *    modules it contains.\n *\n * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS\n * ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT\n * LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM\n * IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE\n * SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE\n * RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY\n * THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF\n * ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER\n * APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE\n * REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION\n * BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM\n * EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL\n * SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT\n * FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS\n * AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF\n * TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS\n * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Original Teensyduino Core Library\n * http://www.pjrc.com/teensy/\n * Copyright (c) 2013 PJRC.COM, LLC.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * 1. The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * 2. If the Software is incorporated into a build system that allows\n * selection among a list of target devices, then similar target\n * devices manufactured by PJRC.COM must be included in the list of\n * target devices and selectable in the same manner.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef _usb_dev_h_\n#define _usb_dev_h_\n\n#define USB_DESC_LIST_DEFINE\n#include \"usb_desc.h\"\n\n#if F_CPU >= 20000000 && !defined(USB_DISABLED)\n\n// This header is NOT meant to be included when compiling\n// user sketches in Arduino.  The low-level functions\n// provided by usb_dev.c are meant to be called only by\n// code which provides higher-level interfaces to the user.\n\n#include \"usb_mem.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nextern uint8_t setBuffer[9];\nextern uint8_t getBuffer[9];\nextern uint8_t keyboard_buffer[80];\nextern uint8_t sess_counter;\nextern uint8_t may_block;\n\n\nextern void wipe_usb_buffer();\nvoid usb_init(void);\nvoid usb_init_serialnumber(void);\nvoid usb_isr(void);\nusb_packet_t *usb_rx(uint32_t endpoint);\nuint32_t usb_tx_byte_count(uint32_t endpoint);\nuint32_t usb_tx_packet_count(uint32_t endpoint);\nvoid usb_tx(uint32_t endpoint, usb_packet_t *packet);\nvoid usb_tx_isr(uint32_t endpoint, usb_packet_t *packet);\n\nextern volatile uint8_t usb_configuration;\n\nextern uint16_t usb_rx_byte_count_data[NUM_ENDPOINTS];\nstatic inline uint32_t usb_rx_byte_count(uint32_t endpoint) __attribute__((always_inline));\nstatic inline uint32_t usb_rx_byte_count(uint32_t endpoint)\n{\n        endpoint--;\n        if (endpoint >= NUM_ENDPOINTS) return 0;\n        return usb_rx_byte_count_data[endpoint];\n}\n\n#ifdef CDC_DATA_INTERFACE\nextern uint32_t usb_cdc_line_coding[2];\nextern volatile uint32_t usb_cdc_line_rtsdtr_millis;\nextern volatile uint32_t systick_millis_count;\nextern volatile uint8_t usb_cdc_line_rtsdtr;\nextern volatile uint8_t usb_cdc_transmit_flush_timer;\nextern void usb_serial_flush_callback(void);\n#endif\n\n#ifdef SEREMU_INTERFACE\nextern volatile uint8_t usb_seremu_transmit_flush_timer;\nextern void usb_seremu_flush_callback(void);\n#endif\n\n#ifdef KEYBOARD_INTERFACE\nextern uint8_t keyboard_modifier_keys;\nextern uint8_t keyboard_keys[6];\nextern uint8_t keyboard_protocol;\nextern uint8_t keyboard_idle_config;\nextern uint8_t keyboard_idle_count;\nextern volatile uint8_t keyboard_leds;\n#endif\n\n#ifdef MIDI_INTERFACE\nextern void usb_midi_flush_output(void);\n#endif\n\n#ifdef FLIGHTSIM_INTERFACE\nextern void usb_flightsim_flush_callback(void);\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#else // F_CPU < 20000000\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid usb_init(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n\n#endif // F_CPU\n\n#endif"
  },
  {
    "path": "usb_keyboard.c",
    "content": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp.to>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 4. The names \"OnlyKey\" and \"CryptoTrust\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    admin@crp.to.\n *\n * 5. Products derived from this software may not be called \"OnlyKey\"\n *    nor may \"OnlyKey\" or \"CryptoTrust\" appear in their names without\n *    specific prior written permission. For written permission, please\n *    contact admin@crp.to.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 7. Redistributions in any form must be accompanied by information on\n *    how to obtain complete source code for this software and any\n *    accompanying software that uses this software. The source code\n *    must either be included in the distribution or be available for\n *    no more than the cost of distribution plus a nominal fee, and must\n *    be freely redistributable under reasonable conditions. For a\n *    binary file, complete source code means the source code for all\n *    modules it contains.\n *\n * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS\n * ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT\n * LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM\n * IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE\n * SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE\n * RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY\n * THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF\n * ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER\n * APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE\n * REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION\n * BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM\n * EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL\n * SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT\n * FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS\n * AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF\n * TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS\n * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Original Teensyduino Core Library\n * http://www.pjrc.com/teensy/\n * Copyright (c) 2013 PJRC.COM, LLC.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * 1. The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * 2. If the Software is incorporated into a build system that allows\n * selection among a list of target devices, then similar target\n * devices manufactured by PJRC.COM must be included in the list of\n * target devices and selectable in the same manner.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include \"usb_dev.h\"\n#include \"usb_keyboard.h\"\n#include \"core_pins.h\" // for yield()\n#include \"keylayouts.h\"\n//#include \"HardwareSerial.h\"\n#include <string.h> // for memcpy()\n\n#ifdef KEYBOARD_INTERFACE // defined by usb_dev.h -> usb_desc.h\n#if F_CPU >= 20000000\n\n// which modifier keys are currently pressed\n// 1=left ctrl,\t   2=left shift,   4=left alt,\t  8=left gui\n// 16=right ctrl, 32=right shift, 64=right alt, 128=right gui\nuint8_t keyboard_modifier_keys=0;\n\n// which media keys are currently pressed\nuint8_t keyboard_media_keys=0;\n\n// which keys are currently pressed, up to 6 keys may be down at once\nuint8_t keyboard_keys[6]={0,0,0,0,0,0};\n\n// protocol setting from the host.  We use exactly the same report\n// either way, so this variable only stores the setting since we\n// are required to be able to report which setting is in use.\nuint8_t keyboard_protocol=1;\n\n// the idle configuration, how often we send the report to the\n// host (ms * 4) even when it hasn't changed\nuint8_t keyboard_idle_config=125;\n\n// count until idle timeout\nuint8_t keyboard_idle_count=0;\n\n// 1=num lock, 2=caps lock, 4=scroll lock, 8=compose, 16=kana\nvolatile uint8_t keyboard_leds=0;\n\n\n\nstatic KEYCODE_TYPE unicode_to_keycode(uint16_t cpoint);\nstatic void write_key(KEYCODE_TYPE keycode);\nstatic uint8_t keycode_to_modifier(KEYCODE_TYPE keycode);\nstatic uint8_t keycode_to_key(KEYCODE_TYPE keycode);\nstatic void usb_keyboard_press_key(uint8_t key, uint8_t modifier);\nstatic void usb_keyboard_release_key(uint8_t key, uint8_t modifier);\nstatic KEYCODE_TYPE deadkey_to_keycode(KEYCODE_TYPE keycode);\n\nextern uint16_t SHIFT_MASK;\nextern uint16_t ALTGR_MASK;\nextern uint16_t RCTRL_MASK;\nextern uint16_t KEY_NON_US_100;\nextern uint16_t DEADKEYS_MASK;\nextern uint16_t CIRCUMFLEX_BITS;\nextern uint16_t ACUTE_ACCENT_BITS;\nextern uint16_t GRAVE_ACCENT_BITS;\nextern uint16_t TILDE_BITS;\nextern uint16_t DIAERESIS_BITS;\nextern uint16_t DEADKEY_CIRCUMFLEX;\nextern uint16_t DEADKEY_ACUTE_ACCENT;\nextern uint16_t DEADKEY_GRAVE_ACCENT;\nextern uint16_t DEADKEY_TILDE;\nextern uint16_t DEADKEY_DIAERESIS;\nextern uint16_t UNICODE_20AC;\nextern uint16_t CEDILLA_BITS;\nextern uint16_t DEADKEY_CEDILLA;\nextern uint16_t RING_ABOVE_BITS;\nextern uint16_t DEADKEY_RING_ABOVE;\nextern uint16_t DEGREE_SIGN_BITS;\nextern uint16_t CARON_BITS;\nextern uint16_t BREVE_BITS;\nextern uint16_t OGONEK_BITS;\nextern uint16_t DOT_ABOVE_BITS;\nextern uint16_t DOUBLE_ACUTE_BITS;\nextern uint16_t DEADKEY_DEGREE_SIGN;\nextern uint16_t DEADKEY_CARON;\nextern uint16_t DEADKEY_BREVE;\nextern uint16_t DEADKEY_OGONEK;\nextern uint16_t DEADKEY_DOT_ABOVE;\nextern uint16_t DEADKEY_DOUBLE_ACUTE;\nextern uint16_t UNICODE_EXTRA0A;\nextern uint16_t KEYCODE_EXTRA0A;\nextern uint16_t ISO_8859_1_A0;\nextern uint16_t UNICODE_EXTRA00;\nextern uint16_t UNICODE_EXTRA01;\nextern uint16_t UNICODE_EXTRA02;\nextern uint16_t UNICODE_EXTRA03;\nextern uint16_t UNICODE_EXTRA04;\nextern uint16_t UNICODE_EXTRA05;\nextern uint16_t UNICODE_EXTRA06;\nextern uint16_t UNICODE_EXTRA07;\nextern uint16_t UNICODE_EXTRA08;\nextern uint16_t UNICODE_EXTRA09;\nextern uint16_t KEYCODE_EXTRA00;\nextern uint16_t KEYCODE_EXTRA01;\nextern uint16_t KEYCODE_EXTRA02;\nextern uint16_t KEYCODE_EXTRA03;\nextern uint16_t KEYCODE_EXTRA04;\nextern uint16_t KEYCODE_EXTRA05;\nextern uint16_t KEYCODE_EXTRA06;\nextern uint16_t KEYCODE_EXTRA07;\nextern uint16_t KEYCODE_EXTRA08;\nextern uint16_t KEYCODE_EXTRA09;\nextern uint16_t KEYCODE_MASK;\n\n\n// Step #1, decode UTF8 to Unicode code points\n//\nvoid usb_keyboard_write(uint8_t c)\n{\n\tstatic int utf8_state=0;\n\tstatic uint16_t unicode_wchar=0;\n\n\tif (c < 0x80) {\n\t\t// single byte encoded, 0x00 to 0x7F\n\t\tutf8_state = 0;\n\t\tusb_keyboard_write_unicode(c);\n\t} else if (c < 0xC0) {\n\t\t// 2nd, 3rd or 4th byte, 0x80 to 0xBF\n\t\tc &= 0x3F;\n\t\tif (utf8_state == 1) {\n\t\t\tutf8_state = 0;\n\t\t\tusb_keyboard_write_unicode(unicode_wchar | c);\n\t\t} else if (utf8_state == 2) {\n\t\t\tunicode_wchar |= ((uint16_t)c << 6);\n\t\t\tutf8_state = 1;\n\t\t}\n\t} else if (c < 0xE0) {\n\t\t// begin 2 byte sequence, 0xC2 to 0xDF\n\t\t// or illegal 2 byte sequence, 0xC0 to 0xC1\n\t\tunicode_wchar = (uint16_t)(c & 0x1F) << 6;\n\t\tutf8_state = 1;\n\t} else if (c < 0xF0) {\n\t\t// begin 3 byte sequence, 0xE0 to 0xEF\n\t\tunicode_wchar = (uint16_t)(c & 0x0F) << 12;\n\t\tutf8_state = 2;\n\t} else {\n\t\t// begin 4 byte sequence (not supported), 0xF0 to 0xF4\n\t\t// or illegal, 0xF5 to 0xFF\n\t\tutf8_state = 255;\n\t}\n}\n\n\n// Step #2: translate Unicode code point to keystroke sequence\n//\nstatic KEYCODE_TYPE unicode_to_keycode(uint16_t cpoint)\n{\n\t// Unicode code points beyond U+FFFF are not supported\n\t// technically this input should probably be called UCS-2\n\tif (cpoint < 32) {\n\t\tif (cpoint == 10) return KEY_ENTER & KEYCODE_MASK;\n\t\tif (cpoint == 11) return KEY_TAB & KEYCODE_MASK;\n\t\treturn 0;\n\t}\n\tif (cpoint < 128) {\n\t\treturn keycodes_ascii[cpoint - 0x20];\n\t}\n\tif (ISO_8859_1_A0) {\n\tif (cpoint >= 0xA0 && cpoint < 0x100) {\n\t\treturn keycodes_iso_8859_1[cpoint - 0xA0];\n\t}\n\t}\n\t//#ifdef UNICODE_20AC\n\t//if (cpoint == 0x20AC) return UNICODE_20AC & 0x3FFF;\n\t//#endif\n\tif (KEYCODE_EXTRA00) if (cpoint == UNICODE_EXTRA00) return (KEYCODE_EXTRA00) & 0x3FFF;\n\tif (KEYCODE_EXTRA01) if (cpoint == UNICODE_EXTRA01) return (KEYCODE_EXTRA01) & 0x3FFF;\n\tif (KEYCODE_EXTRA02) if (cpoint == UNICODE_EXTRA02) return (KEYCODE_EXTRA02) & 0x3FFF;\n\tif (KEYCODE_EXTRA03) if (cpoint == UNICODE_EXTRA03) return (KEYCODE_EXTRA03) & 0x3FFF;\n    if (KEYCODE_EXTRA04) if (cpoint == UNICODE_EXTRA04) return (KEYCODE_EXTRA04) & 0x3FFF;\n    if (KEYCODE_EXTRA05) if (cpoint == UNICODE_EXTRA05) return (KEYCODE_EXTRA05) & 0x3FFF;\n    if (KEYCODE_EXTRA06) if (cpoint == UNICODE_EXTRA06) return (KEYCODE_EXTRA06) & 0x3FFF;\n    if (KEYCODE_EXTRA07) if (cpoint == UNICODE_EXTRA07) return (KEYCODE_EXTRA07) & 0x3FFF;\n    if (KEYCODE_EXTRA08) if (cpoint == UNICODE_EXTRA08) return (KEYCODE_EXTRA08) & 0x3FFF;\n    if (KEYCODE_EXTRA09) if (cpoint == UNICODE_EXTRA09) return (KEYCODE_EXTRA09) & 0x3FFF;\n    if (KEYCODE_EXTRA0A) if (cpoint == UNICODE_EXTRA0A) return (KEYCODE_EXTRA0A) & 0x3FFF;\n\treturn 0;\n}\n\n// Step #3: execute keystroke sequence\n//\n\nstatic KEYCODE_TYPE deadkey_to_keycode(KEYCODE_TYPE keycode)\n{\n\tif(DEADKEYS_MASK) {\n\tkeycode &= DEADKEYS_MASK;\n\tif (keycode == 0) return 0;\n\tif(ACUTE_ACCENT_BITS) if (keycode == ACUTE_ACCENT_BITS) return DEADKEY_ACUTE_ACCENT;\n\tif(CEDILLA_BITS) if (keycode == CEDILLA_BITS) return DEADKEY_CEDILLA;\n\tif(CIRCUMFLEX_BITS) if (keycode == CIRCUMFLEX_BITS) return DEADKEY_CIRCUMFLEX;\n\tif(DIAERESIS_BITS) if (keycode == DIAERESIS_BITS) return DEADKEY_DIAERESIS;\n\tif(GRAVE_ACCENT_BITS) if (keycode == GRAVE_ACCENT_BITS) return DEADKEY_GRAVE_ACCENT;\n\tif(TILDE_BITS) if (keycode == TILDE_BITS) return DEADKEY_TILDE;\n\tif(RING_ABOVE_BITS) if (keycode == RING_ABOVE_BITS) return DEADKEY_RING_ABOVE;\n\tif(DEGREE_SIGN_BITS) if (keycode == DEGREE_SIGN_BITS) return DEADKEY_DEGREE_SIGN;\n\tif(CARON_BITS) if (keycode == CARON_BITS) return DEADKEY_CARON;\n\tif(BREVE_BITS) if (keycode == BREVE_BITS) return DEADKEY_BREVE;\n\tif(OGONEK_BITS) if (keycode == OGONEK_BITS) return DEADKEY_OGONEK;\n\tif(DOT_ABOVE_BITS) if (keycode == DOT_ABOVE_BITS) return DEADKEY_DOT_ABOVE;\n\tif(DOUBLE_ACUTE_BITS) if (keycode == DOUBLE_ACUTE_BITS) return DEADKEY_DOUBLE_ACUTE;\n}\n\treturn 0;\n}\n\n\nvoid usb_keyboard_write_unicode(uint16_t cpoint)\n{\n\tKEYCODE_TYPE keycode;\n\n\tkeycode = unicode_to_keycode(cpoint);\n\tif (keycode) {\n\t\tif(DEADKEYS_MASK) {\n\t\tKEYCODE_TYPE deadkeycode = deadkey_to_keycode(keycode);\n\t\tif (deadkeycode) write_key(deadkeycode);\n\t\t}\n\t\twrite_key(keycode);\n\t}\n}\n\n\n// Step #4: do each keystroke\n//\nstatic void write_key(KEYCODE_TYPE keycode)\n{\n/*\n\tuint8_t key, modifier=0;\n\n\t#ifdef SHIFT_MASK\n\tif (keycode & SHIFT_MASK) modifier |= MODIFIERKEY_SHIFT;\n\t#endif\n\t#ifdef ALTGR_MASK\n\tif (keycode & ALTGR_MASK) modifier |= MODIFIERKEY_RIGHT_ALT;\n\t#endif\n\t#ifdef RCTRL_MASK\n\tif (keycode & RCTRL_MASK) modifier |= MODIFIERKEY_RIGHT_CTRL;\n\t#endif\n\tkey = keycode & 0x3F;\n\t#ifdef KEY_NON_US_100\n\tif (key == KEY_NON_US_100) key = 100;\n\t#endif\n\tusb_keyboard_press(key, modifier);\n*/\n\tusb_keyboard_press(keycode_to_key(keycode), keycode_to_modifier(keycode));\n}\n\nstatic uint8_t keycode_to_modifier(KEYCODE_TYPE keycode)\n{\n\tuint8_t modifier=0;\n\t\n\tif (SHIFT_MASK) if (keycode & SHIFT_MASK) modifier |= MODIFIERKEY_SHIFT;\n\n\tif (ALTGR_MASK) if (keycode & ALTGR_MASK) modifier |= MODIFIERKEY_RIGHT_ALT;\n\n\tif (RCTRL_MASK) if (keycode & RCTRL_MASK) modifier |= MODIFIERKEY_RIGHT_CTRL;\n\n\treturn modifier;\n}\n\nstatic uint8_t keycode_to_key(KEYCODE_TYPE keycode)\n{\n\tuint8_t key = keycode & 0x3F;\n\tif (KEY_NON_US_100) if (key == KEY_NON_US_100) key = 100;\n\treturn key;\n}\n\n// Input can be:\n//     32 - 127     ASCII direct (U+0020 to U+007F) <-- uses layout\n//    128 - 0xC1FF  Unicode direct (U+0080 to U+C1FF) <-- uses layout\n// 0xC200 - 0xDFFF  Unicode UTF8 packed (U+0080 to U+07FF) <-- uses layout\n// 0xE000 - 0xE0FF  Modifier key (bitmap, 8 keys, shift/ctrl/alt/gui)\n// 0xE200 - 0xE2FF  System key (HID usage code, within usage page 1)\n// 0xE400 - 0xE7FF  Media/Consumer key (HID usage code, within usage page 12)\n// 0xF000 - 0xFFFF  Normal key (HID usage code, within usage page 7)\n\nvoid usb_keyboard_press_keycode(uint16_t n)\n{\n\tuint8_t key, mod, msb, modrestore=0;\n\tKEYCODE_TYPE keycode;\n\tKEYCODE_TYPE deadkeycode;\n\n\tmsb = n >> 8;\n\tif (msb >= 0xC2) {\n\t\tif (msb <= 0xDF) {\n\t\t\tn = (n & 0x3F) | ((uint16_t)(msb & 0x1F) << 6);\n\t\t} else if (msb == 0xF0) {\n\t\t\tusb_keyboard_press_key(n, 0);\n\t\t\treturn;\n\t\t} else if (msb == 0xE0) {\n\t\t\tusb_keyboard_press_key(0, n);\n\t\t\treturn;\n#ifdef KEYMEDIA_INTERFACE\n\t\t} else if (msb == 0xE2) {\n\t\t\t// TODO: system keys\n\t\t\treturn;\n\t\t} else if (msb >= 0xE4 && msb <= 0xE7) {\n\t\t\t// TODO: media/consumer keys\n\t\t\treturn;\n#endif\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n\tkeycode = unicode_to_keycode(n);\n\tif (!keycode) return;\n\tif (DEADKEYS_MASK) {\n\tdeadkeycode = deadkey_to_keycode(keycode);\n\tif (deadkeycode) {\n\t\tmodrestore = keyboard_modifier_keys;\n\t\tif (modrestore) {\n\t\t\tkeyboard_modifier_keys = 0;\n\t\t\tusb_keyboard_send();\n\t\t}\n\t\t// TODO: test if operating systems recognize\n\t\t// deadkey sequences when other keys are held\n\t\tmod = keycode_to_modifier(deadkeycode);\n\t\tkey = keycode_to_key(deadkeycode);\n\t\tusb_keyboard_press_key(key, mod);\n\t\tusb_keyboard_release_key(key, mod);\n\t}\n\t}\n\tmod = keycode_to_modifier(keycode);\n\tkey = keycode_to_key(keycode);\n\tusb_keyboard_press_key(key, mod | modrestore);\n}\n\n\nvoid usb_keyboard_release_keycode(uint16_t n)\n{\n\tuint8_t key, mod, msb;\n\n\tmsb = n >> 8;\n\tif (msb >= 0xC2) {\n\t\tif (msb <= 0xDF) {\n\t\t\tn = (n & 0x3F) | ((uint16_t)(msb & 0x1F) << 6);\n\t\t} else if (msb == 0xF0) {\n\t\t\tusb_keyboard_release_key(n, 0);\n\t\t\treturn;\n\t\t} else if (msb == 0xE0) {\n\t\t\tusb_keyboard_release_key(0, n);\n\t\t\treturn;\n#ifdef KEYMEDIA_INTERFACE\n\t\t} else if (msb == 0xE2) {\n\t\t\t// TODO: system keys\n\t\t\treturn;\n\t\t} else if (msb >= 0xE4 && msb <= 0xE7) {\n\t\t\t// TODO: media/consumer keys\n\t\t\treturn;\n#endif\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t}\n\tKEYCODE_TYPE keycode = unicode_to_keycode(n);\n\tif (!keycode) return;\n\tmod = keycode_to_modifier(keycode);\n\tkey = keycode_to_key(keycode);\n\tusb_keyboard_release_key(key, mod);\n}\n\n\nstatic void usb_keyboard_press_key(uint8_t key, uint8_t modifier)\n{\n\tint i, send_required = 0;\n\n\tif (modifier) {\n\t\tif ((keyboard_modifier_keys & modifier) != modifier) {\n\t\t\tkeyboard_modifier_keys |= modifier;\n\t\t\tsend_required = 1;\n\t\t\tusb_keyboard_send();\n\t\t\t// SEND MODKEY MULTIPLE TIMES, FIXES RDP ISSUE \n\t\t\tusb_keyboard_send();\n\t\t\tusb_keyboard_send();\n\t\t\tusb_keyboard_send();\n\t\t\tusb_keyboard_send();\n\t\t}\n\t}\n\tif (key) {\n\t\tfor (i=0; i < 6; i++) {\n\t\t\tif (keyboard_keys[i] == key) goto end;\n\t\t}\n\t\tfor (i=0; i < 6; i++) {\n\t\t\tif (keyboard_keys[i] == 0) {\n\t\t\t\tkeyboard_keys[i] = key;\n\t\t\t\tsend_required = 1;\n\t\t\t\tgoto end;\n\t\t\t}\n\t\t}\n\t}\n\tend:\n\tif (send_required) usb_keyboard_send();\n}\n\n\nstatic void usb_keyboard_release_key(uint8_t key, uint8_t modifier)\n{\n\tint i, send_required = 0;\n\n\tif (modifier) {\n\t\tif ((keyboard_modifier_keys & modifier) != 0) {\n\t\t\tkeyboard_modifier_keys &= ~modifier;\n\t\t\tsend_required = 1;\n\t\t\tusb_keyboard_send();\n\t\t\t// SEND MODKEY MULTIPLE TIMES\n\t\t\tusb_keyboard_send();\n\t\t\tusb_keyboard_send();\n\t\t\tusb_keyboard_send();\n\t\t\tusb_keyboard_send();\n\t\t}\n\t}\n\tif (key) {\n\t\tfor (i=0; i < 6; i++) {\n\t\t\tif (keyboard_keys[i] == key) {\n\t\t\t\tkeyboard_keys[i] = 0;\n\t\t\t\tsend_required = 1;\n\t\t\t}\n\t\t}\n\t}\n\tif (send_required) usb_keyboard_send();\n}\n\nvoid usb_keyboard_release_all(void)\n{\n\tuint8_t i, anybits;\n\n\tanybits = keyboard_modifier_keys;\n\tkeyboard_modifier_keys = 0;\n\tanybits |= keyboard_media_keys;\n\tkeyboard_media_keys = 0;\n\tfor (i=0; i < 6; i++) {\n\t\tanybits |= keyboard_keys[i];\n\t\tkeyboard_keys[i] = 0;\n\t}\n\tif (anybits) usb_keyboard_send();\n}\n\n\nint usb_keyboard_press(uint8_t key, uint8_t modifier)\n{\n\tint r;\n\tkeyboard_modifier_keys = modifier;\n\tkeyboard_keys[0] = key;\n\tkeyboard_keys[1] = 0;\n\tkeyboard_keys[2] = 0;\n\tkeyboard_keys[3] = 0;\n\tkeyboard_keys[4] = 0;\n\tkeyboard_keys[5] = 0;\n\tr = usb_keyboard_send();\n\tif (r) return r;\n\tkeyboard_modifier_keys = 0;\n\tkeyboard_keys[0] = 0;\n\treturn usb_keyboard_send();\n}\n\n\n// Maximum number of transmit packets to queue so we don't starve other endpoints for memory\n#define TX_PACKET_LIMIT 4\n\nstatic uint8_t transmit_previous_timeout=0;\n\n// When the PC isn't listening, how long do we wait before discarding data?\n#define TX_TIMEOUT_MSEC 50\n\n#if F_CPU == 168000000\n  #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 1100)\n#elif F_CPU == 144000000\n  #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 932)\n#elif F_CPU == 120000000\n  #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 764)\n#elif F_CPU == 96000000\n  #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 596)\n#elif F_CPU == 72000000\n  #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 512)\n#elif F_CPU == 48000000\n  #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 428)\n#elif F_CPU == 24000000\n  #define TX_TIMEOUT (TX_TIMEOUT_MSEC * 262)\n#endif\n\n\n// send the contents of keyboard_keys and keyboard_modifier_keys\nint usb_keyboard_send(void)\n{\n#if 0\n\tserial_print(\"Send:\");\n\tserial_phex(keyboard_modifier_keys);\n\tserial_phex(keyboard_keys[0]);\n\tserial_phex(keyboard_keys[1]);\n\tserial_phex(keyboard_keys[2]);\n\tserial_phex(keyboard_keys[3]);\n\tserial_phex(keyboard_keys[4]);\n\tserial_phex(keyboard_keys[5]);\n\tserial_print(\"\\n\");\n#endif\n#if 1\n\tuint32_t wait_count=0;\n\tusb_packet_t *tx_packet;\n\n\twhile (1) {\n\t\tif (!usb_configuration) {\n\t\t\treturn -1;\n\t\t}\n\t\tif (usb_tx_packet_count(KEYBOARD_ENDPOINT) < TX_PACKET_LIMIT) {\n\t\t\ttx_packet = usb_malloc();\n\t\t\tif (tx_packet) break;\n\t\t}\n\t\tif (++wait_count > TX_TIMEOUT || transmit_previous_timeout) {\n\t\t\ttransmit_previous_timeout = 1;\n\t\t\treturn -1;\n\t\t}\n\t\tyield();\n\t}\n\t*(tx_packet->buf) = keyboard_modifier_keys;\n\t*(tx_packet->buf + 1) = keyboard_media_keys;\n\tmemcpy(tx_packet->buf + 2, keyboard_keys, 6);\n\ttx_packet->len = 8;\n\tusb_tx(KEYBOARD_ENDPOINT, tx_packet);\n#endif\n\treturn 0;\n}\n\n\n#endif // F_CPU\n#endif // KEYBOARD_INTERFACE\n"
  },
  {
    "path": "usb_rawhid.c",
    "content": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp.to>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 4. The names \"OnlyKey\" and \"CryptoTrust\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    admin@crp.to.\n *\n * 5. Products derived from this software may not be called \"OnlyKey\"\n *    nor may \"OnlyKey\" or \"CryptoTrust\" appear in their names without\n *    specific prior written permission. For written permission, please\n *    contact admin@crp.to.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 7. Redistributions in any form must be accompanied by information on\n *    how to obtain complete source code for this software and any\n *    accompanying software that uses this software. The source code\n *    must either be included in the distribution or be available for\n *    no more than the cost of distribution plus a nominal fee, and must\n *    be freely redistributable under reasonable conditions. For a\n *    binary file, complete source code means the source code for all\n *    modules it contains.\n *\n * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS\n * ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT\n * LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM\n * IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE\n * SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE\n * RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY\n * THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF\n * ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER\n * APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE\n * REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION\n * BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM\n * EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL\n * SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT\n * FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS\n * AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF\n * TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS\n * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Original Teensyduino Core Library\n * http://www.pjrc.com/teensy/\n * Copyright (c) 2013 PJRC.COM, LLC.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * 1. The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * 2. If the Software is incorporated into a build system that allows\n * selection among a list of target devices, then similar target\n * devices manufactured by PJRC.COM must be included in the list of\n * target devices and selectable in the same manner.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include \"usb_dev.h\"\n#include \"usb_rawhid.h\"\n#include \"core_pins.h\" // for yield(), millis()\n#include <string.h>    // for memcpy()\n//#include \"HardwareSerial.h\"\n\n#ifdef RAWHID_INTERFACE // defined by usb_dev.h -> usb_desc.h\n#if F_CPU >= 20000000\n\n\nint usb_rawhid_recv(void *buffer, uint32_t timeout)\n{\n\tusb_packet_t *rx_packet;\n\tuint32_t begin = millis();\n\tuint8_t useinterface = 0;\n\n\twhile (1) {\n\t\tif (!usb_configuration) return -1;\n\t\trx_packet = usb_rx(RAWHID_RX_ENDPOINT);\n\t\tif (rx_packet) {\n\t\t\tuseinterface=1;\n\t\t\tbreak;\n\t\t}\n\t\trx_packet = usb_rx(RAWHID_RX_ENDPOINT2);\n\t\tif (rx_packet) {\n\t\t\tuseinterface=2;\n\t\t\tbreak;\n\t\t}\n\t\tif (millis() - begin > timeout || !timeout) return 0;\n\t\tyield();\n\t}\n\tmemcpy(buffer, rx_packet->buf, RAWHID_RX_SIZE);\n\tusb_free(rx_packet);\n\treturn useinterface;\n}\n\nint usb_rawhid_available(void)\n{\n\tuint32_t count;\n\n\tif (!usb_configuration) return 0;\n\tcount = usb_rx_byte_count(RAWHID_RX_ENDPOINT);\n\treturn count;\n}\n\n// Maximum number of transmit packets to queue so we don't starve other endpoints for memory\n#define TX_PACKET_LIMIT 4\n\nint usb_rawhid_send(const void *buffer, uint32_t timeout)\n{\n\tusb_packet_t *tx_packet;\n\tuint32_t begin = millis();\n\n\t\twhile (1) {\n\t\t\tif (!usb_configuration) return -1;\n\t\t\tif (usb_tx_packet_count(RAWHID_TX_ENDPOINT) < TX_PACKET_LIMIT) {\n\t\t\t\ttx_packet = usb_malloc();\n\t\t\t\tif (tx_packet) break;\n\t\t\t}\n\t\t\tif (millis() - begin > timeout) return 0;\n\t\t\tyield();\n\t\t}\n\t\tmemcpy(tx_packet->buf, buffer, RAWHID_TX_SIZE);\n\t\ttx_packet->len = RAWHID_TX_SIZE;\n\t\tusb_tx(RAWHID_TX_ENDPOINT, tx_packet);\n\treturn RAWHID_TX_SIZE;\n}\n\nint usb_rawhid_send2(const void *buffer, uint32_t timeout)\n{\n\tusb_packet_t *tx_packet;\n\tuint32_t begin = millis();\n\n\twhile (1) {\n\t\tif (!usb_configuration) return -1;\n\t\tif (usb_tx_packet_count(RAWHID_TX_ENDPOINT2) < TX_PACKET_LIMIT) {\n\t\t\ttx_packet = usb_malloc();\n\t\t\tif (tx_packet) break;\n\t\t}\n\t\tif (millis() - begin > timeout) return 0;\n\t\tyield();\n\t}\n\tmemcpy(tx_packet->buf, buffer, RAWHID_TX_SIZE);\n\ttx_packet->len = RAWHID_TX_SIZE;\n\tusb_tx(RAWHID_TX_ENDPOINT2, tx_packet);\n\treturn RAWHID_TX_SIZE;\n}\n\n#endif // F_CPU\n#endif // RAWHID_INTERFACE\n"
  },
  {
    "path": "usb_rawhid.h",
    "content": "/* Modifications\n * Copyright (c) 2015-2020, CryptoTrust LLC.\n * All rights reserved.\n * \n * Author : Tim Steiner <t@crp.to>\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above\n *    copyright notice, this list of conditions and the following\n *    disclaimer in the documentation and/or other materials provided\n *    with the distribution.\n *\n * 3. All advertising materials mentioning features or use of this\n *    software must display the following acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 4. The names \"OnlyKey\" and \"CryptoTrust\" must not be used to\n *    endorse or promote products derived from this software without\n *    prior written permission. For written permission, please contact\n *    admin@crp.to.\n *\n * 5. Products derived from this software may not be called \"OnlyKey\"\n *    nor may \"OnlyKey\" or \"CryptoTrust\" appear in their names without\n *    specific prior written permission. For written permission, please\n *    contact admin@crp.to.\n *\n * 6. Redistributions of any form whatsoever must retain the following\n *    acknowledgment:\n *    \"This product includes software developed by CryptoTrust LLC. for\n *    the OnlyKey Project (https://www.crp.to/ok)\"\n *\n * 7. Redistributions in any form must be accompanied by information on\n *    how to obtain complete source code for this software and any\n *    accompanying software that uses this software. The source code\n *    must either be included in the distribution or be available for\n *    no more than the cost of distribution plus a nominal fee, and must\n *    be freely redistributable under reasonable conditions. For a\n *    binary file, complete source code means the source code for all\n *    modules it contains.\n *\n * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS\n * ARE GRANTED BY THIS LICENSE. IF SOFTWARE RECIPIENT INSTITUTES PATENT\n * LITIGATION AGAINST ANY ENTITY (INCLUDING A CROSS-CLAIM OR COUNTERCLAIM\n * IN A LAWSUIT) ALLEGING THAT THIS SOFTWARE (INCLUDING COMBINATIONS OF THE\n * SOFTWARE WITH OTHER SOFTWARE OR HARDWARE) INFRINGES SUCH SOFTWARE\n * RECIPIENT'S PATENT(S), THEN SUCH SOFTWARE RECIPIENT'S RIGHTS GRANTED BY\n * THIS LICENSE SHALL TERMINATE AS OF THE DATE SUCH LITIGATION IS FILED. IF\n * ANY PROVISION OF THIS AGREEMENT IS INVALID OR UNENFORCEABLE UNDER\n * APPLICABLE LAW, IT SHALL NOT AFFECT THE VALIDITY OR ENFORCEABILITY OF THE\n * REMAINDER OF THE TERMS OF THIS AGREEMENT, AND WITHOUT FURTHER ACTION\n * BY THE PARTIES HERETO, SUCH PROVISION SHALL BE REFORMED TO THE MINIMUM\n * EXTENT NECESSARY TO MAKE SUCH PROVISION VALID AND ENFORCEABLE. ALL\n * SOFTWARE RECIPIENT'S RIGHTS UNDER THIS AGREEMENT SHALL TERMINATE IF IT\n * FAILS TO COMPLY WITH ANY OF THE MATERIAL TERMS OR CONDITIONS OF THIS\n * AGREEMENT AND DOES NOT CURE SUCH FAILURE IN A REASONABLE PERIOD OF\n * TIME AFTER BECOMING AWARE OF SUCH NONCOMPLIANCE. THIS SOFTWARE IS\n * PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR  PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS\n * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Original Teensyduino Core Library\n * http://www.pjrc.com/teensy/\n * Copyright (c) 2013 PJRC.COM, LLC.\n *\n * Permission is hereby granted, free of charge, to any person obtaining\n * a copy of this software and associated documentation files (the\n * \"Software\"), to deal in the Software without restriction, including\n * without limitation the rights to use, copy, modify, merge, publish,\n * distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to\n * the following conditions:\n *\n * 1. The above copyright notice and this permission notice shall be\n * included in all copies or substantial portions of the Software.\n *\n * 2. If the Software is incorporated into a build system that allows\n * selection among a list of target devices, then similar target\n * devices manufactured by PJRC.COM must be included in the list of\n * target devices and selectable in the same manner.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n\n#ifndef USBrawhid_h_\n#define USBrawhid_h_\n\n#include \"usb_desc.h\"\n\n#if defined(RAWHID_INTERFACE)\n\n#include <inttypes.h>\n\n// C language implementation\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nint usb_rawhid_recv(void *buffer, uint32_t timeout);\nint usb_rawhid_available(void);\nint usb_rawhid_send(const void *buffer, uint32_t timeout);\nint usb_rawhid_send2(const void *buffer, uint32_t timeout);\n#ifdef __cplusplus\n}\n#endif\n\n\n// C++ interface\n#ifdef __cplusplus\nclass usb_rawhid_class\n{\npublic:\n\tint available(void) {return usb_rawhid_available(); }\n\tint recv(void *buffer, uint16_t timeout) { return usb_rawhid_recv(buffer, timeout); }\n\tint send(const void *buffer, uint16_t timeout) { return usb_rawhid_send(buffer, timeout); }\n\tint send2(const void *buffer, uint16_t timeout) { return usb_rawhid_send2(buffer, timeout); }\n};\n\nextern usb_rawhid_class RawHID;\n\n#endif // __cplusplus\n\n#endif // RAWHID_INTERFACE\n\n#endif // USBrawhid_h_"
  }
]