text: (function webpackUniversalModuleDefinition(root, factory) {
  	if(typeof exports === 'object' && typeof module === 'object')
  		module.exports = factory();
  	else if(typeof define === 'function' && define.amd)
  		define([], factory);
  	else {
  		var a = factory();
  		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
  	}
  })(typeof self !== 'undefined' ? self : this, function() {
  return /******/ (function(modules) { // webpackBootstrap
  /******/ 	// The module cache
  /******/ 	var installedModules = {};
  /******/
  /******/ 	// The require function
  /******/ 	function __webpack_require__(moduleId) {
  /******/
  /******/ 		// Check if module is in cache
  /******/ 		if(installedModules[moduleId]) {
  /******/ 			return installedModules[moduleId].exports;
  /******/ 		}
  /******/ 		// Create a new module (and put it into the cache)
  /******/ 		var module = installedModules[moduleId] = {
  /******/ 			i: moduleId,
  /******/ 			l: false,
  /******/ 			exports: {}
  /******/ 		};
  /******/
  /******/ 		// Execute the module function
  /******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
  /******/
  /******/ 		// Flag the module as loaded
  /******/ 		module.l = true;
  /******/
  /******/ 		// Return the exports of the module
  /******/ 		return module.exports;
  /******/ 	}
  /******/
  /******/
  /******/ 	// expose the modules object (__webpack_modules__)
  /******/ 	__webpack_require__.m = modules;
  /******/
  /******/ 	// expose the module cache
  /******/ 	__webpack_require__.c = installedModules;
  /******/
  /******/ 	// define getter function for harmony exports
  /******/ 	__webpack_require__.d = function(exports, name, getter) {
  /******/ 		if(!__webpack_require__.o(exports, name)) {
  /******/ 			Object.defineProperty(exports, name, {
  /******/ 				configurable: false,
  /******/ 				enumerable: true,
  /******/ 				get: getter
  /******/ 			});
  /******/ 		}
  /******/ 	};
  /******/
  /******/ 	// getDefaultExport function for compatibility with non-harmony modules
  /******/ 	__webpack_require__.n = function(module) {
  /******/ 		var getter = module && module.__esModule ?
  /******/ 			function getDefault() { return module['default']; } :
  /******/ 			function getModuleExports() { return module; };
  /******/ 		__webpack_require__.d(getter, 'a', getter);
  /******/ 		return getter;
  /******/ 	};
  /******/
  /******/ 	// Object.prototype.hasOwnProperty.call
  /******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
  /******/
  /******/ 	// __webpack_public_path__
  /******/ 	__webpack_require__.p = "";
  /******/
  /******/ 	// Load entry module and return exports
  /******/ 	return __webpack_require__(__webpack_require__.s = 2);
  /******/ })
  /************************************************************************/
  /******/ ([
  /* 0 */,
  /* 1 */,
  /* 2 */
  /***/ (function(module, exports, __webpack_require__) {
  
  "use strict";
  
  Object.defineProperty(exports, "__esModule", { value: true });
  var keycode = __webpack_require__(3);
  var auroraInstance;
  var middlewareOptions;
  var keysHolded;
  var keydownHandler = function (event) {
      var key = keycode(event);
      var keys = [];
      if (event.ctrlKey)
          keys.push('ctrl');
      if (event.shiftKey)
          keys.push('shift');
      if (event.altKey)
          keys.push('alt');
      if (!['ctrl', 'shift', 'alt'].includes(key)) {
          keys.push(key);
      }
      keysHolded = keys;
      console.log(keysHolded.join('+'));
  };
  var keyupHandler = function (event) {
      keysHolded = keysHolded.filter(function (keyHolded) { return keyHolded !== keycode(event); });
      console.log(keysHolded.join('+'));
  };
  var initializeKeyboardMiddleware = function (aurora) {
      if (typeof window !== 'undefined') {
          auroraInstance = aurora;
          window.addEventListener('keydown', keydownHandler);
          window.addEventListener('keyup', keyupHandler);
      }
  };
  var deinitializeKeyboardMiddleware = function () {
      if (typeof window !== 'undefined') {
          auroraInstance = undefined;
          window.removeEventListener('keydown', keydownHandler);
          window.removeEventListener('keyup', keyupHandler);
      }
  };
  var keyboardMiddleware = function (options) {
      middlewareOptions = options;
      return {
          init: initializeKeyboardMiddleware,
          deinit: deinitializeKeyboardMiddleware,
      };
  };
  exports.default = keyboardMiddleware;
  
  
  /***/ }),
  /* 3 */
  /***/ (function(module, exports) {
  
  // Source: http://jsfiddle.net/vWx8V/
  // http://stackoverflow.com/questions/5603195/full-list-of-javascript-keycodes
  
  /**
   * Conenience method returns corresponding value for given keyName or keyCode.
   *
   * @param {Mixed} keyCode {Number} or keyName {String}
   * @return {Mixed}
   * @api public
   */
  
  exports = module.exports = function(searchInput) {
    // Keyboard Events
    if (searchInput && 'object' === typeof searchInput) {
      var hasKeyCode = searchInput.which || searchInput.keyCode || searchInput.charCode
      if (hasKeyCode) searchInput = hasKeyCode
    }
  
    // Numbers
    if ('number' === typeof searchInput) return names[searchInput]
  
    // Everything else (cast to string)
    var search = String(searchInput)
  
    // check codes
    var foundNamedKey = codes[search.toLowerCase()]
    if (foundNamedKey) return foundNamedKey
  
    // check aliases
    var foundNamedKey = aliases[search.toLowerCase()]
    if (foundNamedKey) return foundNamedKey
  
    // weird character?
    if (search.length === 1) return search.charCodeAt(0)
  
    return undefined
  }
  
  /**
   * Get by name
   *
   *   exports.code['enter'] // => 13
   */
  
  var codes = exports.code = exports.codes = {
    'backspace': 8,
    'tab': 9,
    'enter': 13,
    'shift': 16,
    'ctrl': 17,
    'alt': 18,
    'pause/break': 19,
    'caps lock': 20,
    'esc': 27,
    'space': 32,
    'page up': 33,
    'page down': 34,
    'end': 35,
    'home': 36,
    'left': 37,
    'up': 38,
    'right': 39,
    'down': 40,
    'insert': 45,
    'delete': 46,
    'command': 91,
    'left command': 91,
    'right command': 93,
    'numpad *': 106,
    'numpad +': 107,
    'numpad -': 109,
    'numpad .': 110,
    'numpad /': 111,
    'num lock': 144,
    'scroll lock': 145,
    'my computer': 182,
    'my calculator': 183,
    ';': 186,
    '=': 187,
    ',': 188,
    '-': 189,
    '.': 190,
    '/': 191,
    '`': 192,
    '[': 219,
    '\\': 220,
    ']': 221,
    "'": 222
  }
  
  // Helper aliases
  
  var aliases = exports.aliases = {
    'windows': 91,
    '⇧': 16,
    '⌥': 18,
    '⌃': 17,
    '⌘': 91,
    'ctl': 17,
    'control': 17,
    'option': 18,
    'pause': 19,
    'break': 19,
    'caps': 20,
    'return': 13,
    'escape': 27,
    'spc': 32,
    'pgup': 33,
    'pgdn': 34,
    'ins': 45,
    'del': 46,
    'cmd': 91
  }
  
  
  /*!
   * Programatically add the following
   */
  
  // lower case chars
  for (i = 97; i < 123; i++) codes[String.fromCharCode(i)] = i - 32
  
  // numbers
  for (var i = 48; i < 58; i++) codes[i - 48] = i
  
  // function keys
  for (i = 1; i < 13; i++) codes['f'+i] = i + 111
  
  // numpad keys
  for (i = 0; i < 10; i++) codes['numpad '+i] = i + 96
  
  /**
   * Get by code
   *
   *   exports.name[13] // => 'Enter'
   */
  
  var names = exports.names = exports.title = {} // title for backward compat
  
  // Create reverse mapping
  for (i in codes) names[codes[i]] = i
  
  // Add aliases
  for (var alias in aliases) {
    codes[alias] = aliases[alias]
  }
  
  
  /***/ })
  /******/ ]);
  });