rdb 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +3 -0
- data/Gemfile +3 -0
- data/LICENSE +21 -0
- data/README.md +9 -0
- data/Rakefile +93 -0
- data/TODO.txt +44 -0
- data/bin/rdb +8 -0
- data/lib/rdb.rb +5 -0
- data/lib/rdb/attach.rb +10 -0
- data/lib/rdb/debugger.rb +297 -0
- data/lib/rdb/inspector.rb +42 -0
- data/lib/rdb/messaging.rb +287 -0
- data/lib/rdb/version.rb +3 -0
- data/lib/rdb/web/public/css/editor.css +29 -0
- data/lib/rdb/web/public/css/lato.css +16 -0
- data/lib/rdb/web/public/css/ng-table.min.css +3 -0
- data/lib/rdb/web/public/css/style.css +156 -0
- data/lib/rdb/web/public/font/Lato.woff2 +0 -0
- data/lib/rdb/web/public/img/breakpoint-light.png +0 -0
- data/lib/rdb/web/public/img/breakpoint-live-command-light.png +0 -0
- data/lib/rdb/web/public/img/breakpoint-live-command.png +0 -0
- data/lib/rdb/web/public/img/breakpoint.png +0 -0
- data/lib/rdb/web/public/img/favicon.ico +0 -0
- data/lib/rdb/web/public/img/favicon.png +0 -0
- data/lib/rdb/web/public/img/live-command.png +0 -0
- data/lib/rdb/web/public/img/settings.png +0 -0
- data/lib/rdb/web/public/js/ace/ace.js +11 -0
- data/lib/rdb/web/public/js/ace/ext-beautify.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-chromevox.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-elastic_tabstops_lite.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-emmet.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-error_marker.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-keybinding_menu.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-language_tools.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-linking.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-modelist.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-old_ie.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-searchbox.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-settings_menu.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-spellcheck.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-split.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-static_highlight.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-statusbar.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-textarea.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-themelist.js +5 -0
- data/lib/rdb/web/public/js/ace/ext-whitespace.js +5 -0
- data/lib/rdb/web/public/js/ace/keybinding-emacs.js +1 -0
- data/lib/rdb/web/public/js/ace/keybinding-vim.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-abap.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-actionscript.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-ada.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-apache_conf.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-applescript.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-asciidoc.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-assembly_x86.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-autohotkey.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-batchfile.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-c9search.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-c_cpp.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-cirru.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-clojure.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-cobol.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-coffee.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-coldfusion.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-csharp.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-css.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-curly.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-d.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-dart.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-diff.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-django.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-dockerfile.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-dot.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-eiffel.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-ejs.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-erlang.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-forth.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-ftl.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-gcode.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-gherkin.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-gitignore.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-glsl.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-golang.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-groovy.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-haml.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-handlebars.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-haskell.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-haxe.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-html.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-html_ruby.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-ini.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-jack.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-jade.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-java.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-javascript.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-json.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-jsoniq.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-jsp.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-jsx.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-julia.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-latex.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-less.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-liquid.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-lisp.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-livescript.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-logiql.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-lsl.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-lua.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-luapage.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-lucene.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-makefile.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-markdown.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-matlab.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-mel.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-mushcode.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-mysql.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-nix.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-objectivec.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-ocaml.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-pascal.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-perl.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-pgsql.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-php.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-plain_text.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-powershell.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-praat.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-prolog.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-properties.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-protobuf.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-python.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-r.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-rdoc.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-rhtml.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-ruby.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-rust.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-sass.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-scad.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-scala.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-scheme.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-scss.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-sh.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-sjs.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-smarty.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-snippets.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-soy_template.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-space.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-sql.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-stylus.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-svg.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-tcl.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-tex.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-text.js +0 -0
- data/lib/rdb/web/public/js/ace/mode-textile.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-toml.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-twig.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-typescript.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-vala.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-vbscript.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-velocity.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-verilog.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-vhdl.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-xml.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-xquery.js +1 -0
- data/lib/rdb/web/public/js/ace/mode-yaml.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/abap.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/actionscript.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/ada.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/apache_conf.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/applescript.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/asciidoc.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/assembly_x86.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/autohotkey.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/batchfile.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/c9search.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/c_cpp.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/cirru.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/clojure.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/cobol.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/coffee.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/coldfusion.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/csharp.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/css.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/curly.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/d.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/dart.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/diff.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/django.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/dockerfile.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/dot.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/eiffel.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/ejs.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/erlang.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/forth.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/ftl.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/gcode.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/gherkin.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/gitignore.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/glsl.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/golang.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/groovy.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/haml.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/handlebars.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/haskell.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/haxe.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/html.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/html_ruby.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/ini.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/jack.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/jade.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/java.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/javascript.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/json.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/jsoniq.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/jsp.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/jsx.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/julia.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/latex.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/less.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/liquid.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/lisp.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/livescript.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/logiql.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/lsl.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/lua.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/luapage.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/lucene.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/makefile.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/markdown.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/matlab.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/mel.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/mushcode.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/mysql.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/nix.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/objectivec.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/ocaml.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/pascal.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/perl.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/pgsql.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/php.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/plain_text.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/powershell.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/praat.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/prolog.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/properties.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/protobuf.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/python.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/r.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/rdoc.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/rhtml.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/ruby.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/rust.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/sass.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/scad.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/scala.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/scheme.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/scss.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/sh.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/sjs.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/smarty.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/snippets.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/soy_template.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/space.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/sql.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/stylus.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/svg.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/tcl.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/tex.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/text.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/textile.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/toml.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/twig.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/typescript.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/vala.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/vbscript.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/velocity.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/verilog.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/vhdl.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/xml.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/xquery.js +1 -0
- data/lib/rdb/web/public/js/ace/snippets/yaml.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-ambiance.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-chaos.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-chrome.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-clouds.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-clouds_midnight.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-cobalt.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-crimson_editor.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-dawn.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-dreamweaver.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-eclipse.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-github.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-idle_fingers.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-katzenmilch.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-kr.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-kr_theme.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-kuroir.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-merbivore.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-merbivore_soft.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-mono_industrial.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-monokai.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-pastel_on_dark.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-solarized_dark.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-solarized_light.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-terminal.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-textmate.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-tomorrow.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-tomorrow_night.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-tomorrow_night_blue.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-tomorrow_night_bright.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-tomorrow_night_eighties.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-twilight.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-vibrant_ink.js +1 -0
- data/lib/rdb/web/public/js/ace/theme-xcode.js +1 -0
- data/lib/rdb/web/public/js/ace/worker-coffee.js +1 -0
- data/lib/rdb/web/public/js/ace/worker-css.js +1 -0
- data/lib/rdb/web/public/js/ace/worker-html.js +1 -0
- data/lib/rdb/web/public/js/ace/worker-javascript.js +1 -0
- data/lib/rdb/web/public/js/ace/worker-json.js +1 -0
- data/lib/rdb/web/public/js/ace/worker-lua.js +1 -0
- data/lib/rdb/web/public/js/ace/worker-php.js +1 -0
- data/lib/rdb/web/public/js/ace/worker-xquery.js +1 -0
- data/lib/rdb/web/public/js/angular.min.js +202 -0
- data/lib/rdb/web/public/js/app.js +389 -0
- data/lib/rdb/web/public/js/ng-table.min.js +3 -0
- data/lib/rdb/web/server.rb +173 -0
- data/lib/rdb/web/views/index.erb +79 -0
- data/lib/web.rb +3 -0
- data/rdb.gemspec +26 -0
- data/test.rb +39 -0
- metadata +486 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'set'
|
2
|
+
|
3
|
+
class Inspector
|
4
|
+
def initialize
|
5
|
+
@seen_ids = Set.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.inspect(obj)
|
9
|
+
Inspector.new.inspect(obj)
|
10
|
+
end
|
11
|
+
|
12
|
+
def inspect(obj)
|
13
|
+
if !@seen_ids.add?(obj.object_id)
|
14
|
+
return "(circular reference)"
|
15
|
+
end
|
16
|
+
|
17
|
+
# Range, Regex, Block, Proc, lambda, Thread, Set, ...
|
18
|
+
case obj
|
19
|
+
when Class
|
20
|
+
return { class: obj.class.name, content: obj.name }
|
21
|
+
when Fixnum, Float, TrueClass, FalseClass, NilClass, String, Symbol
|
22
|
+
return { class: obj.class.name, content: obj }
|
23
|
+
when Array
|
24
|
+
return { class: obj.class.name, content: obj.map { |x| inspect(x) } }
|
25
|
+
when Hash
|
26
|
+
inspected = []
|
27
|
+
obj.each do |k, v|
|
28
|
+
inspected << [inspect(k), inspect(v)]
|
29
|
+
end
|
30
|
+
return { class: obj.class.name, content: inspected }
|
31
|
+
end
|
32
|
+
|
33
|
+
vars = Hash[obj.instance_variables.map { |var|
|
34
|
+
[var, inspect(obj.instance_variable_get(var))]
|
35
|
+
}]
|
36
|
+
|
37
|
+
return {
|
38
|
+
class: obj.class.name,
|
39
|
+
content: vars
|
40
|
+
}
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,287 @@
|
|
1
|
+
require 'cod'
|
2
|
+
require 'msgpack'
|
3
|
+
require 'thread'
|
4
|
+
require 'set'
|
5
|
+
|
6
|
+
module RemoteAnnotation
|
7
|
+
def self.extended(klass)
|
8
|
+
klass.instance_exec {
|
9
|
+
@remote = Set.new
|
10
|
+
@set_remote = false
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
def remote!
|
15
|
+
self.instance_exec {
|
16
|
+
@set_remote = true
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def method_added(method)
|
21
|
+
self.instance_exec {
|
22
|
+
return if !@set_remote
|
23
|
+
|
24
|
+
@remote << method
|
25
|
+
@set_remote = false
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def remote?(method)
|
30
|
+
self.instance_exec {
|
31
|
+
@remote.include? method
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module Messaging
|
37
|
+
end
|
38
|
+
|
39
|
+
class Messaging::Server
|
40
|
+
def self.inherited(klass)
|
41
|
+
klass.send(:extend, RemoteAnnotation)
|
42
|
+
end
|
43
|
+
|
44
|
+
def initialize
|
45
|
+
@sockets = Set.new
|
46
|
+
@clients = {}
|
47
|
+
@clients_lock = Mutex.new
|
48
|
+
end
|
49
|
+
|
50
|
+
def listen(host, port)
|
51
|
+
channel = Cod.tcp_server("#{host}:#{port}")
|
52
|
+
|
53
|
+
loop do
|
54
|
+
begin
|
55
|
+
payload, client = channel.get_ext
|
56
|
+
rescue Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNRESET
|
57
|
+
next
|
58
|
+
end
|
59
|
+
|
60
|
+
begin
|
61
|
+
message = Messaging::Message.unpack(payload)
|
62
|
+
# TODO: Hack.
|
63
|
+
socket = client.instance_eval { @connection.socket }
|
64
|
+
@clients_lock.synchronize {
|
65
|
+
if @sockets.add?(socket)
|
66
|
+
@clients[socket] = client
|
67
|
+
end
|
68
|
+
}
|
69
|
+
|
70
|
+
handle_message(client, message)
|
71
|
+
rescue => e
|
72
|
+
puts ">>> Error: #{e}\n#{e.backtrace}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def broadcast
|
78
|
+
@broadcast ||= Class.new do
|
79
|
+
def initialize(server)
|
80
|
+
@server = server
|
81
|
+
end
|
82
|
+
|
83
|
+
def method_missing(symbol, *args, &block)
|
84
|
+
@server.instance_exec {
|
85
|
+
broadcast_message(symbol.to_s, args)
|
86
|
+
}
|
87
|
+
end
|
88
|
+
end.new(self)
|
89
|
+
end
|
90
|
+
|
91
|
+
private
|
92
|
+
|
93
|
+
def broadcast_message(message, *params)
|
94
|
+
payload = Messaging::Message.broadcast(message, params.first || {})
|
95
|
+
@clients_lock.synchronize {
|
96
|
+
@clients.reject! { |socket, client|
|
97
|
+
begin
|
98
|
+
client.put(payload)
|
99
|
+
false
|
100
|
+
rescue IOError, Errno::ECONNRESET
|
101
|
+
@sockets.delete(socket)
|
102
|
+
true
|
103
|
+
end
|
104
|
+
}
|
105
|
+
}
|
106
|
+
end
|
107
|
+
|
108
|
+
def handle_message(client, message)
|
109
|
+
id = message[:id]
|
110
|
+
command = message[:command]
|
111
|
+
params = message[:params]
|
112
|
+
|
113
|
+
if !self.class.remote?(command)
|
114
|
+
raise RuntimeError, "Method is not marked for remote execution: #{command}."
|
115
|
+
end
|
116
|
+
|
117
|
+
result = if params.empty?
|
118
|
+
self.send(command)
|
119
|
+
else
|
120
|
+
self.send(command, params)
|
121
|
+
end
|
122
|
+
|
123
|
+
client.put(Messaging::Message.result(id, result))
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
class Messaging::Client
|
128
|
+
def self.inherited(klass)
|
129
|
+
klass.send(:extend, RemoteAnnotation)
|
130
|
+
end
|
131
|
+
|
132
|
+
def initialize
|
133
|
+
@connected = false
|
134
|
+
@connected_mon = Monitor.new
|
135
|
+
@connected_wait = @connected_mon.new_cond
|
136
|
+
|
137
|
+
@result_id = 0
|
138
|
+
@result = {}
|
139
|
+
@result_mon = {}
|
140
|
+
@result_wait = {}
|
141
|
+
end
|
142
|
+
|
143
|
+
def connect_listen(host, port)
|
144
|
+
@channel = Cod.tcp("#{host}:#{port}")
|
145
|
+
set_connected
|
146
|
+
|
147
|
+
loop do
|
148
|
+
process_message
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def method_missing(symbol, *args, &block)
|
153
|
+
send_message(symbol, args.first || {})
|
154
|
+
end
|
155
|
+
|
156
|
+
private
|
157
|
+
|
158
|
+
def send_message(command, params)
|
159
|
+
wait_connected
|
160
|
+
|
161
|
+
id = @result_id += 1
|
162
|
+
mon = @result_mon[id] ||= Monitor.new
|
163
|
+
wait = @result_wait[id] ||= mon.new_cond
|
164
|
+
|
165
|
+
payload = Messaging::Message.command(id, command, params)
|
166
|
+
@channel.put(payload)
|
167
|
+
|
168
|
+
mon.synchronize {
|
169
|
+
wait.wait
|
170
|
+
}
|
171
|
+
|
172
|
+
result = @result[id]
|
173
|
+
@result.delete(id)
|
174
|
+
@result_mon.delete(id)
|
175
|
+
@result_wait.delete(id)
|
176
|
+
|
177
|
+
return result
|
178
|
+
end
|
179
|
+
|
180
|
+
def wait_connected
|
181
|
+
if !@connected
|
182
|
+
@connected_mon.synchronize do
|
183
|
+
@connected_wait.wait_while { !@connected }
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def set_connected
|
189
|
+
@connected = true
|
190
|
+
@connected_mon.synchronize {
|
191
|
+
@connected_wait.signal
|
192
|
+
}
|
193
|
+
end
|
194
|
+
|
195
|
+
def process_message
|
196
|
+
begin
|
197
|
+
payload = @channel.get
|
198
|
+
obj = Messaging::Message.unpack(payload)
|
199
|
+
|
200
|
+
case obj[:type]
|
201
|
+
when :result
|
202
|
+
handle_result(obj)
|
203
|
+
when :broadcast
|
204
|
+
handle_broadcast(obj)
|
205
|
+
end
|
206
|
+
rescue => e
|
207
|
+
puts ">>> Error: #{e}\n#{e.backtrace}"
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def handle_result(message)
|
212
|
+
id = message[:id]
|
213
|
+
@result[id] = message[:result]
|
214
|
+
@result_mon[id].synchronize {
|
215
|
+
@result_wait[id].signal
|
216
|
+
}
|
217
|
+
end
|
218
|
+
|
219
|
+
def handle_broadcast(message)
|
220
|
+
method = message[:message]
|
221
|
+
params = message[:params]
|
222
|
+
|
223
|
+
if !self.class.remote?(method)
|
224
|
+
raise RuntimeError, "Method is not marked for remote execution: #{method}."
|
225
|
+
end
|
226
|
+
|
227
|
+
if params.empty?
|
228
|
+
self.send(method)
|
229
|
+
else
|
230
|
+
self.send(method, params)
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
class Messaging::Message
|
236
|
+
def self.command(id, command, params)
|
237
|
+
obj = {
|
238
|
+
type: :command,
|
239
|
+
id: id,
|
240
|
+
command: command,
|
241
|
+
params: params
|
242
|
+
}
|
243
|
+
|
244
|
+
MessagePack.pack(obj)
|
245
|
+
end
|
246
|
+
|
247
|
+
def self.result(id, result)
|
248
|
+
obj = {
|
249
|
+
type: :result,
|
250
|
+
id: id,
|
251
|
+
result: result
|
252
|
+
}
|
253
|
+
|
254
|
+
MessagePack.pack(obj)
|
255
|
+
end
|
256
|
+
|
257
|
+
def self.broadcast(message, params)
|
258
|
+
obj = {
|
259
|
+
type: :broadcast,
|
260
|
+
message: message,
|
261
|
+
params: params
|
262
|
+
}
|
263
|
+
|
264
|
+
MessagePack.pack(obj)
|
265
|
+
end
|
266
|
+
|
267
|
+
def self.unpack(payload)
|
268
|
+
obj = MessagePack.unpack(payload)
|
269
|
+
type = obj['type'].to_sym
|
270
|
+
|
271
|
+
id = obj['id']
|
272
|
+
|
273
|
+
params = nil
|
274
|
+
if obj['params']
|
275
|
+
params = Hash[obj['params'].map { |k, v| [k.to_sym, v] }]
|
276
|
+
end
|
277
|
+
|
278
|
+
case type
|
279
|
+
when :broadcast
|
280
|
+
{ type: type, message: obj['message'].to_sym, params: params }
|
281
|
+
when :result
|
282
|
+
{ type: type, id: id, result: obj['result'] }
|
283
|
+
when :command
|
284
|
+
{ type: type, id: id, command: obj['command'].to_sym, params: params }
|
285
|
+
end
|
286
|
+
end
|
287
|
+
end
|
data/lib/rdb/version.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
.ace_active-line {
|
2
|
+
background: inherit !important;
|
3
|
+
}
|
4
|
+
.ace_gutter-cell {
|
5
|
+
cursor: pointer;
|
6
|
+
}
|
7
|
+
.ace_gutter-cell.ace_breakpoint {
|
8
|
+
background: #faa url('/img/breakpoint.png') no-repeat 3px 2px;
|
9
|
+
}
|
10
|
+
.ace_gutter-cell.ace_breakpoint:hover {
|
11
|
+
background-color: #f77;
|
12
|
+
}
|
13
|
+
.ace_gutter-cell:not(.ace_breakpoint):hover {
|
14
|
+
background: #fdd url('/img/breakpoint-light.png') no-repeat 3px 2px;
|
15
|
+
}
|
16
|
+
.ace_gutter-cell.live-command:not(.ace_breakpoint):hover {
|
17
|
+
background: #ccc url('/img/breakpoint-live-command-light.png') no-repeat 3px 2px;
|
18
|
+
}
|
19
|
+
.ace_content .live-command {
|
20
|
+
position: absolute;
|
21
|
+
background: rgb(255, 251, 109);
|
22
|
+
outline: 1px solid rgb(235, 231, 089);
|
23
|
+
}
|
24
|
+
.ace_gutter-cell.live-command {
|
25
|
+
background: #ccc url('/img/live-command.png') no-repeat 3px 2px;
|
26
|
+
}
|
27
|
+
.ace_gutter-cell.live-command.ace_breakpoint {
|
28
|
+
background: #ccc url('/img/breakpoint-live-command.png') no-repeat 3px 2px;
|
29
|
+
}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
/* latin-ext */
|
2
|
+
@font-face {
|
3
|
+
font-family: 'Lato';
|
4
|
+
font-style: normal;
|
5
|
+
font-weight: 400;
|
6
|
+
src: local('Lato Regular'), local('Lato-Regular'), url(/font/Lato.woff2) format('woff2');
|
7
|
+
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
8
|
+
}
|
9
|
+
/* latin */
|
10
|
+
@font-face {
|
11
|
+
font-family: 'Lato';
|
12
|
+
font-style: normal;
|
13
|
+
font-weight: 400;
|
14
|
+
src: local('Lato Regular'), local('Lato-Regular'), url(/font/Lato.woff2) format('woff2');
|
15
|
+
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
|
16
|
+
}
|
@@ -0,0 +1,3 @@
|
|
1
|
+
/*! ngTable v0.3.2 by Vitalii Savchuk(esvit666@gmail.com) - https://github.com/esvit/ng-table - New BSD License */
|
2
|
+
|
3
|
+
.ng-table th{text-align:center;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ng-table th.sortable{cursor:pointer}.ng-table th.sortable div{padding-right:18px;position:relative}.ng-table th.sortable div:after,.ng-table th.sortable div:before{content:"";border-width:0 4px 4px;border-style:solid;border-color:#000 transparent;visibility:visible;right:8px;top:50%;position:absolute;opacity:.3;margin-top:-4px}.ng-table th.sortable div:before{margin-top:2px;border-bottom:0;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000}.ng-table th.sortable div:hover:after,.ng-table th.sortable div:hover:before{opacity:1;visibility:visible}.ng-table th.sortable.sort-desc,.ng-table th.sortable.sort-asc{background-color:rgba(141,192,219,.25);text-shadow:0 1px 1px rgba(255,255,255,.75)}.ng-table th.sortable.sort-desc div:after,.ng-table th.sortable.sort-asc div:after{margin-top:-2px}.ng-table th.sortable.sort-desc div:before,.ng-table th.sortable.sort-asc div:before{visibility:hidden}.ng-table th.sortable.sort-asc div:after,.ng-table th.sortable.sort-asc div:hover:after{visibility:visible;filter:alpha(opacity=60);-khtml-opacity:.6;-moz-opacity:.6;opacity:.6}.ng-table th.sortable.sort-desc div:after{border-bottom:0;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000;visibility:visible;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:alpha(opacity=60);-khtml-opacity:.6;-moz-opacity:.6;opacity:.6}.ng-table th.filter .input-filter{margin:0;display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.ng-table+.pagination{margin-top:0}@media only screen and (max-width:800px){.ng-table-responsive{border-bottom:1px solid #999}.ng-table-responsive tr{border-top:1px solid #999;border-left:1px solid #999;border-right:1px solid #999}.ng-table-responsive td:before{position:absolute;padding:8px;left:0;top:0;width:50%;white-space:nowrap;text-align:left;font-weight:700}.ng-table-responsive thead tr th{text-align:left}.ng-table-responsive thead tr.ng-table-filters th{padding:0}.ng-table-responsive thead tr.ng-table-filters th form>div{padding:8px}.ng-table-responsive td{border:0;border-bottom:1px solid #eee;position:relative;padding-left:50%;white-space:normal;text-align:left}.ng-table-responsive td:before{content:attr(data-title-text)}.ng-table-responsive,.ng-table-responsive thead,.ng-table-responsive tbody,.ng-table-responsive th,.ng-table-responsive td,.ng-table-responsive tr{display:block}}
|
@@ -0,0 +1,156 @@
|
|
1
|
+
body {
|
2
|
+
font: 14pt Lato;
|
3
|
+
background: #f7f7f7;
|
4
|
+
margin: 0;
|
5
|
+
padding: 0;
|
6
|
+
min-height: 100vh;
|
7
|
+
height: 100vh;
|
8
|
+
display: -webkit-flex;
|
9
|
+
display: flex;
|
10
|
+
}
|
11
|
+
.source-container, .expr-container {
|
12
|
+
display: -webkit-flex;
|
13
|
+
display: flex;
|
14
|
+
flex-flow: column;
|
15
|
+
-webkit-flex: 1;
|
16
|
+
flex: 1;
|
17
|
+
}
|
18
|
+
#source-editor, #expr-editor {
|
19
|
+
-webkit-flex: 1;
|
20
|
+
flex: 1;
|
21
|
+
margin: 0;
|
22
|
+
font: 11pt Consolas, Monaco, "Courier New", monospace;
|
23
|
+
border: 1px solid #eee;
|
24
|
+
}
|
25
|
+
.windows {
|
26
|
+
display: -webkit-flex;
|
27
|
+
display: flex;
|
28
|
+
flex-flow: column;
|
29
|
+
-webkit-flex: 1;
|
30
|
+
flex: 1;
|
31
|
+
}
|
32
|
+
.environment {
|
33
|
+
-webkit-flex: 1;
|
34
|
+
flex: 1;
|
35
|
+
overflow: auto;
|
36
|
+
font: 11pt Consolas, Monaco, "Courier New", monospace;
|
37
|
+
background: #fff;
|
38
|
+
border: 1px solid #eee;
|
39
|
+
}
|
40
|
+
.environment .table th {
|
41
|
+
text-align: left;
|
42
|
+
font-weight: normal;
|
43
|
+
}
|
44
|
+
.environment .table th, .environment .table td {
|
45
|
+
border-bottom: 1px solid #eee;
|
46
|
+
}
|
47
|
+
.toolbar {
|
48
|
+
display: -webkit-flex;
|
49
|
+
display: flex;
|
50
|
+
background: #cc342d;
|
51
|
+
font-size: 0;
|
52
|
+
}
|
53
|
+
.toolbar .commands {
|
54
|
+
-webkit-flex: 1;
|
55
|
+
flex: 1;
|
56
|
+
}
|
57
|
+
.toolbar .settings {
|
58
|
+
width: 18px;
|
59
|
+
height: 18px;
|
60
|
+
align-self: center;
|
61
|
+
margin-right: 10px;
|
62
|
+
opacity: 0.9;
|
63
|
+
}
|
64
|
+
.toolbar .settings:hover {
|
65
|
+
opacity: 1.0;
|
66
|
+
cursor: pointer;
|
67
|
+
}
|
68
|
+
a.btn {
|
69
|
+
text-decoration: none;
|
70
|
+
}
|
71
|
+
.toolbar a.btn {
|
72
|
+
font-size: 12pt;
|
73
|
+
color: white;
|
74
|
+
margin: 0;
|
75
|
+
padding: 9px 10px 12px 10px;
|
76
|
+
display: inline-block;
|
77
|
+
width: 80px;
|
78
|
+
text-align: center;
|
79
|
+
vertical-align: middle;
|
80
|
+
}
|
81
|
+
.toolbar a.btn:hover {
|
82
|
+
background: #9b1c16;
|
83
|
+
}
|
84
|
+
.content-container {
|
85
|
+
display: -webkit-flex;
|
86
|
+
display: flex;
|
87
|
+
flex-flow: row;
|
88
|
+
overflow-x: hidden;
|
89
|
+
-webkit-flex: 1;
|
90
|
+
flex: 1;
|
91
|
+
}
|
92
|
+
.sidebar {
|
93
|
+
-webkit-flex: 0 0 200px;
|
94
|
+
flex: 0 0 200px;
|
95
|
+
padding-top: 20px;
|
96
|
+
}
|
97
|
+
.sidebar .group {
|
98
|
+
margin-bottom: 20px;
|
99
|
+
}
|
100
|
+
.sidebar .group h3 {
|
101
|
+
margin: 0;
|
102
|
+
padding: 3px 10px 6px 10px;
|
103
|
+
background: #eee;
|
104
|
+
font-size: 13pt;
|
105
|
+
font-weight: normal;
|
106
|
+
}
|
107
|
+
.sidebar .group .stat {
|
108
|
+
float: right;
|
109
|
+
font-size: smaller;
|
110
|
+
margin-top: 2px;
|
111
|
+
margin-right: 5px;
|
112
|
+
}
|
113
|
+
.sidebar ul {
|
114
|
+
list-style-type: none;
|
115
|
+
margin: 0;
|
116
|
+
padding: 0;
|
117
|
+
}
|
118
|
+
.sidebar ul .nav {
|
119
|
+
color: #333;
|
120
|
+
padding: 5px 10px;
|
121
|
+
text-decoration: none;
|
122
|
+
cursor: pointer;
|
123
|
+
display: block;
|
124
|
+
}
|
125
|
+
.sidebar ul .nav:hover {
|
126
|
+
background: #cc342d;
|
127
|
+
color: #fff;
|
128
|
+
}
|
129
|
+
.sidebar ul.threads, .sidebar ul.frames {
|
130
|
+
font-size: 12pt;
|
131
|
+
}
|
132
|
+
.frame .method {
|
133
|
+
display: block;
|
134
|
+
}
|
135
|
+
.frame .location {
|
136
|
+
color: #888;
|
137
|
+
font-size: smaller;
|
138
|
+
text-decoration: none;
|
139
|
+
}
|
140
|
+
.frame .nav:hover a.location {
|
141
|
+
color: #fff;
|
142
|
+
}
|
143
|
+
.frame a.location:hover {
|
144
|
+
text-decoration: underline;
|
145
|
+
}
|
146
|
+
.sidebar .active {
|
147
|
+
background: #ddd;
|
148
|
+
}
|
149
|
+
.main-container {
|
150
|
+
display: -webkit-flex;
|
151
|
+
display: flex;
|
152
|
+
flex-flow: column;
|
153
|
+
min-height: 100%;
|
154
|
+
-webkit-flex: 1;
|
155
|
+
flex: 1;
|
156
|
+
}
|