text: ace.define("ace/ext/menu_tools/overlay_page",[], function(require, exports, module) {
  'use strict';
  var dom = require("../../lib/dom");
  var cssText = "#ace_settingsmenu, #kbshortcutmenu {\
  background-color: #F7F7F7;\
  color: black;\
  box-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\
  padding: 1em 0.5em 2em 1em;\
  overflow: auto;\
  position: absolute;\
  margin: 0;\
  bottom: 0;\
  right: 0;\
  top: 0;\
  z-index: 9991;\
  cursor: default;\
  }\
  .ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\
  box-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\
  background-color: rgba(255, 255, 255, 0.6);\
  color: black;\
  }\
  .ace_optionsMenuEntry:hover {\
  background-color: rgba(100, 100, 100, 0.1);\
  transition: all 0.3s\
  }\
  .ace_closeButton {\
  background: rgba(245, 146, 146, 0.5);\
  border: 1px solid #F48A8A;\
  border-radius: 50%;\
  padding: 7px;\
  position: absolute;\
  right: -8px;\
  top: -8px;\
  z-index: 100000;\
  }\
  .ace_closeButton{\
  background: rgba(245, 146, 146, 0.9);\
  }\
  .ace_optionsMenuKey {\
  color: darkslateblue;\
  font-weight: bold;\
  }\
  .ace_optionsMenuCommand {\
  color: darkcyan;\
  font-weight: normal;\
  }\
  .ace_optionsMenuEntry input, .ace_optionsMenuEntry button {\
  vertical-align: middle;\
  }\
  .ace_optionsMenuEntry button[ace_selected_button=true] {\
  background: #e7e7e7;\
  box-shadow: 1px 0px 2px 0px #adadad inset;\
  border-color: #adadad;\
  }\
  .ace_optionsMenuEntry button {\
  background: white;\
  border: 1px solid lightgray;\
  margin: 0px;\
  }\
  .ace_optionsMenuEntry button:hover{\
  background: #f0f0f0;\
  }";
  dom.importCssString(cssText);
  
  module.exports.overlayPage = function overlayPage(editor, contentElement, callback) {
      var closer = document.createElement('div');
  
      function documentEscListener(e) {
          if (e.keyCode === 27) {
              close();
          }
      }
  
      function close() {
          if (!closer) return;
          document.removeEventListener('keydown', documentEscListener);
          closer.parentNode.removeChild(closer);
          editor.focus();
          closer = null;
          callback && callback();
      }
  
      closer.style.cssText = 'margin: 0; padding: 0; ' +
          'position: fixed; top:0; bottom:0; left:0; right:0;' +
          'z-index: 9990; ' +
          'background-color: rgba(0, 0, 0, 0.3);';
      closer.addEventListener('click', function() {
          close();
      });
      document.addEventListener('keydown', documentEscListener);
  
      contentElement.addEventListener('click', function (e) {
          e.stopPropagation();
      });
  
      closer.appendChild(contentElement);
      document.body.appendChild(closer);
      editor.blur();
      return {
          close: close
      };
  };
  
  });
  
  ace.define("ace/ext/menu_tools/get_editor_keyboard_shortcuts",[], function(require, exports, module) {
  "use strict";
  var keys = require("../../lib/keys");
  module.exports.getEditorKeybordShortcuts = function(editor) {
      var KEY_MODS = keys.KEY_MODS;
      var keybindings = [];
      var commandMap = {};
      editor.keyBinding.$handlers.forEach(function(handler) {
          var ckb = handler.commandKeyBinding;
          for (var i in ckb) {
              var key = i.replace(/(^|-)\w/g, function(x) { return x.toUpperCase(); });
              var commands = ckb[i];
              if (!Array.isArray(commands))
                  commands = [commands];
              commands.forEach(function(command) {
                  if (typeof command != "string")
                      command  = command.name;
                  if (commandMap[command]) {
                      commandMap[command].key += "|" + key;
                  } else {
                      commandMap[command] = {key: key, command: command};
                      keybindings.push(commandMap[command]);
                  }         
              });
          }
      });
      return keybindings;
  };
  
  });
  
  ace.define("ace/ext/keybinding_menu",[], function(require, exports, module) {
      "use strict";
      var Editor = require("../editor").Editor;
      function showKeyboardShortcuts (editor) {
          if(!document.getElementById('kbshortcutmenu')) {
              var overlayPage = require('./menu_tools/overlay_page').overlayPage;
              var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts;
              var kb = getEditorKeybordShortcuts(editor);
              var el = document.createElement('div');
              var commands = kb.reduce(function(previous, current) {
                  return previous + '<div class="ace_optionsMenuEntry"><span class="ace_optionsMenuCommand">' 
                      + current.command + '</span> : '
                      + '<span class="ace_optionsMenuKey">' + current.key + '</span></div>';
              }, '');
  
              el.id = 'kbshortcutmenu';
              el.innerHTML = '<h1>Keyboard Shortcuts</h1>' + commands + '</div>';
              overlayPage(editor, el);
          }
      }
      module.exports.init = function(editor) {
          Editor.prototype.showKeyboardShortcuts = function() {
              showKeyboardShortcuts(this);
          };
          editor.commands.addCommands([{
              name: "showKeyboardShortcuts",
              bindKey: {win: "Ctrl-Alt-h", mac: "Command-Alt-h"},
              exec: function(editor, line) {
                  editor.showKeyboardShortcuts();
              }
          }]);
      };
  
  });
                  (function() {
                      ace.require(["ace/ext/keybinding_menu"], function(m) {
                          if (typeof module == "object" && typeof exports == "object" && module) {
                              module.exports = m;
                          }
                      });
                  })();
              